APÉNDICE B Programas y funciones de MATLAB® En éste Apéndice, se muestran los códigos para Matlab®, para llevar a cabo la simulación del método propuesto en ésta tesis. B.1 Función de los filtros de árbol doble para la implementación de la DTCWT(Real). function [lo, hi] = afb2D(x, af1, af2) if nargin < 3 af2 = af1; end % filter along columns [L, H] = afb2D_A(x, af1, 1); % filter along rows [lo, hi{1}] = afb2D_A(L, af2, 2); [hi{2}, hi{3}] = afb2D_A(H, af2, 2); B.2 Función de los coeficientes de los filtros de análisis. function [af, sf] = farras af = [ 0 -0.01122679215254 0 0.01122679215254 -0.08838834764832 0.08838834764832 0.08838834764832 0.08838834764832 0.69587998903400 -0.69587998903400 0.69587998903400 0.69587998903400 0.08838834764832 -0.08838834764832 -0.08838834764832 -0.08838834764832 0.01122679215254 0 0.01122679215254 0 ]; sf = af(end:-1:1, :); B.3 Función de los coeficientes de los filtros de síntesis. function [af, sf] = FSfarras af{1} = [ 143 APÉNDICE B 144 0 0 -0.08838834764832 -0.01122679215254 0.08838834764832 0.01122679215254 0.69587998903400 0.08838834764832 0.69587998903400 0.08838834764832 0.08838834764832 -0.69587998903400 -0.08838834764832 0.69587998903400 0.01122679215254 -0.08838834764832 0.01122679215254 -0.08838834764832 0 0 ]; sf{1} = af{1}(end:-1:1, :); af{2} = [ 0.01122679215254 0 0.01122679215254 0 -0.08838834764832 -0.08838834764832 0.08838834764832 -0.08838834764832 0.69587998903400 0.69587998903400 0.69587998903400 -0.69587998903400 0.08838834764832 0.08838834764832 -0.08838834764832 0.08838834764832 0 0.01122679215254 0 -0.01122679215254 ]; sf{2} = af{2}(end:-1:1, :); B.4 Función para realizar la implementación del Umbral Óptimo con la DWT. function y=Ti_DWT(x) [af, sf] = farras; w1 = dwt2D(x,1,af); W1=w1{1}{3}; sig2=(1/prod(size(x)))*sum(sum(abs(W1).^2)); Ti_1=(sqrt(2*log(prod(size(x)))*sig2)); y1 = idwt2D(w1,1,sf); J=4; w = dwt2D(y1,J,af); W2=w{4}{3}; T=sqrt(((2*log(prod(size(x))))/(prod(size(x))))*sum((sum((abs(W2).^2))))); % loop thru scales: for j = 2:J % loop thru subbands for s = 1:3 w{j}{s} = soft(w{j}{s},T); end end y = idwt2D(w,J,sf); APÉNDICE B 145 B.5 Función para realizar la implementación del Umbral Óptimo con la SWT. function y=Ti_SWT(x) W1 = swt2(x,1,'db4'); sig2=(1/prod(size(x)))*sum(sum(abs(W1(:,:,1)).^2)); Ti_1=(sqrt(2*log(prod(size(x)))*sig2)); SWTD1 = wthresh(W1,'s',Ti_1); y1=iswt2(SWTD1,'db4'); %W1b = iswt2(x,1,'db4'); J=3; W=swt2(y1,J,'db4'); T=sqrt(((2*log(prod(size(x))))/(prod(size(x))))*sum((sum((abs(W(:,:,1)).^2))))); SWTD = wthresh(W,'s',T); % Reconstruct the signal. y = iswt2(SWTD,'db4'); B.6 Función para realizar la implementación del Umbral Óptimo con la DTCWT(Real). function y = Ti_RCWT(x); [Faf, Fsf] = FSfarras; [af, sf] = dualfilt1; w1 = dualtree2D(x,1,Faf,af); W1=w1{1}{2}{3}; sig2=(1/prod(size(x)))*sum(sum(abs(W1).^2)); Ti_1=(sqrt(2*log(prod(size(x)))*sig2)); J1=1; for j = 1:J1; % loop thru subbands for s1 = 1:2 for s2 = 1:3 w1{j}{s1}{s2} = soft(w1{j}{s1}{s2},Ti_1); end end end y1 = idualtree2D(w1,J1,Fsf,sf); J = 4; % loop thru scales: w = dualtree2D(y1,J,Faf,af); W2=w{4}{2}{3}; T=sqrt(((2*log(prod(size(x))))/(prod(size(x))))*sum((sum((abs(W2).^2))))); for j = 2:J % loop thru subbands for s1 = 1:2 for s2 = 1:3 w{j}{s1}{s2} = soft(w{j}{s1}{s2},T); end APÉNDICE B 146 end end y = idualtree2D(w,J,Fsf,sf); B.7 Ejemplo que implementa los diferentes métodos analizados en ésta tesis con el algoritmo de umbral óptimo a la imagen de “Lenna”, realizando el cálculo de las medidas de desempeño. s1 = double(imread('Lenna2.tif')); s = s1(:,:,3); %load wbarb x = s + 20*randn(size(s)); y1 = wiener2(x,[5 5]); y2=Ti_DWT(x); y3=Ti_SWT(x); y4=Ti_RCWT(x); figure(1) clf imagesc(s) title('"Imagen Original"') colormap(gray) figure(2) imagesc(x) title('"Imagen con ruido"') colormap(gray) figure(3) imagesc(y1) title('"Imagen sin ruido" --Usando Filtrado Wiener--') colormap(gray) axis image figure(4) imagesc(y2) title('"Imagen sin ruido" --Usando DWT--') colormap(gray) axis image figure(5) imagesc(y3) title('"Imagen sin ruido" --SWT--') colormap(gray) axis image figure(6) imagesc(y4) title('"Imagen sin ruido" --Usando DT-CWT(Real)--') colormap(gray) axis image MSE_WIE_4=((1/prod(size(s))))*(sum(sum(((s-y1).^2)))); PSNR_WIE_4=20*(log10((256-1)/(sqrt(MSE_WIE_4)))); APÉNDICE B 147 MSE_DWT_4=((1/prod(size(s))))*(sum(sum(((s-y2).^2)))); PSNR_DWT_4=20*(log10((256-1)/(sqrt(MSE_DWT_4)))); MSE_SWT_4=((1/prod(size(s))))*(sum(sum(((s-y3).^2)))); PSNR_SWT_4=20*(log10((256-1)/(sqrt(MSE_SWT_4)))); MSE_RCWT_4=((1/prod(size(s))))*(sum(sum(((s-y4).^2)))); PSNR_RCWT_4=20*(log10((256-1)/(sqrt(MSE_RCWT_4)))); MSE_DCWT_4=((1/prod(size(s))))*(sum(sum(((s-y5).^2)))); PSNR_DCWT_4=20*(log10((256-1)/(sqrt(MSE_DCWT_4)))); MSE_T=[MSE_WIE_4 MSE_DWT_4 MSE_SWT_4 MSE_DCWT_4 MSE_RCWT_4]; PSNR_T=[PSNR_WIE_4 PSNR_DWT_4 PSNR_SWT_4 PSNR_DCWT_4 PSNR_RCWT_4]; B.8 Ejemplo con la función de Matlab® “wiener2” [MAT02], para llevar a cabo la reducción de ruido con filtrado Wiener a la imagen de “Lenna”. s1 = double(imread('Lenna2.tif')); s = s1(:,:,3); x = s + 20*randn(size(s)); y1 = wiener2(x,[5 5]); imagesc(y1) title('"Imagen sin ruido" --Usando Filtrado Wiener--') colormap(gray) axis image