Beruflich Dokumente
Kultur Dokumente
close all;
% Oeffne bild (bildgroesse sollte zweierpotenz sein)
% Phantombild
imagesize = 256;
img_nonoise = phantom(imagesize)*255;
% Weisses Quadrat auf scharzem Hintergrund
% img_nonoise = zeros(imagesize);
% img_nonoise(2:imagesize/4,4:imagesize/4) = 255;
% Natuerliche Bilder
img_nonoise = double(imread('cameraman.png'));
img_nonoise = imresize(img_nonoise, [imagesize, imagesize], 'bilinear');
% Oder: cameraman.png, lena.png...
% Eigene Bilder (von Handy, Digicam etc. ausprobieren!)
% addiere gegebenenfalls rauschen
noise = randn(imagesize, imagesize) * 20;
img = img_nonoise + noise;
% berechne den mittleren quadratischen fehler zwischen original und dem
% verrauschten bild
mse_noisy = mean((img_nonoise(:) - img(:)).^2)
clim = [0, 255];
figure;
subplot(2,2,1);
imagesc(img,clim);
title('Original');
colormap gray;
axis image;
%----------------------------% DWT mit beliebigem Wavelet
%----------------------------% possible names are:
% Daubechies: 'db1' or 'haar', 'db2', ..., 'db45'
% Coiflets: 'coif1', ..., 'coif5'
% Symlets: 'sym2', ..., 'sym45'
% discrete Meyer wavelet: 'dmey'
wavelet = 'db2';
% erzeuge hoch- und tiefpassfilter fuer analyse und synthese mit wfilters
% oder setzte die filter selbst
[lp,hp,rlp,rhp] = wfilters(wavelet);
% berechne 2d-Wavelettransformation des bildes
[approx, detailH, detailV, detailD] = mydwt2(img, lp, hp);
% waveletcoeffs = mra2D(img, 3, lp, hp);
%
%
%
%
%
% |-------------------|
waveletcoeffs = [approx detailH; detailV detailD];
subplot(2,2,2);
imagesc(waveletcoeffs);
title('Wavelet-Koeffizienten')
colormap gray;
axis image;
% berechne inverse 2d-Wavelettransformation
recon = myidwt2(approx, detailH, detailV, detailD, rlp, rhp);
% recon = mrs2D(waveletcoeffs, 3, rlp, rhp);
subplot(2,2,3)
imagesc(recon,clim);
title('Rekonstruktion')
colormap gray;
axis image;
subplot(2,2,4)
imagesc(recon-img);
title('Differenz zum Original')
colormap gray;
axis image;
%----------------------------% 2D Entrauschung
%----------------------------% berechne peak signal to noise ratio in db
psnr_noisy = 10*log10(((max(img(:)))^2)/(mse_noisy));
figure;
subplot(2,2,1);
imagesc(img,clim);
title(['Original, psnr = ' num2str(psnr_noisy)]);
colormap gray;
axis image;
% anzahl zerlegungslevel
ndec = 3;
% gewichtung des thresholds - je groesser desto staerker wird entrauscht
thrweight = 0.5;
% thresholding mode: 0 - hard, 1 - soft thresholding
thrmode = 1;
% denoising mit globalem Threshold
% global (la=0) or level adaptive (la=1) threshold
la = 1;
denoised_UT = denoise_UT(img, wavelet, ndec, thrweight, thrmode, la);
% berechne den mittleren quadratischen fehler zwischen original und dem
% entrauschten bild
mse_UT = mean((img(:) - denoised_UT(:)).^2);
% berechne peak signal to noise ratio in db
psnr_UT = 10*log10(((max(img(:)))^2)/(mse_UT));
subplot(2,2,2);
imagesc(denoised_UT,clim);
colormap gray;
axis image;
mask(x_cur,y_cur) = sqrt(2)*vprevi.*vcur;
% diagonale details
% x-,y-bereiche in denen diagonale details in waveletcoeffs stehen
% prev - level l+1, cur - level l
y_prev = y_mid_prev+1:y_mid_cur;
x_prev = x_mid_prev+1:x_mid_cur;
y_cur = y_mid_cur+1:coeffsize(2)/2^(i-1);
x_cur = x_mid_cur+1:coeffsize(1)/2^(i-1);
% hole koeffizineten des level l+1
dprev = waveletcoeffs(x_prev , y_prev);
dpreve = [dprev dprev(:,1); dprev(1,:) dprev(1,1)];
% interpolation auf feineres gitter
dprevi = INTERP2(dpreve);
% falten mit boxfilter
dprevi = conv2(dprevi, [0.25 0.25; 0.25 0.25], 'valid');
dcur = denoised(x_cur, y_cur);
% bilde produkt
mask(x_cur,y_cur) = sqrt(2)*dprevi.*dcur;
% berechnung des thresholds - verwende nun sigma.^2
threshold(1:coeffsize(1)/(2^(i-1)),1:coeffsize(2)/(2^(i-1))) = ...
sigma^2 * sqrt(2*log((size(signal,1)/(2^i))*(size(signal,2)/(2^i))));
end
% weighting with thrweight
threshold = threshold .* thrweight;
% setze threshold fuer bereich der approximations-koeffizienten auf 0
% auf approximation soll kein threshold angewendet werden!
threshold(1:end/2^maxlevel, 1:end/2^maxlevel) = 0;
% figure; imagesc(threshold); axis image;
% figure; imagesc(mask); colormap gray; axis image;
% wende threshold auf koeffizienten an
% entscheide zwischen hard- oder soft-thresholding
switch(thrmode)
case 0 % hard thresholding
% alle koeffizienten mit absolutbetrag der maske kleiner als threshold
% werden gleich 0 gesetzt
waveletcoeffs(abs(mask) < threshold) = 0;
case 1 % soft thresholding
% alle koeffizienten mit absolutbetrag der maske kleiner als threshold
% werden auf 0 gesetzt,
% alle darueber werden entsprechend des thresholds betragsmaessig
% verringert
waveletcoeffs(abs(mask) < threshold) = 0;
waveletcoeffs(abs(mask) > threshold) = sign(waveletcoeffs(abs(mask) > th
reshold)).*(abs(waveletcoeffs(abs(mask) > threshold))-threshold(abs(mask) > thre
shold));
end
% wavelet-synthese
denoisedimg = mrs2D(waveletcoeffs, maxlevel+1, rlp, rhp);
end
%-------------------------------------------------------------------------% 2D Multiresolutions-Analyse-Filterbank
%-------------------------------------------------------------------------function waveletcoeffs = mra2D(signal, ndec, lp, hp)
% initialisiere waveletkoeffizienten mit signal
% fuer ndec = 0 entspricht die wavelet-zerlegung dem signal selbst
waveletcoeffs = signal;
sizex = size(signal,1);
sizey = size(signal,2);
for i=1:ndec
% berechne dht2 fuer aktuelle approximation
% greife dazu auf die approximation in den waveletkoeffizienten zu
[approx, detailH, detailV, detailD] = mydwt2(waveletcoeffs(1:sizex,1:sizey),
lp, hp);
% ersetze die approximation des letzten zerlegungslevels durch die
% zerlegung
waveletcoeffs(1:sizex,1:sizey) = [approx, detailH; detailV, detailD];
% reduziere index-bereich auf die haelfte
sizex = sizex/2;
sizey = sizey/2;
end
end
%-------------------------------------------------------------------------% 2D Multiresolutions-Synthese-Filterbank
%-------------------------------------------------------------------------function recon = mrs2D(waveletcoeffs, ndec, rlp, rhp)
sizex = size(waveletcoeffs,1)/(2^ndec);
sizey = size(waveletcoeffs,2)/(2^ndec);
for i=ndec:-1:1
% berechne inverse haar-transformation
waveletcoeffs(1:2*sizex,1:2*sizey) = myidwt2(...
waveletcoeffs(1:sizex,1:sizey),...
waveletcoeffs(1:sizex,sizey+1:2*sizey), ...
waveletcoeffs(sizex+1:2*sizex,1:sizey), ...
waveletcoeffs(sizex+1:2*sizex,sizey+1:2*sizey), rlp, rhp);
% nach jeder iteration verdoppelt sich die anzahl von
% approximationskoeffizienten
sizex = sizex*2;
sizey = sizey*2;
end
% gib ergebnis zurueck
recon = waveletcoeffs;
end