WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Was macht dieser Code?!?!

 

Pheeenix
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2010, 18:44     Titel: Was macht dieser Code?!?!
  Antworten mit Zitat      
Hallo,

ich habe wiedermal ein kleines Verständnisproblem im Bezug auf einen Matlabcode.
hier kann man sich die Codes und ein Demobild zum testen herunterladen:
http://groups.csail.mit.edu/graphic.....re/DeconvolutionCode.html


Unter folgender Adresse findet man eine Beschreibung was der Matlabcode machen soll (Ab Punkt 3):
http://groups.csail.mit.edu/graphic.....rseDeconv-LevinEtAl07.pdf

Ich verstehe zwar was der Code machen soll, aber ich verstehe die Implementierung nicht so richtig. Im detail geht es um den code deconvL2.m und in weiterer folle um deconvSps.m
Ich wäre aber schon mehr als Zufrieden wenn ich wüsste was deconvL2.m macht.

Es geht um einen deconvolution Code der den Richard Lucy Algorithmus im Zeitbereich realisiert. ich habe schon mal einen Teildurchgesehen, verstehe aber das Zeug in der for schleife nicht ganz. Kann man da draus vielleicht eine Formel schreiben damit das ganze "lesbarer" wird für menschen die im code sowas nicht wirklich sehen?


Vielleicht kann mir hier ja jemand helfen.

Vielen Dank!!!



Code:

function [x]=deconvL2(I,filt1,we,max_it)
%note: size(filt1) is expected to be odd in both dimensions

if (~exist('max_it','var'))
   max_it=200;
end

[n,m]=size(I); %abmessungen des bildes


% get the size of filter/2
%rounds the elements of X to the nearest integers towards minus infinity.
hfs1_x1 = floor((size(filt1,2)-1)/2);
hfs1_y1 = floor((size(filt1,1)-1)/2);

%rounds the elements of X to the nearest integers towards infinity.
hfs1_x2 = ceil((size(filt1,2)-1)/2);
hfs1_y2 = ceil((size(filt1,1)-1)/2);

%array of help variables
shifts1 = [-hfs1_x1  hfs1_x2  -hfs1_y1  hfs1_y2];

%some more help vars
hfs_x1 = hfs1_x1;
hfs_x2 = hfs1_x2;
hfs_y1 = hfs1_y1;
hfs_y2 = hfs1_y2;

%Abmessungen werden "vergrößert" --> wegen randbereiche (je nach größe
%des Filters
m = m + hfs_x1 + hfs_x2;
n = n + hfs_y1 + hfs_y2;

N = m * n;  %gesamte Pixelanzahl

%setze die maske auf 1 (originale bildabmessungen)
mask = zeros(n,m);
mask(hfs_y1+1:n-hfs_y2,hfs_x1+1:m-hfs_x2) = 1;



tI = I; %temp bild
I = zeros(n,m); %'speicher' reservieren --> von 'größerem' bild
I(hfs_y1+1:n-hfs_y2,hfs_x1+1:m-hfs_x2) = tI; % bild ist jetzt wieder original
                                             % + nullen für randbereiche

                                             
%die eingefügent randbereiche(hier 7) erhalten die randwerte des originales
x = tI([ones(1,hfs_y1),1:end, end*ones(1,hfs_y2)],[ones(1,hfs_x1),1:end,end*ones(1,hfs_x2)]);

%faltung von x mit filt
b = conv2(x.*mask,filt1,'same');


%help vectors
dxf = [1 -1];
dyf = [1;-1];

% wenn filter über 25x25 ist dann mache eine conv, sonst eine fftconv
% PSF * (gestörtesBild * PSF180gedreht)                   * entspricht faltung
%Ax = Cf^T * Cf    .... Cf = PSF = filt1
if (max(size(filt1)<25))
  Ax = conv2(conv2(x,fliplr(flipud(filt1)),'same').*mask,  filt1,'same');
else
  Ax = fftconv(fftconv(x,fliplr(flipud(filt1)),'same').*mask,  filt1,'same');
end

%A = Cf^T * Cf + w sum(Cg^T * Cgk) .... dxf = Cg
%two time x and y
Ax = Ax + we*conv2(conv2(x,fliplr(flipud(dxf)),'valid'),dxf);
Ax = Ax + we*conv2(conv2(x,fliplr(flipud(dyf)),'valid'),dyf);

r = b - Ax;  %zero if ideal....für kleinste quadratische abweichung


for iter = 1:max_it  
    %multipliziee jede stelle mit jeder stelle
     rho = (r(:)'*r(:));  % komponentenweise Quadrat sum(r_ij.^2) über alle i, j

     if ( iter > 1 ),                      
        beta = rho / rho_1;
        p = r + beta*p;
     else
        p = r;                              
     end
     
     %fehler mit psf und um 180° gedrehte psf falten
     if (max(size(filt1)<25))
       Ap=conv2(conv2(p,fliplr(flipud(filt1)),'same').*mask,  filt1,'same');
     else  
       Ap=fftconv(fftconv(p,fliplr(flipud(filt1)),'same').*mask,  filt1,'same');
     end

     Ap=Ap+we*conv2(conv2(p,fliplr(flipud(dxf)),'valid'),dxf);
     Ap=Ap+we*conv2(conv2(p,fliplr(flipud(dyf)),'valid'),dyf);



     q = Ap;
     alpha = rho / (p(:)'*q(:) );
     x = x + alpha * p;                    % update approximation vector

     r = r - alpha*q;                      % compute residual

     rho_1 = rho;
end

x = x(hfs_y1+1:n-hfs_y2,hfs_x1+1:m-hfs_x2);



 
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.