Bildverarbeitungs-Algorithmus in MATLAB
Bin ich versucht zu implementieren einen Algorithmus in diesem Papier beschrieben werden:
Zersetzung von biospeckle Bilder in einem temporären spectral bands
Hier ist eine Erklärung des Algorithmus:
Verzeichneten wir eine Sequenz von
N
aufeinander speckle-Bilder mit einer sampling
Frequenzfs
. Auf diese Weise war es möglich zu beobachten, wie ein pixel
entwickelt sich durch dieN
Bilder. Dass die evolution behandelt werden kann, als eine Zeit
Serie und bearbeitet werden können in der folgenden Weise: Jedes signal
entsprechend der Entwicklung eines jeden pixels verwendet wurde als Eingang zu einem
bank von filtern. Die Intensitätswerte wurden bisher geteilt durch deren
zeitlichen Mittelwert zu minimieren lokalen Unterschiede in Reflexionsvermögen oder
Ausleuchtung des Objekts. Die maximale Frequenz
adäquat analysiert wird bestimmt durch das abtasttheorem und s die Hälfte
der sampling-Frequenzfs
. Letzteres wird durch die CCD-Kamera, die
Größe des Bildes, und den frame-grabber. Die bank von filtern
skizziert in Abb. 1.In unserem Fall zehn 5°, um Butterworth-Filter
verwendet wurden, aber diese Zahl kann variiert werden, entsprechend der erforderlichen
Diskriminierung. Die bank wurde umgesetzt, die in einem computer mit Hilfe von MATLAB
software. Wir entschieden uns für die Butter-worth-filter, zusätzlich zu seiner
Einfachheit, es ist maximal flach. Andere Filter, eine unendliche Impuls
Antwort, oder eine endliche Impulsantwort verwendet werden könnte.Durch diese
bank von filtern, zehn entsprechenden Signale der einzelnen filter jeweils
temporäre pixel evolution wurden, die als Ausgang. Mittlere Energie Eb
in jedem signal wurde dann berechnet:wo
pb(n)
ist die Intensität des gefilterten pixel in der N-TEN Bild
für filterb
geteilt durch den Mittelwert und dieN
ist die Gesamtzahl der
Bilder. Auf diese WeiseEn
Werte von Energie für jedes pixel erhalten wurden,
jeder der Saum Zugehörigkeit zu einer der Frequenzbänder in Fig. 1.Mit diesen Werten ist es möglich, zu bauen, die zehn Bilder des aktiven Objekts,
jeder von denen zeigt, wie viel Energie der time-varying speckle-es
ist in einem bestimmten Frequenzband. Falsche Farbzuweisung zu den grauen
Ebenen in die Ergebnisse würden helfen, in der Diskriminierung.
und hier ist mein MATLAB code-Basis auf, die :
for i=1:520
for j=1:368
ts = [];
for k=1:600
ts = [ts D{k}(i,j)]; %%% kth image pixel i,j --- ts is time series
end
ts = double(ts);
temp = mean(ts);
if (temp==0)
for l=1:10
filtImag1{l}(i,j)=0;
end
continue;
end
ts = ts-temp;
ts = ts/temp;
N = 5; % filter order
W = [0.0 0.10;0.10 0.20;0.20 0.30;0.30 0.40;0.40 0.50;0.50 0.60 ;0.60 0.70;0.70 0.80 ;0.80 0.90;0.90 1.0];
[B,A]=butter(N,0.10,'low');
ts_f(1,:) = filter(B,A,ts);
N1 = 5;
for ind = 2:9
Wn = W(ind,:);
[B,A] = butter(N1,Wn);
ts_f(ind,:) = filter(B,A,ts);
end
[B,A]=butter(N,0.90,'high');
ts_f(10,:) = filter(B,A,ts);
for ind=1:10
%Following Paper Suggestion
filtImag1{ind}(i,j) =sum(ts_f(ind,:).^2);
end
end
end
for i=1:10
figure,imshow(filtImag1{i});
colorbar
end
pre_max = max(filtImag1{1}(:));
for i=1:10
new_max = max(filtImag1{i}(:));
if (pre_max<new_max)
pre_max=max(filtImag1{i}(:));
end
end
new_max = pre_max;
pre_min = min(filtImag1{1}(:));
for i=1:10
new_min = min(filtImag1{i}(:));
if (pre_min>new_min)
pre_min = min(filtImag1{i}(:));
end
end
new_min = pre_min;
%normalize
for i=1:10
temp_imag = filtImag1{i}(:,:);
x=isnan(temp_imag);
temp_imag(x)=0;
t_max = max(max(temp_imag));
t_min = min(min(temp_imag));
temp_imag = (double(temp_imag-t_min)).*((double(new_max)-double(new_min))/double(t_max-t_min))+(double(new_min));
%median filter
%temp_imag = medfilt2(temp_imag);
imag_test2{i}(:,:) = temp_imag;
end
for i=1:10
figure,imshow(imag_test2{i});
colorbar
end
for i=1:10
A=imag_test2{i}(:,:);
B=A/max(max(A));
B=histeq(A);
figure,imshow(B);
colorbar
imag_test2{i}(:,:)=B;
end
aber ich bin nicht immer zu dem gleichen Ergebnis wie Papier. hat jemand eine Ahnung, warum? oder wo ich schief gelaufen?
BEARBEITEN
durch die Hilfe von @Amro und mit seinen code, den ich endup mit den folgenden Bildern:
hier ist mein Original-Bild von 72hrs, gekeimte Linsen (400 Bilder, mit 5 Frames pro Sekunde):
hier die Ergebnisse Bilder 10 andere band :
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein paar Frage, die ich erkennen kann:
wenn Sie teilen das signal durch seinen Mittelwert, die Sie brauchen, um zu überprüfen, dass es nicht null ist. Sonst wird das Ergebnis
NaN
.den Autoren (ich bin nach dieser Artikel) verwendet, eine bank von filtern mit Frequenz-Bänder, die über den gesamten Bereich bis zur Nyquist-Frequenz. Du tust die Hälfte, dass. Die normalisierten Frequenzen passieren Sie zu
butter
sollte gehen den ganzen Weg bis zu1
(entsprichtfs/2
)Bei der Berechnung der Energie jedes gefilterte signal, ich denke, Sie sollten nicht dividieren Sie durch seinen Mittelwert (haben Sie bereits berücksichtigt, dass vor). Anstatt einfach das zu tun:
E = sum(sig.^2);
für jede der gefilterten SignaleIn der letzten post-processing Schritt sollten Sie die Normierung auf den Bereich [0,1], und wenden Sie dann das median-filtering-Algorithmus
medfilt2
. Die Berechnung sieht nicht richtig, es sollte so etwas wie:EDIT:
Mit den oben genannten Punkten im Hinterkopf habe ich versucht, zu schreiben, die code in eine vektorisierte Weg. Da Sie nicht posten Beispiel für die Eingabe von Bildern, ich kann das nicht testen, wenn das Ergebnis ist wie erwartet... und ich bin nicht sicher, wie Sie zu interpretieren sind die letzten Bilder sowieso 🙂
(Ich habe das Bild von hier für das obige Ergebnis)
EDIT#2
Einige änderungen vorgenommen und vereinfacht den oben genannten code ein wenig. Dieses verringert Speicherbedarf. Zum Beispiel habe ich cell-array anstelle eines einzelnen mehrdimensionale matrix zu speichern. Das bedeutet, dass wir nicht reservieren, einen großen block zusammenhängenden Arbeitsspeichers. Ich habe auch wiederverwendet gleichen Variablen, anstatt die Einführung neuer, bei jedem Zwischenschritt...
single
Art stattdouble
...Dem Papier nicht erwähnt, Subtraktion des Mittelwertes der Zeitreihe, sind Sie sicher, dass das notwendig? Auch, Sie nur berechnen Sie die new_max und new_min einmal, aus dem letzten Bild.
if max(A(:)) > totalmax; totalmax = max(A(:)); end;
in der ersten Schleife. Als eine Seite Knoten,max(A(:))
sieht schöner und schneller sein soll alsmax(max(A))
.