高斯模糊实现(matlab)
高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换。N 维空间正态分布方程为
(1)
在二维空间定义为
(2)
其中 r 是模糊半径 ,指模板元素到模板中心的距离。σ 是正态分布的标准偏差,。在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。
1.使用给定高斯模板平滑图像
的实例高斯模糊矩阵:
0.00000067 | 0.00002292 | 0.00019117 | 0.00038771 | 0.00019117 | 0.00002292 | 0.00000067 |
0.00002292 | 0.00078633 | 0.00655965 | 0.01330373 | 0.00655965 | 0.00078633 | 0.00002292 |
0.00019117 | 0.00655965 | 0.05472157 | 0.11098164 | 0.05472157 | 0.00655965 | 0.00019117 |
0.00038771 | 0.01330373 | 0.11098164 | 0.22508352 | 0.11098164 | 0.01330373 | 0.00038771 |
0.00019117 | 0.00655965 | 0.05472157 | 0.11098164 | 0.05472157 | 0.00655965 | 0.00019117 |
0.00002292 | 0.00078633 | 0.00655965 | 0.01330373 | 0.00655965 | 0.00078633 | 0.00002292 |
0.00000067 | 0.00002292 | 0.00019117 | 0.00038771 | 0.00019117 | 0.00002292 | 0.00000067 |
用该矩阵进行高斯模糊的结果如下:
使用代码如下:
guass=[0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067;
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292;
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117;
0.00038771 0.01330373 0.11098164 0.22508352 0.11098164 0.01330373 0.00038771;
0.00019117 0.00655965 0.05472157 0.11098164 0.05472157 0.00655965 0.00019117;
0.00002292 0.00078633 0.00655965 0.01330373 0.00655965 0.00078633 0.00002292;
0.00000067 0.00002292 0.00019117 0.00038771 0.00019117 0.00002292 0.00000067];
TestImg=imread('Lena1.jpg');
FuzzyImg=conv2(TestImg,guass,'full');
subplot(121);
imshow(TestImg);
subplot(122);
imshow(FuzzyImg/256);
编程注意事项:
在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白图像了。
imshow(I/256); ----------将图像矩阵转化到0-1之间
imshow(I,[]); -----------自动调整数据的范围以便于显示 (不明白原理!)
2.二维高斯函数
理论上来讲,图像中每点的分布都不为零,这也就是说每个像素的计算都需要包含整幅图像。在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。通常,图像处理程序只需要计算 的矩阵就可以保证相关像素影响。对于边界上的点,通常采用复制周围的点到另一面再进行加权平均运算.
在实际应用中,如何根据theta的值生成高斯模糊矩阵是关键,高斯矩阵可根据公式(2),并进行归一化,归一化确保矩阵的值在[0,1]之间。
设sigma=0.435生成3*3的高斯模糊矩阵如下:
0.00388375415753104 0.0545522650921884 0.00388375415753104
0.0545522650921884 0.766255923001122 0.0545522650921884
0.00388375415753104 0.0545522650921884 0.00388375415753104
sigma=0.628,生成5*5的高斯模糊矩阵如下:
0.0000 0.0007 0.0025 0.0007 0.0000
0.0007 0.0319 0.1134 0.0319 0.0007
0.0025 0.1134 0.4029 0.1134 0.0025
0.0007 0.0319 0.1134 0.0319 0.0007
0.0000 0.0007 0.0025 0.0007 0.0000
设置sigma=2.5时,高斯模糊后的图像和原图对比:
3.改进的高斯模糊函数
使用上述二维高斯模糊矩阵进行滤波时,速度较慢。且当sigma变大时,高斯核和卷积的运算量将急速增加。
可以利用二维高斯函数的线性可分性,对其进行改进。除了圆形对称之外,高斯模糊也可以在二维图像上对两个独立的一维空间分别进行计算,这叫作线性可分。这也就是说,使用二维矩阵变换得到的效果也可以通过在水平方向进行一维高斯矩阵变换加上竖直方向的一维高斯矩阵变换得到。从计算的角度来看,这是一项有用的特性,因为这样只需要 次计算,而不可分的矩阵则需要 次计算,其中 , 是需要进行滤波的图像的维数,、 是滤波器的维数
而且,使用二次一维的高斯卷积可以消除二维高斯卷积产生的边缘。
Sigma=3.0;
%Sigma=0.435;
kernel=OneDimGuassKernel(Sigma);
TestImg=imread('Lena1.jpg');
[m,n]=size(TestImg);
FilterImgX=conv(TestImg(:),kernel,'same');
B=reshape(FilterImgX,m,n)';
imshow( B,[]);
matlab等高线命令 FilterImgXY=conv(B(:),kernel,'same');
FuzzyImg=reshape(FilterImgXY,n,m)';
subplot(121);
imshow(TestImg);
subplot(122);
imshow( FuzzyImg,[]);
经试验改进的高斯模糊函数运行时间为0.2448ms,改进前为0.1550ms。奇怪
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论