我必须对频域中的图像应用预置滤波器。这是我正在遵循的过程。
1)通过补零将图像的NxN矩阵转换为2*Nx2*N矩阵
2) 通过将图像乘以 (-1)^(x+y) 使图像变换居中
3)计算图像矩阵的DFT
4) 创建尺寸为 2Nx2N 且中心位于坐标 (N,N) 的过滤器
5)图像矩阵与滤波器矩阵相乘
6)计算其逆DFT并提取结果的实部。
7) 通过乘以 (-1)^(x+y) 来分散结果
8)最后提取结果矩阵的左上NxN部分
我的代码如下:
% mask=[-1,0,1;-1,0,1;-1,0,1];
%read image
signal=imread('cman.pgm');
signal=double(signal);
% image has NxN dimensions
l=size(signal,1);
pad_signal=zeros(2*l,2*l);
pad_signal(1:l,1:l)=signal;
m=size(mask,1);
mask_f=zeros(2*l,2*l);
for i=-1:1
mask_f(l+i,l-1)=-1;
mask_f(l+i,l+1)=1;
end
x=1:2*l;
[x y]=meshgrid(x,x);
% Multiply each pixel f(x,y) with (-1)*(x+y)
pad_signal=pad_signal.*((-1).^(x+y));
mask_f=myDFT(mask_f);
%find the DFT of image
signal_dft=myDFT(pad_signal);
%multiply the filter with image
res=mask_f*signal_dft;
% find the inverse DFT of real values of result
res=real(myIDFT(res));
res=res.*((-1).^(x+y));
%extract the upper left NxN portion of the result
res=res(1:l,1:l);
imshow(uint8(res));
上面的方法来自一本图像处理书籍。我感到困惑的是,我应该使用 3x3 的窗口,因为 prewitt 过滤器是 3x3 的,还是我当前使用过滤器的方式正确? (即,将滤波器值放置在 2Nx2N 滤波器矩阵的中心并将所有其他索引值设置为 0)。 如果两者都不是,那么应该如何形成滤波器以与图像的 dft 相乘。
最佳答案
您当前将滤镜填充为与图像大小相同的方式基本上是正确的。我们经常宽松地谈论用长度为 3 的滤波器过滤长度为 M 的信号,但隐含的假设是我们将两者填充到长度 M,或者可能是长度 M+3-1。
您的方法的一些细节使事情变得复杂:
1) 乘以 (-1)^(x+y) 只是转换 DFT,并不需要。 (请参阅 Foundations of Signal Processing 表 3.7 “频率循环移位”了解一维情况。在该表示法中,您让 k_0 为 N/2,因此左列中的 W_N 项只是在 -1 和 1 之间切换。)/p>
2) 由于 Prewitt 滤波器仅具有 3x3 非零支持,因此您的输出大小只需为 N+2 x N+2。这里要记住的公式是 length(signal) + length(filter) - 1。
这是我的解决方法:
clear
x = im2double(imread('cameraman.tif'));
[M, N] = size(x);
h = [-1 0 1;
-1 0 1;
-1 0 1];
P = M + size(h,1) - 1;
Q = N + size(h,2) - 1;
xPadded = x;
xPadded(P, Q) = 0;
hPadded = h;
hPadded(P,Q) = 0;
hShifted = circshift(hPadded, [-1 -1]);
H = fft2(hShifted);
X = fft2(xPadded);
Y = H .* X;
y = ifft2(Y);
yCropped = y(1:M, 1:N);
imshow(yCropped,[]);
关于matlab - 频域滤波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29434739/