Я изо всех сил пытаюсь найти ошибку в своем коде или рассуждениях; Мне нужно вручную создать фильтр высоких/низких частот для обработки изображения в частотной области. Мне не разрешено использовать масло (), фильтр () и другие связанные функции.
Конечный результат, к которому я стремлюсь, похож на то, что показано здесь: ссылка 1, ссылка2.
Для достижения этого результата я создал следующую функцию:
function out = hlow2(x,n,mask,u)
% x - input image
% n - mask size
% mask - user-defined mask
% u - user choice: 1 -> high-pass, anything else -> low-pass
a=size(x);
mask=padarray(mask,[floor((a(1)-n)/2) floor((a(2)-n)/2)],'replicate');
mask=padarray(mask,[1 1],'replicate','pre');
% i am padding the mask array in order to make it fit the image and have my
% circle filter attached to the "middle" of the frequency graph.
maskl=logical(mask);
maskh=~mask;
maskl=double(maskl);
maskh=double(maskh);
% here, i created the high and low pass masks from the user-defined mask.
x=fft2(x);
if u==1
HP=x.*maskh;
out=ifft(HP);
else
LP=x.*maskl;
out=ifft(LP);
end
end
Маска, которую я использую, представляет собой белый круг на черном фоне. Я использую его в следующем коде:
mask=imread('circle.png');
mask=double(mask)/255;
mask=mask(:,:,1);
boat_a=imread('boat.png');
boat_a2=double(boat_a)/255;
c1=hlow2(boat_a2,255,mask,1);
c2=hlow2(boat_a2,255,mask,2);
figure()
imshow(c1)
figure()
imshow(c2)
Конечный результат, однако, совершенно не то, что я ожидал! Я проверил графики частот изображений, и они кажутся хорошими, с круговым фильтром, размещенным там, где он должен быть, но выходные изображения совершенно неверны. Для фильтра верхних частот выходное изображение не изменяется. Для низких частот он полностью черный. Я пытался несколько раз переписать функцию и поиграть с тем, как я умножаю матрицы, но мой результат не изменится.
Я уверен, что что-то упускаю, но не могу найти что. Пожалуйста, помогите мне.