6、频率域滤波


1、基础

  • 卷积定理
    f(x,y)★h(h,y)\Leftrightarrow H(u,v)F(u,v)
    f(x,y)h(h,y) \Leftrightarrow H(u,v)*F(u,v)

  • 折叠误差补零

当处理DFT时,图像及其变换是周期的。在周期接近函数非零部分的持续周期时,对周期函数进行卷积会引起相邻周期的串扰。
这种称为 折叠误差 的串扰可通过补零方法来避免。

假设函数 f(x,y) 和 h(x,y) 的大小分别为 A x B 和 C x D。通过对 f 和 g 补零,构造两个大小均为 P x Q 的扩展函数。
按如下方式进行选择可以避免折叠误差:

P \ge A+C-1,\\Q \ge B+D-1

下面 paddedsize 的函数可以满足上面等式的 P 和 Q 的最小偶数值。

function PQ = paddedsize(AB, CD, PARAM)
if nargin == 1
    PQ = 2*AB;
elseif nargin == 2 && -ischar(CD)
    PQ = AB + CD - 1;
    PQ = 2 * ceil(PQ / 2);
elseif nargin == 2
    m = max(AB);
    P = 2^nextpow2(2*m);
    PQ = [P, P];
elseif (nargin == 3) && strcmp(PARAM, 'pwr2')
    m = max([AB CD]);
    P = 2^nextpow2(2*m);
    PQ = [P, P];
else
    error('Wrong number of inputs.')
end  

示例

[f, revertcalss] = tofloat(f);
sig = 10;
PQ = paddedsize(size(f));
Fp = fft2(f, PQ(1), PQ(2));
Hp = lpfilter('gaussian', PQ(1), PQ(2), 2*sig); %滤波器大小是未填充时的两倍
Gp = Hp .* Fp;
gp = ifft2(Gp);
gpc = gp(1:size(f, 1), 1:size(f, 2));
gpc = revertcalss(gpc);
imshow(gp)



2、DFT 滤波的基本步骤

1、使用函数 tofloat 把输入图像转换为浮点图像:

[f, revertclass] = tofloat(f);

2、使用函数 paddedsize 获得填充参数:

PQ = paddedsize(size(f));

3、得到有填充图像的傅里叶变换:

F = fft2(f, PQ(1), PQ(2));

4、生成一个大小为 PQ(1) * PQ(2) 的滤波器函数。如果它是居中的,使用前要令 H = ifftshift(H)。
5、使用滤波器乘以该变换:

G = H .* F;

6、获得G的IFFT:

g = ifft2(G);

7、将左上部的矩形修剪为原始大小:

g = g(1:size(f, 1), 1:size(f, 2));

8、需要时,将滤波后的图像转换为输入图像的类:

g = revertclass(g);
  • 用于频率域滤波的M函数
function g = dftfilt(f, H, classout)
[f, revertcalss] = tofloat(f);

F = fft2(f, size(H, 1), size(H, 2))
g = ifft2(H .* F);
g = g(1:size(f, 1), 1:size(f, 2));

if nargin == 2 || strcmp(classout, 'original')
    g = revertcalss(g);
elseif strcmp(classout, 'fltpoint')
    return
else
    error('Undefined class fot the output image.')
end



3、从空间滤波器获得频域滤波器

通常当滤波器较小时,在计算上空间滤波要比频率域滤波更有效率。
当滤波器大约有 32 个或更多元素时,使用 FFT 算法的滤波处理要比空间实现快。

函数 freqz2 可以将空间滤波器转换为频率域滤波器

H = freqz2(h, R, C)

示例

h = fspecial('sobel')'
freqz2(h)

% 频率域滤波器
PQ = paddedsize(size(f));
H = freqz2(h, PQ(1), PQ(2));
H1 = ifftshift(H)

函数 dftfilt 用于处理频率域滤波

gf = dftfilt(f, H1);



4、在频率域中直接生成滤波器

  • 创建用于实现频率域滤波器的网格数组
function [U, V] = dftuv(M, N)
u = single(0:(M - 1));
v = single(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);

% ----------------------- %
[U, V] = dftuv(8, 5);
DSQ = hypot(U, V)
  • 低通(平滑)频率域滤波器

    • 理想低通滤波器(ILPF)
      H(u, v)=\begin{cases} 1,D(u,v)\le D_0\\ 0,D(u,v)\gt D_0 \end{cases}

    • 巴特沃斯低通滤波器(BLPF)
      H(u,v)=\frac{1}{1+[D(u,v)/D_0]^{2n}}

    • 高斯低通滤波器
      H(u,v)=e^{-D^2(u,v)/2D^2_0}

示例,对图像 f 应用一个高斯低通滤波器,其中 D0 为所填充图像宽度的 5%。

[f, revertclass] = tofloat(f);
PQ = paddedsize(size(f));
[U, V] = dftuv(PQ(1), PQ(2));
D = hypot(U, V);
D0 = 0.05 * PQ(2);
F = fft2(f, PQ(1), PQ(2));
H = exp(-(D .^ 2) / (2 * (D0^2)));
g = dftfilt(f, H);
g = revertclass(g)
  • 低通滤波器整合函数
function H = lpfilter(type, M, N, D0, n)
[U, V] = dftuv(M, N);
D = hypot(U, V);

switch type
case 'ideal'
    H = single(D <= D0);
case 'btw'
    if nargin == 4
        n = 1;
    end
    H = 1 ./ (1 + (D./D0) .^ (2*n));
case 'gaussian'
    H = exp(-(D.^2) ./ (2*(D0^2)));
otherwise
    error('Unknown filter type.')
end



5、绘制线框图和表面图

绘制二维函数的最简单方法是使用函数 mesh

mesh(H(1:k:end, 1:k:end))

默认绘出彩色网格图命令为

colormap([0 0 0])

关闭网格和坐标轴命令

grid off
axis off

观察点由函数 view 控制

view(az, el) %az,el 代表方位角和仰角
view(3) %默认观察点

示例,绘制一个高斯低通滤波器

H = fftshift(test2('gaussian', 500, 500, 50));
mesh(double(H(1:10:500, 1:10:500)))
axis tight
colormap([0 0 0])
untitled.jpg
  • 表面图
surf(H)



6、高通(锐化)频率域滤波器

  • 理想高通滤波器(IHPF)
    H(u, v)=\begin{cases} 0,D(u,v)\le D_0\\ 1,D(u,v)\gt D_0\\ \end{cases}

  • 巴特沃斯高通滤波器(BHPF)
    H(u,v)=\frac{1}{1+[D_0/D(u,v)]^{2n}}

  • 高斯高通滤波器
    H(u,v)=1 - e^{-D^2(u,v)/2D^2_0}

基于 lpfilter 构建一个高通滤波器函数

function H = hpfilter(type, M, N, D0, n)
if nargin == 4
    n = 1;
end

H1p = lpfilter(type, M, N, D0, n);
H = 1 - H1p;

% ---------------------------% 
H = fftshift(hpfilter('ideal', 500, 500, 50));

高频强调滤波

高通滤波器偏离了直流项,将图像的平均值降低为0.补偿方法之一是给高通滤波器加上一个偏移量。把偏移量与将滤波器乘以一个大于1的常数结合起来的方法就称为 高频强调滤波。

H_{HFE}(u, v)=a + bH_{HP}(u, v)

示例,联合使用高频强调滤波和直方图均衡

PQ = paddedsize(size(f));
D0 = 0.05 * PQ(1);
HBW = hpfilter('btw', PQ(1), PQ(2), D0, 2);
H = 0.5 + 2*HBW;
gbw = dftfilt(f, HBW, 'fltpoint');
gbw = gscale(gbw);
ghf = dftfilt(f, H, 'fltpoint');
ghf = gscale(ghf);
ghe = histeq(ghf, 256);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容