说明
对同态滤波、直方图均衡化、中值滤波、均值滤波、去模糊、二值形态学等基本的图像处理方法进行了讨论。
待处理图像
图一
图二
图三
图四
基本方法介绍
同态滤波
-
算法分析
同态滤波是把频率过滤和灰度变换结合起来的方法。同态滤波将灰度值分成照度和反射率两部分,照度为低频成分,反射率为高频成分。具体流程如下,先对原始对象进行取对数操作,再进行傅里叶变换,通过高斯同态滤波,再进行傅里叶逆变换,最后进行指数运算得到处理后的图像。 -
适用场景
同态滤波器一般用在光照不均引起的图像处理中,例如图像明暗对比过大,部分细节不清楚等情况中。对灰度范围进行调整,通过消除照明不均,增强暗区的图像细节,同时又不损失亮区的图像细节。 -
代码
I=imread('待处理的图片');
subplot(141),imshow(I);title('原图')
I=double(rgb2gray(I));
[M,N]=size(I);
rL0=0.6;
rH0=2.0;%可根据需要效果调整参数 相当于截取中间一段 削弱低频
rL1=0.3;rH1=2.5;rL2=0.8;rH2=1.8;
c=2;d0=10;%锐化参数
I1=log(I+1);%取对数
FI=fft2(I1);%傅里叶变换
n1=floor(M/2); n2=floor(N/2);%向量M、N作除法取整
for i=1:M
for j=1:N
D(i,j)=((i-n1).^2+(j-n2).^2);
H0(i,j)=(rH0-rL0).*(exp(c*(-D(i,j)./(d0^2))))+rL0; %高斯同态滤波
H1(i,j)=(rH1-rL1).*(exp(c*(-D(i,j)./(d0^2))))+rL1;
H2(i,j)=(rH2-rL2).*(exp(c*(-D(i,j)./(d0^2))))+rL2;
end
end
I20=ifft2(H0.*FI);%傅里叶逆变换
I21=ifft2(H1.*FI);
I22=ifft2(H2.*FI);
I30=real(exp(I20));%取指数
I31=real(exp(I21));I32=real(exp(I22));
subplot(143),imshow(I30,[]);title('同态滤波增强后0.6-2.0')
subplot(144),imshow(I31,[]);title('同态滤波增强后0.3-2.5')
subplot(142),imshow(I32,[]);title('同态滤波增强后0.8-1.8')
直方图均衡化
-
算法分析
直方图均衡化是一种利用灰度变换自动调节图像对比度的方法。先求出待处理图像的直方图,然后利用累计分布函数对待处理图像的直方图做变换,得到新的图像灰度,最后进行近似处理,将新灰度代替旧的,同时将灰度值相等或者相近的直方图合并。
所以,采用直方图均衡化是动态范围扩展,增强图像的对比度,灰度是“简并”的。采用直方图均衡化后的直方图图像较之前平坦。 -
代码
%选择图片
[FileName, FilePath]=uigetfile('*.tif;*.jpg;*.png;*.img;*.gif;*.bmp;','请选择图像数据');
str=[FilePath FileName];
Image=imread(str);%读取图片
Image=rgb2gray(Image);%灰度化处理
[M,N]=size(Image);%像素大小
Image=im2double(Image);%数据类型转换
%完成直方图均衡化
eq_image1=histeq(Image,8);
eq_image2=histeq(Image,64);
eq_image3=histeq(Image,256);
figure, % 在同一窗口显示直方图
subplot(2,4,1),imhist(Image);title('原图直方图');%默认灰度为256
subplot(2,4,2),imhist(eq_image1);title('灰度值 8');%显示直方图
subplot(2,4,3),imhist(eq_image2);title('灰度值 64');
subplot(2,4,4),imhist(eq_image3);title('灰度值 256');
subplot(2,4,5),imshow(Image);title('原图');
subplot(2,4,6),imshow(eq_image1);title('直方图均衡化');%显示处理后的图片
subplot(2,4,7),imshow(eq_image2);title('直方图均衡化');
subplot(2,4,8),imshow(eq_image3);title('直方图均衡化');
中值滤波&均值滤波
-
算法分析
图片消噪方法具体包括均值滤波器、中值滤波器以及低通滤波器。
均值滤波
均值滤波是一种线性滤波算法。具体操作如下,对目标像素给定一个模板,改模板包括其周围的像素,3×3的模型是以目标像素为中心周围的八个点,利用模板的全体像素的平均值来代替原像素。
均值滤波不能很好的保护图像细节,在给图像消噪的同时会使图像变得模糊。
中值滤波
中值滤波是一种非线性平滑技术。将以该点为中心的领域窗口内的所有像素点灰度值的中值取代原像素。可采用3×3、5×5等模板。
中值滤波对去除椒盐噪声十分有效,可以保护图像尖锐的边缘。
观察通过均值滤波处理后得到的图像,发现图像对比度不大,所以,进行直方图均衡化处理,得到更为清晰的图像。 -
代码
I=imread('待处理的图片');
D0=medfilt2(I,[3,3]);%3*3中值滤波
D1=medfilt2(I,[5,5]);
K=filter2(fspecial('average',3),I)/255;
subplot(141),imshow(I,[]);title('原图')
subplot(142),imshow(D0,[]);title('3*3中值滤波')
subplot(143),imshow(D1,[]);title('5*5中值滤波')
subplot(144),imshow(K,[]);title('均值滤波')
去模糊
- 算法分析
维纳滤波
维纳滤波是最小均方误差滤波器,是对平稳过程的最优估计。即该滤波器的输出与期望输出之间的均方误差最小,可用于提取被平稳噪声所污染的信号。若没有加性噪声,维纳滤波方法就让退化为逆滤波。
维纳滤波的传递函数
维纳滤波对高斯噪声、乘性噪声有明显的抑制作用,但容易失去边缘信息。维纳滤波适应面广,但算法复杂度高,处理效率不高。
在MATLAB中通过使用deconvwnr(I,PSF,NCORR,ICORR)函数来实现维纳滤波。I为退化图像;PSF为点扩散函数;NCORR和ICORR分别是信号和原图像的自相关函数。在函数deconvwnr(I,PSF,NSR)中,NSR为噪声信号功率比。
可约束最小二乘滤波
可约束最小二乘滤波器是采用最小化函数的二阶微分。建立以下约束约束条件为
F^是为退化图像的估计,N为加性噪声,拉普拉斯算子∇2为平滑程度。
推导可得到
在MATLAB中使用函数 deconvreg (I,PSF,NP,LRANGE,REGOP)实现可约束最小二乘滤波。LRANGE是函数优化过程中拉格朗日算子的范围,默认值为[1e-9,1e9];REGOP是约束优化中的规则化操作,默认值为Laplacian。
Lucy-Richardson
Lucy-Richardson方法采用优化技术和泊松统计准则,基于贝叶斯理论使产生图像的似然性达到最大值,是基于时域的方法。数学推导太过复杂,这里不加赘述。
deconvlucy(I,PSF,NUMIT,DAMPAR,WEIGHT,READOUT,SUBSMPL)是MATLAB中完成Lucy-Richardson滤波的函数。NUMIT为迭代次数,默认值为10;DAMPAR是原图像和恢复图像之间的偏差;WEIGHT为权重矩阵,规定坏像素为0,其余为1;READOUT是是与噪声和读出设备有关的参数,默认值为0;SUBSMPL是指二次抽样频率,默认值为1。Deconvlucy函数使用衰减因子DAMPAR来抑制噪声放大,这个参数指定了结果图像和原始图像的偏离阈值,限制恢复的图像与原始图像之间的差异,既抑制了噪声,又保留了图像细节,小于这个参数衰减进行,大于这个采纳数迭代被抑制。 - 代码
[FileName, FilePath]=uigetfile('*.tif;*.jpg;*.png;*.img;*.gif;','请选择需要图像数据');%选择测试图片
str=[FilePath FileName];
Ori_img = imread(str);
figure(1)
subplot(331);imshow(Ori_img);title('原始图像')
len = 8; theta = 10;%距离 角度
psf=fspecial('motion',len,theta)%运动模糊算子 以theta角度运动了len个像素
mohu = imfilter(Ori_img,psf,'conv','circular');%输入图像 滤波掩模 卷积 通过二维周期函数扩展
subplot(332);imshow(mohu);title('模糊后图片');
%维纳滤波
vw0 = deconvwnr(Ori_img ,psf,0.01);%退化的图像 点扩散函数 噪声信号功率比
subplot(334);imshow(vw0);title('维纳滤波 0.01');
vw1 = deconvwnr(Ori_img ,psf,0.001);
subplot(335);imshow(vw1);title('维纳滤波 0.001');
vw2 = deconvwnr(Ori_img ,psf,0.0001);
subplot(336);imshow(vw2);title('维纳滤波 0.0001');
%约束最小二乘滤波
Mini_img = deconvreg(Ori_img ,psf);
subplot(333);imshow(Mini_img);title('约束最小二乘滤波');
%Richardson-Lucy算法
Lucy_img_10 = deconvlucy(Ori_img ,psf,10); %迭代次数
subplot(337);imshow(Lucy_img_10);title('Richardson-Lucy 10');
Lucy_img_30 = deconvlucy(Ori_img ,psf,30);
subplot(338);imshow(Lucy_img_30);title('Richardson-Lucy 30');
Lucy_img_60 = deconvlucy(Ori_img ,psf,60);
subplot(339);imshow(Lucy_img_60);title('Richardson-Lucy 60');
二值形态学
- 算法分析
腐蚀和膨胀
膨胀在二值图像中是加长或者变粗操作。用结构元素B,扫描图像A的每一个像素,将结构元素与二值图像做操作,若结构像素内有空白的,则置结构像素中心为空白。膨胀用来扩展物体的边界点、增长特征区域、填补空洞等。在MATLAB中使用strel()与imdilate()函数结合使用。
腐蚀是对二值图像进行收缩或者细化。用结构元素B扫描图像A的每一个像素,若结构像素B内有黑点,则置结构像素中心为空白。腐蚀可以消物体的边界点、消除噪声以及打开物体之间的小连通。在MATLAB中使用strel()和imerode()函数。
孔洞填充
孔洞填充是以种子点为起点,采用膨胀算法对背景进行填充,膨胀到不能膨胀为止,最后将新得到的二值图像与原二值图像相加得到孔洞填充结果。用于形状的平滑以及噪声滤波,在MATLAB中使用imfill()命令进行孔洞填充。
开运算和闭运算
开运算是指先腐蚀再膨胀。可用来消除小物体、平滑较大物体的边界同时不明显改变其体积。作用与腐蚀相似,但与腐蚀相比,开运算可以基本保持目标原有大小不变的优点。在MATLAB中使用imopen()函数。
闭运算是指先膨胀再腐蚀。主要用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。在MATLAB中使用imclose()函数。
减运算
图像减运算是将两张相同大小的图片相减,最后留下不一样的部分,其余部分置为黑色。主要用来背景去除、检测移动目标、边缘检测等。在MATLAB中使用imsubtract()函数。
实验结果
关于图一
- 实验分析
- 对于对比度不明显且总体灰度相近的图片可采用对比度增强的方法,如同态滤波、直方图均衡化等方法。就此图而言,同态滤波较直方图均衡化更佳。采用同态滤波增强图片处理更为平滑,而且飞行器的细节也更加清楚;而直方图均衡化后的图片白的过白、黑的过黑,图像有些失真,但对背景的处理似乎是更好一些,地上有一些纹理的呈现更为细致;
- 在采用直方图均衡化的方法时,灰度值选择的越大,则得到图像更为真实,如在图1-2中,当灰度值为8时,图片上方出现了一块亮斑,处理过于粗糙;
- 采用同态滤波增强时,对滤波范围的增大或者缩小对此图的影响不大,视觉上并不显著。但对于其他情况,不同的滤波范围会对结果产生极大的影响。
关于图二
- 实验分析
- 此图的不足仍为对比度不强,人的轮廓与背景对比不强。分析以上两种方法的效果,可以观察到同态滤波的方法更佳。原图中的亮点仍然较亮,且原图中较为暗淡的手臂也变得更为显著;而采用直方图均衡化方法后,白的确实更亮了,但原图人体的亮点不再明显(如脑袋上的圆点),甚至有的融为一体,总体变亮。搜索资料发现,直方图均衡化可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节,但在此图中,对比度增强过于显著,效果不理想;
- 采用同态滤波增强时,滤波范围的增大或者缩小在此图中现象明显,当滤波范围较大时,图像呈现更多的白色,而滤波范围较小时,图像呈现的白色较少。所以,要想呈现好的效果,滤波的范围十分关键。对于此图,采用0.6-2.0的范围较好;
- 采用直方图均衡化时,仍然是灰度值越大越好,这与图一中的结果一致;
关于图三
- 实验分析
- 分析原图,此图应为椒盐噪声,但仍然尝试中值滤波与均值滤波两种方法。从图3-1中可以显然得到中值滤波的效果更佳。中值滤波很好得到了图中的数字与字母“AED-632”与“SINDH”。均值滤波消除了一定噪声,但看起来噪声是更大了,图片变得较为模糊,仅隐约可见数字与字母,十分费力;
- 中值滤波采用非线性的方法,在平滑椒盐噪声上非常有效,同时此方法也可以保护图像尖锐的边缘,会选择适当的点来替代污染点的值,但对高斯噪声表现较差。从图3-1中可以观察到,采用5×5进行中值滤波时效果比采用3×3更佳。当采用5×5时,每一次处理的点更多工作量变大的同时效果自然更好;
- 均值滤波是一种线性滤波器,是计算一个区域中像素的平均值,然后去替代掉目标点。此方法效率高但是会将边缘信息以及特征信息模糊掉;
- 对于图像的处理必要时要结合多种方法使用,就此图而言,经过均值滤波器后的图像对比度不强,通过对图一图二的处理,想到要采用增强对比度的方法来使图片的细节呈现更加完整。所以,对中值滤波后的图片进行直方图均衡化操作,得到了更为真实、具体的图片。
关于图四
- 实验分析
- 分析原图可以发现图片有一些模糊,但不是对焦不好产生的,应是目标由于水平和垂直方向发生运动而产生模糊的。所以可采用以下降质函数fspecial(type,len,theta),选择motion类型,指物体逆时针方向以theta角度运动了len个像素。修改len与theta数值,数值过大或者过小效果均不佳,如图4-2 A所示,会出现波纹。多次修改发现最适数值为len=8,theta=10。
- 对于Lucy-Richardson方法而言,从图中可以发现迭代次数越多,图像细节恢复越清晰,但会使图像边界区域的振铃效应越明显且MATLAB的处理时间明显增加。多次试验发现迭代次数在100附近达到最佳效果(电脑分辨率、眼睛自身等原因,我觉得60~400的效果基本一致)。
- 对于维纳滤波而言,也需要调整函数中NSR参数数值,当NSR数值越大,图像越模糊且图像亮度下降,当NSR数值减小,则出现噪点(图4-2 B、C),在这个过程中,我们可以找到一个最适的参数,经调节,发现当NSR=0.001时效果较好。
- 对于可约束最小二乘滤波,使用默认参数时效果已非常可观。
- 综上,我认为可约束最小二乘滤波、NSR=0.001的维纳滤波以及迭代次数为100的Lucy-Richardson对处理此图的效果相当。但综合使用的简便性以及处理的快速性,可优先选择可约束最小二乘滤波,既避免了复杂的调参环节,也节约了MATLAB迭代处理的时间。
关于二值形态学
- 代码
I=imread('1.png');
Image=rgb2gray(I);
[M,N]=size(Image);
Image=im2double(Image);
eq_image=histeq(Image,8);
imshow(eq_image,[]);
%阈值化
%获得二值图像
G=im2bw(eq_image,graythresh(eq_image));
imshow(G,[]);
se=strel('disk',2);
f=imerode(G,se);
fc=imclose(f,se);%先腐蚀在闭运算
imshow(fc,[]);
BW=imfill(fc,'holes');
imshow(BW,[]);
%相减
sss=imsubtract(fc,BW);
imshow(sss,[])