Я пытаюсь реализовать алгоритм, описанный в этой статье:
Разложение изображений биоспеклов на временные спектральные полосы
Вот объяснение алгоритма:
Мы записали последовательность из
N
последовательных спекл-изображения с выборкой частотаfs
. Таким образом можно было наблюдать, как пиксель развивается черезN
изображений. Эту эволюцию можно рассматривать как время серии и могут быть обработаны следующим образом: Каждый сигнал соответствующее эволюции каждого пикселя, использовалось в качестве входных данных для банка фильтров. Значения интенсивности предварительно были разделены на их временное среднее значение для минимизации локальных различий в отражательной способности или освещение объекта. Максимальная частота, которую можно адекватно проанализирован определяется теоремой выборки и s половина частоты дискретизацииfs
. Последний устанавливается ПЗС-камерой, размер изображения и фреймграббер. Банк фильтров есть 1.В нашем случае десять фильтров Баттерворта 5-го порядка были использованы, но это количество может варьироваться в соответствии с требуемым дискриминация. Банк был реализован на компьютере с помощью MATLAB. программное обеспечение. Мы выбрали фильтр Баттерворта, потому что, помимо его простота, она максимально плоская.Другие фильтры, бесконечный импульс ответ, или может быть использована конечная импульсная характеристика.
С помощью этого банк фильтров, десять соответствующих сигналов каждого фильтра каждого временная эволюция пикселей была получена в качестве выходных данных. Средняя энергия 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_maxnew_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 разных полос: