このホワイトペーパーで説明されているアルゴリズムを実装しようとしています。
アルゴリズムの説明は次のとおりです。
N
サンプリング周波数で連続したスペックル画像のシーケンスを記録しましたfs
。このようにして、N
画像を通してピクセルがどのように進化するかを観察することができました。その進化は時系列として扱うことができ、次の方法で処理できます。すべてのピクセルの進化に対応する各信号がフィルターバンクへの入力として使用されました。強度値は、オブジェクトの反射率または照明の局所的な違いを最小限に抑えるために、以前は時間平均値で除算されていました。適切に分析できる最大周波数は、サンプリング定理とサンプリング周波数の半分によって決定されますfs
。後者は、CCDカメラ、画像のサイズ、およびフレームグラバーによって設定されます。フィルタのバンクの概要を図1に示します。
私たちの場合、10個の5°次のバターワースフィルターが使用されましたが、この数は必要な識別に応じて変えることができます。バンクは、MATLABソフトウェアを使用してコンピューターに実装されました。バターワースフィルターを選択したのは、その単純さに加えて、最大限にフラットであるためです。他のフィルター、無限インパルス応答、または有限インパルス応答を使用できます。
このフィルターバンクを使用して、各一時的なピクセル展開の各フィルターの10個の対応する信号が出力として取得されました。次に、各信号の平均エネルギーEbを計算しました。
ここ
pb(n)
で、はフィルターのn番目の画像のフィルター処理されたピクセルの強度をb
その平均値で割ったもので、N
は画像の総数です。このようにEn
して、各ピクセルのエネルギー値が取得されました。各裾は、図1の周波数帯域の1つに属しています。これらの値を使用して、アクティブオブジェクトの10個の画像を作成できます。各画像は、特定の周波数帯域にある時間変化するスペックルのエネルギー量を示します。結果のグレーレベルへの誤った色の割り当ては、識別に役立ちます。
これが私のMATLABコードベースです:
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
しかし、私は紙と同じ結果を得ていません。誰かが理由を知っていますか?または私が間違っているところは?
@Amro
の助けを借りて、彼のコードを使用して編集すると、次の画像が表示されます。これは、72時間発芽したレンズ豆の元の画像です(400枚の画像、毎秒5フレーム)。
これが10の異なるバンドの結果画像です: