QQ群联合列表: http://www.pudn.com/qqs_list.asp
一、实验目的:
掌握基本的图象增强和变换方法,观察图象增强的效果,加深对图像增强和一些基本变换的理解。熟悉如何用matlab实验平台对图像进行增强和变换处理。
二、实验内容:
1.图片去噪:对一幅图像加入不同的噪声(随机点噪声、椒盐噪声等),选取不同的方法去噪,比如说邻域平均、中值滤波、图像迭加等,比较对于不同的噪声,不同的方法哪种更好。
2.做出直方图,进行直方图均衡化。
三、实验过程:
注:下面操作均用图1所示的图像(Gem是我的网名);
① 图片去噪:对一幅图像加入不同的噪声(随机点噪声、椒盐噪声等),选取不同的方法去噪,比如说邻域平均、中值滤波、图像迭加等,比较对于不同的噪声,不同的方法哪种更好.
高斯噪声的加噪和去噪:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> M=imnoise(I,'gaussian',0.01);
>> I1=double(M)/255;
>> h1=[1/9 1/9 1/9;1/9 1/9 1/9;1/9 1/9 1/9];
>> J1=conv2(I1,h1,'same');
>> J2=medfilt2(I1,[3 3]);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(M);title('加高斯噪声后图像');
>> subplot(2,2,3),imshow(J1);title('低通滤波后');
>> subplot(2,2,4),imshow(J2);title('中值滤波后');
>>
图2:高斯噪声的加噪和去噪
高斯噪声均值滤波:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> A=imnoise(I,'gaussian',0.01);
>> B1=filter2(fspecial('average',3),A)/255;
>> B2=filter2(fspecial('average',5),A)/255;
>> B3=filter2(fspecial('average',7),A)/255;
>> subplot(2,2,1),imshow(A);title('加高斯噪声后图像');
>> subplot(2,2,2),imshow(B1);title('平均3后图像');
>> subplot(2,2,3),imshow(B2);title('平均5后图像');
>> subplot(2,2,4),imshow(B3);title('平均7后图像');
>>
高斯噪声邻域平均滤波:
>> [G,map]=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> J1=imnoise(I,'gaussian',0,0.02); % 受高斯噪声干扰
>> M4=[0 1 0; 1 0 1; 0 1 0];
>> M4=M4/4; % 4邻域平均滤波
>> I_filter1=filter2(M4,J1);
>> M8=[1 1 1; 1 0 1; 1 1 1]; % 8邻域平均滤波
>> M8=M8/8;
>> I_filter2=filter2(M8,J1);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(J1);title('加高斯噪声后图像');
>> subplot(2,2,3),imshow(I_filter1,map);title('4邻域平均滤波');
>> subplot(2,2,4),imshow(I_filter2,map);title('8邻域平均滤波');
>>
图4: 高斯噪声邻域平均滤波
比较:
椒盐噪声的加噪和去噪:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> M=imnoise(I,'salt & pepper',0.06);
>> I1=double(M)/255;
>> h1=[1/9 1/9 1/9;1/9 1/9 1/9;1/9 1/9 1/9];
>> J1=conv2(I1,h1,'same');
>> J2=medfilt2(I1,[3 3]);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(M);title('加高斯噪声后图像');
>> subplot(2,2,3),imshow(J1);title('低通滤波后');
>> subplot(2,2,4),imshow(J2);title('中值滤波后');
>>
椒盐噪声均值滤波:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> A=imnoise(I,'salt & pepper',0.06);
>> B1=filter2(fspecial('average',3),A)/255;
>> B2=filter2(fspecial('average',5),A)/255;
>> B3=filter2(fspecial('average',7),A)/255;
>> subplot(2,2,1),imshow(A);title('加椒盐噪声后图像');
>> subplot(2,2,2),imshow(B1);title('平均3后图像');
>> subplot(2,2,3),imshow(B2);title('平均5后图像');
>> subplot(2,2,4),imshow(B3);title('平均7后图像');
>>
图6:椒盐噪声均值滤波
椒盐噪声邻域平均滤波:
>> [G,map]=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> J1=imnoise(I,'salt & pepper',0.06); % 受椒盐噪声干扰
>> M4=[0 1 0; 1 0 1; 0 1 0];
>> M4=M4/4; % 4邻域平均滤波
>> I_filter1=filter2(M4,J1);
>> M8=[1 1 1; 1 0 1; 1 1 1]; % 8邻域平均滤波
>> M8=M8/8;
>> I_filter2=filter2(M8,J1);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(J1);title('加椒盐噪声后图像');
>> subplot(2,2,3),imshow(I_filter1,map);title('4邻域平均滤波');
>> subplot(2,2,4),imshow(I_filter2,map);title('8邻域平均滤波');
>>
比较:
随机噪声均值滤波:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> snoise=0.1*randn(size(I));
>> A=imadd(I,im2uint8(snoise));
>> B1=filter2(fspecial('average',3),A)/255;
>> B2=filter2(fspecial('average',5),A)/255;
>> B3=filter2(fspecial('average',10),A)/255;
>> subplot(2,2,1),imshow(A);title('加随机噪声后图像');
>> subplot(2,2,2),imshow(B1);title('平均3后图像');
>> subplot(2,2,3),imshow(B2);title('平均5后图像');
>> subplot(2,2,4),imshow(B3);title('平均10后图像');
>>
图8:随机噪声均值滤波
随机噪声邻域平均滤波:
>> [G,map]=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> snoise=0.1*randn(size(I));
>> J1=imadd(I,im2uint8(snoise)); % 受随机噪声干扰
>> M4=[0 1 0; 1 0 1; 0 1 0];
>> M4=M4/4; % 4邻域平均滤波
>> I_filter1=filter2(M4,J1);
>> M8=[1 1 1; 1 0 1; 1 1 1]; % 8邻域平均滤波
>> M8=M8/8;
>> I_filter2=filter2(M8,J1);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(J1);title('加随机噪声后图像');
>> subplot(2,2,3),imshow(I_filter1,map);title('4邻域平均滤波');
>> subplot(2,2,4),imshow(I_filter2,map);title('8邻域平均滤波');
>>
图9:随机噪声邻域平均滤波
随机噪声的加噪和去噪:
>> G=imread('D:\gem.bmp');
>> I=rgb2gray(G);
>> snoise=0.1*randn(size(I));
>> M=imadd(I,im2uint8(snoise));
>> I1=double(M)/255;
>> h1=[1/9 1/9 1/9;1/9 1/9 1/9;1/9 1/9 1/9];
>> J1=conv2(I1,h1,'same');
>> J2=medfilt2(I1,[3 3]);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(M);title('加随机噪声后图像');
>> subplot(2,2,3),imshow(J1);title('低通滤波后');
>> subplot(2,2,4),imshow(J2);title('中值滤波后');
>>
比较:
②做出直方图,进行直方图均衡化:
灰度图像直方图均衡化的描述:
1、灰度图像直方图处理方法
图像的直方图是图像处理中一种十分重要且实用的工具,它概括了一副图像的灰度级内容。从数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或概率。实际上,灰度图像直方图是一个离散函数:
pf(fk)=nk/n k=0,1,…,L-1
其中fk为图像f(x,y)的第k级灰度,nk是图像f(x,y)中具有灰度值fk的象素个数,n是图像象素总数,L是图像的灰度级数。因为pf(fk)给出了对各个fk出现概率的一个统计,所以直方图提供了图像的灰度值分布情况。在灰度直方图坐标系中,横坐标表示图像中各个像素点的灰度级,纵坐标为各个灰度级上图像各个像素点出现的次数或概率。在对灰度数字图像的增强处理方法中,灰度均衡化和灰度规定化应用较为广泛,但后者需要根据具体的图像人为规定好适当的期望直方图才能得到满意的效果,如果期望直方图规定不当则处理效果会很差,因此后者的通用性不好。而前者在处理时只需要将当前的灰度分布重新均衡地分布于整个灰度区间即可,虽然对于某一幅特定的图象处理效果可能不及灰度规定化,但通用性却要好的多,对任意图象均可获得相当不错的处理效果。
2、灰度图像直方图均衡化算法分析
对于一个直方图:
设 Pr(r)是原始图像直方图,Ps(s)是均衡化的直方图,
由于其是一个概率分布函数
所以有 Ps(s)ds=Pr(r)dr (编辑关系,ds,dr是积分变量)
因为要进行均衡化,令 Ps(s)=1,
得 ds=Pr(r)dr/1
两边积分得 s=F Pr(r)dr (因为编辑关系,左边F表示积分符号....-__-++)
数字图像是离散的,因此离散化上式得
sk=E{j=0,k}(nj/N) 左式k,j是离散量下标,因为编辑关系,E{0,k}表示下标0到k的连加符号,N是象素总数
由此得出每一象素的sk为均衡化后的正规化灰度(即灰度正规化到[0,1]),统计sk即可得出均衡化后的直方图。
在均衡化过程中可以对每一象素映射到新的实际灰度值sk*255,就实现了图像的变换
(严格理论中应该是灰度正规化到[0,1]区间,然后均衡化后的sk还要量化到原始的正规灰度以实现灰度合并,下面的BCB程序并没有量化,而且255是固定灰度级,因为256色BMP的彩色表就是256个表项)
直方图均衡化的实质是,利用减少灰度级来达到灰度均衡的目的。
首先要理解直方图的含义,直方图体现的是每一个灰度级的象素的个数,而均衡化,就是把直方图的灰度级进行归一化处理,得到一个映射的灰度级,然后再把原来的点填到新的灰度级中,再反过来,把每个象素变成相应的灰度值。
对比度变换其中一种比较简单的方法是直方图均衡化。
所谓直方图就是在某一灰度级的象素个数占整幅图像的象素比 h=nj/N,其中nj是灰度级在j的象素数,N是总象素数,扫描整幅图像得出的h的离散序列就是图像的直方图,h求和必然=1,所以直方图可以看成是象素对于灰度的概率分布函数。直方图是高低不齐的,因为象素灰度是随机变化的,直方图均衡化就是用一定的算法使直方图大致平和。
这样,就可以把直方图均衡化结果映射到希望的理想直方图上。实现过程:
1将原始图像作直方图均衡化处理,求出原图像中每一个灰度级ri所
对应的变换函数Si
2对期望图像的直方图作类似计算,得到期望图像每一个灰度级Zi对
应的变换函数Vi
3找出Vi≈Si的点对,井映射到Zi
4求出Pz(Zi)
代码实现:
>> A=imread('d:\gem.bmp'); %读入JPG彩色图像文件
>> I=rgb2gray(A); %灰度化后的数据存入数组
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> %二,绘制直方图
>> [m,n]=size(I); %测量图像尺寸参数
>> GP=zeros(1,256); %预创建存放灰度出现概率的向量
>> for k=0:255
GP(k+1)=length(find(I==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
end
>> subplot(2,2,2),bar(0:255,GP,'g');title('原始图像的直方图')
>> xlabel('灰度值')
>> ylabel('出现概率') %绘制直方图
>> %三,直方图均衡化
>> S1=zeros(1,256);
>> for i=1:256
for j=1:i
S1(i)=GP(j)+S1(i); %计算Sk
end
end
>> S2=round(S1*256); %将Sk归到相近级的灰度
>> for i=1:256
GPeq(i)=sum(GP(find(S2==i))); %计算现有每个灰度级出现的概率
end
>> subplot(2,2,3),bar(0:255,GPeq,'b');title('均衡化后的直方图')
>> xlabel('灰度值')
>> ylabel('出现概率') %显示均衡化后的直方图
>> %四,图像均衡化
>> PA=I;
>> for i=0:255
PA(find(I==i))=S2(i+1); %将各个像素归一化后的灰度值赋给这个像素
end
>> subplot(2,2,4),imshow(PA);title('均衡化后图像') %显示均衡化后的图像
>> figure(2),plot(0:255,S2,'r');legend('灰度变化曲线') %显示灰度变化曲线
>> xlabel('原图像灰度级')
>> ylabel('均衡化后灰度级')
Matlab自带的函数均衡化:
>> A=imread('d:\gem.bmp');
>> I=rgb2gray(A);
>> J=histeq(I);
>> subplot(2,2,1),imshow(I);title('原始图像 Gem');
>> subplot(2,2,2),imshow(J);title('直方图均衡化后的');
>> subplot(2,2,3),imhist(I,64);title('原始图像的直方图');
>> subplot(2,2,4),imhist(J,64);title('均衡化后的直方图');
>>
http://ctfysj.gbaopan.com/files/f292633f32284e53867eb7b925a86595.gbp
注: 选做题为直方图均衡化
完整版即将推出,敬请关注!