大家好,又见面了,我是你们的朋友全栈君。
文章目录
前言
卷积:函数空间域的卷积的傅里叶变换是函数傅里叶变换的乘积。对应地,频率域的卷积与空间域的乘积存在对应关系。
给定频率域滤波器,可对其进行傅里叶逆变换得到对应的空域滤波器;滤波在频域更为直观,但空域适合使用更小的滤波模板以提高滤波速度。因为相同尺寸下,频域滤波器效率高于空域滤波器,故空域滤波需要一个更小尺寸的模板近似得到需要的滤波结果。
一、空域滤波
将模板在图像中逐像素移动,将卷积核的每个元素分别和图像矩阵对应位置元素相乘并将结果累加,累加和作为
模板中心对应像素点的卷积结果。通俗的讲,卷积就是对整幅图像进行加权平均的过程,每一个像素点的值,都
由其本身和邻域内的其他像素值经过加权平均后得到。
二、频域滤波
频率域是由傅里叶变换和频率变量 (u,v)定义的空间,频域均匀滤波处理过程:先对图像进行傅里叶变换,转换至频率域,在频域使用滤波函数进行滤波,最后将结果反变换至空间域。即:
(1)计算原始图像f(x,y)的DFT,得到F(u,v)。
(2)创建均值滤波器,并使用fft2计算其DFT得到H(u,v)
(3)计算滤波器函数H(u,v)与F(u,v)的乘积G(u,v)。
(4)计算第(3)步计算结果的傅里叶反变换g(x,y)。
(5)取g(x,y)的实部作为最终滤波后的结果图像。
按照该步骤,在MATLAB中很容易编程实现频域滤波。滤波能否取得理想结果的关键取决于频域滤波函数H(u,v),常常称之为滤波器,或滤波器传递函数。因为它在滤波中抑制或滤除了频谱中某些频率的分量,而保留其他一些频率不受影响。
注意:空域的滤波器x转变的频域时用的函数是fft2(x,m,n),m*n是需要处理的图片大小。
三,matlab代码
t=imread('E:\matlab DMP\lenaG.bmp');
[m,n,z]=size(t);
y1=0+10*randn(m,n);%二维高斯分布矩阵 0是均值 20是标准差
y2=0+20*randn(m,n);%二维高斯分布矩阵 0是均值 20是标准差
y1=uint8(y1);
y2=uint8(y2);
%加上噪声
t1=t+y1;
t2=t+y2;
figure('name','添加高斯噪声');;
subplot(2,2,1),imshow(t),title('原图');
subplot(2,2,3),imshow(t1),title('加入均值为0,标准差为10的高斯噪声后');
subplot(2,2,4),imshow(t2),title('加入均值为0,标准差为20的高斯噪声后');
K1=conv2(fspecial('average',5),t2 )/255;
K2=conv2(fspecial('average',10),t2 )/255 ;
K3=conv2(fspecial('average',20),t2 )/255;
figure('name','空域均值滤波');
subplot(2,2,1),imshow(t2),title('原图');
subplot(2,2,2),imshow(K1),title('均值滤波,sizes 5x5');
subplot(2,2,3),imshow(K2),title('均值滤波,sizes 10x10');
subplot(2,2,4),imshow(K3),title('均值滤波,sizes 20x20');
Fc = fft2(t2);
h1 = fspecial('average',5);
h2 = fspecial('average',10);
h3 = fspecial('average',20);
H1 = fft2(h1,512,512);
H2 = fft2(h2,512,512);
H3 = fft2(h3,512,512);
G1 = H1.*Fc;
G2 = H2.*Fc;
G3 = H3.*Fc;
g1 = ifft2(G1);
g1 = im2uint8(mat2gray(abs(g1)));
g2 = ifft2(G2);
g2 = im2uint8(mat2gray(abs(g2)));
g3 = ifft2(G3);
g3 = im2uint8(mat2gray(abs(g3)));
figure('name','频域均值滤波');
subplot(2,2,1),imshow(t2),title('高斯噪声');
subplot(2,2,2),imshow(g1),title('高斯过滤,size 5*5');
subplot(2,2,3),imshow(g2),title('高斯过滤,size 10*10');
subplot(2,2,4),imshow(g3),title('高斯过滤,size 20*20');
Kk1 = medfilt2(t2,[3,3]);
Kk2 = medfilt2(t2,[5,5]);
Kk3 = medfilt2(t2,[7,7]);
figure('name','频域中值滤波');
subplot(2,2,1),imshow(t2),title('高斯噪声');
subplot(2,2,2),imshow(Kk1),title('高斯过滤,size 3*3');
subplot(2,2,3),imshow(Kk2),title('高斯过滤,size 5*5');
subplot(2,2,4),imshow(Kk3),title('高斯过滤,size 7*7');
结果
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150972.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...