Как применить фильтр Собела в частотной области [Matlab] - PullRequest
0 голосов
/ 04 апреля 2020

Как было предложено в заголовке, я бы sh применил фильтр sobel в области частот с использованием matlab. Основная проблема заключается в том, что размер матрицы фильтров sobel намного меньше исходного изображения. Есть ли способ, которым я мог бы применить фильтр, используя метод, который я использовал. Я бы предпочел не писать больше функций или длинных кодов.

global curr_freequency;
global trans_freequency;

og_img=getimage(handles.org_img);
[m,n]=size(og_img);

h=size(og_img,1);
w=size(og_img,2);
[x,y]=meshgrid(-floor(w/2):floor((w-1)/2),-floor(h/2):floor((h-1)/2));


allitems=handles.SharpFilters.String;
selectedindex=handles.SharpFilters.Value;
selectedItem=allitems{selectedindex};
filt_val=str2num(handles.SharpMaskSize.String);



if(selectedItem=="Butterworth High Pass")
    order=str2num(handles.order_of_filter.String);
    filt=1./(1.+(filt_val./(x.^2+y.^2).^0.5).^(2.*order));
    final_img=curr_freequency.*filt;
    trans_freequency=final_img;
    x=fftshow(final_img);
    axes(handles.intr_freeq);
    imshow(x);
    ifftshow(ifft2(final_img),handles);


elseif selectedItem=="Sobel Filter Vertical"
    sobelvert_filt=fspecial('sobel');
    freeq_filt=fft2(sobelvert_filt);
    applied_filt=curr_freequency.*freeq_filt;
    trans_freequency=applied_filt;
    axes(handles.intr_freeq);
    imshow(fftshow(applied_filt));
    ifftshow(ifft2(applied_filt),handles);

    axes(handles.intr_img);
    imshow(new_img);end;

функция fftshow

function ret_val = fftshow(f)
fl=log(1+abs(f));
fm=max(fl(:));
ret_val=im2uint8(fl/fm);

функция ifftshow

  function []=ifftshow(f,handles)
fl=abs(f);
fm=max(fl(:));
show_val=fl/fm;
axes(handles.spatial_rep);
imshow(show_val);

Просто мысль, которая я попытался реализовать, может быть, мой подход к этому неправильный, когда я сдвигаю средние значения в центр, что, если я применяю фильтр 3x3 к центральным значениям матрицы сдвига.

я пытался сделать padarray(sobelfilter,[floor((h/2)-3),floor((w/2)-3)]) однако это дает неправильные результаты, даже если я изменяю сокращения, то есть от -3 до 0 и т. д. c.

attempt to pad array

...