一、实验目的
(1)了解图像增强的目的及意义,加深对图像增强的感性认识,巩固所学的图像增强的理论知识和相关算法。
(2)熟练掌握直方图均衡化的计算过程。
(3)熟练掌握空域滤波中常用的平滑和锐化滤波器。
(4)熟练掌握低通和高通滤波器的使用方法,明确不同性质的滤波器对图像的影响和作用。
二、实验仪器(软件平台)
计算机、Matlab软件
三、实验原理
1、均值滤波
平滑线性空间滤波器的输出是包含在滤波器模板邻域内的像素的简单平均值,也就是均值滤波器。均值滤波器也是低通滤波器,均值滤波器很容易理解,即把邻域内的平均值赋给中心元素。
均值滤波器用来降低噪声,均值滤波器的主要应用是去除图像中的不相关细节,不相关是指与滤波器的模板相比较小的像素区域。模糊图片以便得到感兴趣物体的粗略描述,因此那些较小的物体的灰度就会与背景混合在一起,较大的物体则变的像斑点而易于检测。模板的大小由那些即将融入背景中的物体尺寸决定。
均值滤波器的缺点是存在着边缘模糊的问题。
均值滤波器的模板由标准像素平均和加权平均之分。如下所示
H1=19111111111 H2=110111121111 H3=116121242121
2、中值滤波
图像的中值滤波是一种非线性图像处理方法,是统计排序滤波器的一种典型应用。中值滤波是通过对窗口覆盖的邻域内像素按灰度排序的结果决定窗口中心像素的灰度。在消除图像中的随机噪声和脉冲噪声(椒盐噪声)上非常有效。
3、直方图均衡化
假设原图像f的灰度级为L,对原图像f进行直方图均衡化得到的新图像为g.图像直方图均衡化方法步骤如下:
4、直方图规定化
直方图规定化是在直方图均衡化的基础上进行的。
图 1 直方图规定化的实现
四、实验内容(核心代码,实验结果,结果分析)
(1)任意选择一幅图像,对其添加椒盐噪声,再分别用均值滤波和中值滤波对该图像进行滤波平滑处理,观察滤波效果。
利用imnoise(f,type,parameters)函数对输入图像添加噪声密度为0.2的椒盐噪声,然后可以利用fspecial(type,para)函生成3*3的均值滤波器,再利用imfilter(A,H)函数对生成的噪声图像进行均值滤波,在进行中值滤波时,medfilt2(A)中值滤波函数的输入参数必须是二维的,所以需要将输入的图像用rgb2gray()函数进行转换。
2)选择一幅图像,对其进行直方图均衡化,获得均衡化直方图,以及均衡化的图像,观察图像变化。
对图像均衡化构造了一个histogram()的自定义函数。如果是灰色图像,可以直接通过函数进行直方图均衡化,但是针对彩色图像,需要对图像进行提取RGB三个分量的预处理,再将各个分量通过histogram()函数分别得到三个结果,再利用cat()函数将三个分量结果叠加合并成为一张彩色图像。最后要注意显示图像直方图的imhist()函数,它的输入参数须为二维的,也就是要利用rgb2gray()函数进行转换。
(3)对图像进行直方图规定化,观察图像的特点。
对图像进行直方图规定化,要注意参考图的选择。要先得到参考图的直方图,然后通过histeq()函数以原始图像和参考图的直方图为参数,得到原始图像以参考图直方图为期望的规定化图像以及其直方图。
%% filter_1.m
clc;clear;
%% (1)任意选择一幅图像,对其添加椒盐噪声,再分别用均值滤波和中值滤波对该图像滤波
img = imread('x.jpg');
img =rgb2gray(img);
figure(1);
subplot(221);imshow(img);title('原始图像');
img1 = imnoise(img,'salt & pepper',0.2);
subplot(222);imshow(img1);title('椒盐噪声');
ave_filter = fspecial('average',3);
img_ave = imfilter(img1,ave_filter);
subplot(223);imshow(img_ave);title('均值滤波');
img_mid = medfilt2(img1);%medfilt2()函数的图像参数应该是二维的,用rgb2gray()函数把图像转为二维图像
subplot(224);imshow(img_mid);title('中值滤波');
%% (2)选择一幅图像,对其进行直方图均衡化,获得均衡化直方图,以及均衡化的图像
I=imread('toysnoflash.png');
figure(2);
I1=I(:,:,1);%提取红色分量
I2=I(:,:,2);%提取绿色分量
I3=I(:,:,3);%提取蓝色分量
I1=histogram(I1); %构造的函数
I2=histogram(I2);
I3=histogram(I3);
c=cat(3,I1,I2,I3); %cat用于构造多维数组
subplot(2,2,1);imshow(I);
subplot(2,2,2);imhist(rgb2gray(I));%imhist(I);
subplot(2,2,3);imshow(c);
subplot(2,2,4);imhist(rgb2gray(c));
%% (3)对图像进行直方图规定化,观察图像的特点
img3 =imread('pout.tif');
figure(3)
subplot(321);imshow(img3);title('原始图像');
subplot(322);imhist(img3);title('原始图像直方图');
%参考图
refer = imread('lena.jpg');
refer=rgb2gray(refer);%旧版本需要
subplot(323);imshow(refer);title('参考图像');subplot(324);imhist(refer);title('参考图像直方图');
[hgram,x] = imhist(refer);
%规定化后的图像
img4 = histeq(img3,hgram);subplot(325);imshow(img4);title('规定化后图像');
subplot(326);imhist(img4);title('规定化后直方图');
自定义均衡化函数文件histogram.m:
%调用的(直方图均衡化)构造函数
function result=histogram(I)%构造histogram函数
J=I;%把原图像I赋给J
[m,n]=size(I); %确定矩阵大小
area=m*n; %是总的数量,灰度值的总数量
a=zeros(1,256); %产生1*256的零矩阵a,用来存放-原始图像-各个灰度值的“个数”
b=zeros(1,256); %放产生原图像灰度值的映射新灰度值
% 统计[0,255]每个灰度值的个数
for i=1:m %记录各个灰度值的个数
for j=1:n
d=I(i,j)+1; %获取(i,j)位置的灰度值(注意:灰度值为0-255,对应矩阵的1-256)
a(1,d)=a(1,d)+1; %矩阵a上对应灰度值的计数+1
end
end
for i=1:256 %均衡化
sum=0;
for j=1:i %第i个灰度值
sum=sum+a(1,j);%前i个灰度值的个数相加
end
%计算变换函数值:概率分布函数--概率累加 P(i)=累加(s(i)/n) p(i)=s(i)/n=a(1,i)/n, P(i)=累加p(i)
b(1,i)=sum*255/area;%第i个累加总数/矩阵大小,乘以(L-1)------b矩阵放的是原图像灰度值对应的所要映射的灰度值
end
for i=1:m %用均衡化后的数据代替原位置的数据
for j=1:n
d=J(i,j)+1;%I赋值的J,遍历灰度值加1为索引d
J(i,j)=b(1,d);%在b数组中以d,索引寻找新映射的灰度值,代替当前灰度值
end
end
result=J; %返回图像
end
【实验结果】
图 6 两种滤波对噪声滤除的效果
可以看出对于随机噪声或椒盐噪声,中值滤波的效果要比均值滤波的效果要好很多
图 7 直方图均衡化结果
由图像可以看出,通过直方图均衡化,拉高了原始图像的对比度,原始图像的暖色调经过直方图均衡化后变为冷色调,观察两者直方图,原始直方图中的灰度分布主要集中在低像素级一端(左端),且灰度值都比较大,而均衡化后的直方图中的灰度分布是比较均匀地分布在横坐标上,且灰度值变化不会太大。衡量一个图像的质量,看其直方图的灰度是否接近分布在整个横轴上,且至少有一个峰值。
图 8 直方图规定化结果
由图可知,原图像对比度并不好,图像整体灰蒙蒙的,我利用一张对比度较好的图像作为参考图像,通过规定化直方图后,可以得到一张对比度比原图像好的结果图像。