matlab - 频域滤波

标签 matlab image-processing dft

我必须对频域中的图像应用预置滤波器。这是我正在遵循的过程。

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/

相关文章:

c - matlab for (递减) C语言

matlab - 矩阵子向量乘积的有效方法

matlab - 防止 MATLAB 打开池

arrays - 将特定元胞数组元素转换为数组

python - 如何在 python 中从 3D 图像中提取 paches?

c++ - 水泥效果-艺术效果

algorithm - Matlab 中的离散傅里叶变换 - 理论困惑

image-processing - 像 Photosynth 一样重建场景

image-processing - opencv dft仅适用于2的幂的图像尺寸

swift - 如何计算 DFT 中每个 bin 的能量?