我正在尝试实现本文中描述的算法:
下面是对算法的解释:
我们以采样频率记录了一系列
N
连续的散斑图像fs
。通过这种方式,可以观察像素如何通过N
图像演变。这种演变可以被视为一个时间序列,并且可以按以下方式处理:与每个像素的演变相对应的每个信号都被用作一组滤波器的输入。强度值之前除以它们的时间平均值,以最小化物体反射率或照明的局部差异。可以充分分析的最大频率由采样定理和采样频率的一半决定fs
。后者由 CCD 相机、图像大小和图像采集卡设置。滤波器组如图 1 所示。在我们的案例中,使用了 10 个 5° 阶巴特沃斯滤波器,但这个数字可以根据所需的区分而变化。该银行是在使用 MATLAB 软件的计算机中实现的。我们选择了 Butter-worth 滤波器,因为除了简单之外,它还具有最大的平坦度。可以使用其他滤波器、无限脉冲响应或有限脉冲响应。
通过这组滤波器,获得每个临时像素演化的每个滤波器的十个对应信号作为输出。然后计算每个信号中的平均能量 Eb:
其中
pb(n)
是第 n 个过滤器图像中过滤像素的强度b
除以其平均值,并且N
是图像总数。通过这种方式,En
获得了每个像素的能量值,每个下摆都属于图 1 中的一个频带。有了这些值,就可以构建十幅活动物体的图像,每幅图像都显示了在某个频带内有多少随时间变化的散斑能量。结果中灰度级的错误颜色分配将有助于区分。
这是我基于此的 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 个不同波段的结果图像: