我在MATLAB中读取图像'abc.jpg'
并将其数据类型转换为double。显示图像。
将图像的大小存储在M和N中.x,y,u和v的所有循环都会一直运行直到图像大小。
现在我想知道
1:如何将上述输入图像乘以(-1)^x+y
将变换居中到U = M/2 And V = N/2
。
2:将其与ideal HPF(High Pass Filter) with value of D=50.
相乘,其中D是理想HPF的半径尺寸。
与理想HPF相乘后,生成的图像将如下所示。
答案 0 :(得分:3)
理想的HPF是0-1滤波器,可将所有低于D
的频率降至零。
>> sz = size( a ); % size of image, assuming image is gray-level and not color
>> [u v] = meshgrid( .5 * linspace( -sz(1), sz(1), sz(1) ),...
.5 * linspace( -sz(2), sz(2), sz(2) ) ); % construct the grid for the freq domain
>> hpf = ifftshift( sqrt( u.^2 + v.^2 ) <= D ); % construct the filter
>> A = fft2( a );
>> fA = A.*hpf; % apply the filter in freq domain
>> fa = abs( ifft2( fA ) ); % back to image domain
答案 1 :(得分:3)
既然你放了赏金,我写了一个增强的回复。
我应该提一下,在计算你的fft之前你可能想考虑使用一个合适的窗口过滤器来避免边界伪影(我在下面的代码中包含了这个选项)。我希望它有所帮助。
以下是您的代码建议:
a=rgb2gray(imread('abc.jpg'))
D=50;
[x y i]=size(a);
生成汉宁窗口以抑制边界瑕疵:(可选)
hannx = hann(x); hanny = hann(y);
Hann = hannx * hanny';
计算加权图像的2D fft :(如果你不想要的话,删除。* Hann)
FreqDomain=fftshift(fft2(a.*Hann));
生成半径为D的圆盘形二进制掩码:
Mask = fspecial('disk',D)==0;
Mask = imresize(padarray(Mask, [floor((x/2)-D) floor((y/2)-D)], 1, 'both'), [x y]);
屏蔽频域图像:
MaskedFFT=FreqDomain.*Mask;
计算逆FFT:
Filtereda=ifft2(MaskedFFT, 'symmetric');
请注意,代码假定D
小于x/2
和y/2
答案 2 :(得分:1)
我不确定你究竟想要做什么,但似乎你正试图实现基于FFT的高通滤波器。
这就是我要继续下去的方式:
a=imread('abc.jpg')
FreqDomain=fftshift(fft(a));
(fftshift
使0频率成分居中)
然后将FreqDomain
裁剪为您喜欢的截止点,并将ifft
应用于裁剪后的图像。
答案 3 :(得分:1)
n1=rgb2gray(imread('fin.jpg')); imshow(n1); F=fft2(double(n1));
%计算图像大小
[M,N]=size(F);
%距离半径大小
D0=50; n=2; u=0:(M-1); v=0:(N-1); idx=find(u>M/2); u(idx)=u(idx)-M; idy=find(v>N/2); v(idy)=v(idy)-N; [V,U]=meshgrid(v,u);
使用距离公式的高通滤波器的距离计算
D=sqrt(U.^2+V.^2); H=double(D>D0); subplot(2,1,1); imshow(fftshift(H)); G=H.*F; g=real(ifft2(double(G))); [a,b]=size(g); for x=1:a for y=1:b sharpen_image(x,y)=(g(x,y))*(-1)^((x)+(y)); end end figure imshow(sharpen_image);
输出