Home > PR > restaura_bloque.m

restaura_bloque

PURPOSE ^

function [sol]=restaura_bloque(observado,B,F,lambdas,criterio_lambda)

SYNOPSIS ^

function [sol,valorlambda]=restaura_bloque(observado,B,F,M,N,lambdas,criterio_lambda)

DESCRIPTION ^

 function [sol]=restaura_bloque(observado,B,F,lambdas,criterio_lambda)

   observado:   bloque
   B:           operador de blurring en Fourier
   F:           operador de regularizacion en Fourier
   lambdas:     vector con los valores de lambda
   criterio_lambda:  metodo para seleccionar el lambda

   Devuelve

   sol:         bloque restaurado

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 % function [sol]=restaura_bloque(observado,B,F,lambdas,criterio_lambda)
0002 %
0003 %   observado:   bloque
0004 %   B:           operador de blurring en Fourier
0005 %   F:           operador de regularizacion en Fourier
0006 %   lambdas:     vector con los valores de lambda
0007 %   criterio_lambda:  metodo para seleccionar el lambda
0008 %
0009 %   Devuelve
0010 %
0011 %   sol:         bloque restaurado
0012 
0013 
0014 function [sol,valorlambda]=restaura_bloque(observado,B,F,M,N,lambdas,criterio_lambda)
0015 
0016 M = size(observado,1);
0017 
0018 nlamb=length(lambdas);
0019 
0020 vectorsol = rand(nlamb*M,M);
0021 
0022 
0023 [dummy,varianzaruido] = wiener2(observado,[2 2]);      
0024 
0025 
0026 energB = sum(sum(abs(B).^2));
0027 
0028 Bconj = conj(B);
0029 
0030 BB = B.*Bconj; 
0031 
0032 
0033 %guardaF = fftshift(F);
0034 
0035 %F = abs(F)/max(max(abs(F)));
0036 
0037 operador = formatea_operador(F);
0038 
0039 F = operador;
0040 
0041 energF = sum(sum(abs(F).^2));
0042 
0043 % Hacemos que F tenga la misma energia que B
0044 
0045 F = sqrt(energB)*F/sqrt(energF);
0046 
0047 
0048 
0049 FF = F.*conj(F);
0050 
0051 %%%% SUAVIZADO DEL MARCO
0052 
0053 ang = linspace(0,pi/2,5);
0054 v = [reverse(cos(ang)) ones(1,M-2*5) cos(ang)];
0055 pesos = v'*v;
0056 
0057 observado = observado.*pesos + (1-pesos).*mean(mean(observado));
0058 
0059 
0060 %% FIN SUAVIZADO
0061 
0062 cub=fft2(observado);
0063 
0064 espdeg = cub;
0065 
0066 % Soluciones para cada lambda
0067 
0068 x=zeros(nlamb,1);
0069 y=zeros(nlamb,1); 
0070 
0071 
0072 for k=1:nlamb 
0073    
0074    lambda=lambdas(k);            
0075    
0076 
0077    Hinv=Bconj./( BB + lambda^2*FF);
0078    
0079      
0080    fftsol = Hinv.*cub;
0081 
0082 
0083 %   solu = real(ifft2(fftsol));
0084 %
0085 %   minimos = min(min(solu));
0086 %   maximos = max(max(solu));
0087 %
0088 %   minimoo = min(min(observado));
0089 %   maximoo = max(max(observado));
0090 %
0091 %   solu = (maximoo - minimoo)/(maximos-minimos)*(solu-minimos)+minimoo;
0092 %
0093 %   fftsol = fft2(solu);
0094 %
0095    
0096    
0097    
0098    
0099    %norma del residual
0100 
0101    rF = B.*fftsol - cub;
0102 
0103    x(k) = norm(rF(:))/M;
0104 
0105    
0106    %norma del operador sobre la solucion
0107    
0108    pF = F.*fftsol;
0109    
0110    y(k)=norm(pF(:))/M;
0111 
0112    %figure,colormap(gray);imshow(real(ifft2(fftsol)),[0 256],'notruesize');title(num2str([x(k) y(k)]));pause;close;
0113    
0114 end
0115 
0116 
0117 
0118 
0119 if (nlamb==1) 
0120    valorlambda=lambda;
0121 else
0122    valorlambda = seleccion_lambda(x,y,lambdas,varianzaruido,criterio_lambda);
0123 end
0124 
0125 
0126 
0127 distancias = abs(lambdas-valorlambda);
0128 pos = find(distancias==min(distancias));
0129 pos = pos(1);
0130 
0131 
0132 %figure,plot(x,y,'.-');hold on;plot(x(pos),y(pos),'r*');pause;close
0133 
0134 Hinv=Bconj./( BB + valorlambda^2*FF);
0135    
0136 
0137 %figure,mesh(abs(fftshift(Hinv))),pause(0.5),close
0138    
0139 sol=real(ifft2(Hinv.*cub));
0140 
0141 
0142

Generated on Wed 29-Nov-2006 16:19:19 by m2html © 2003