g(i,j)=0;
else
g(i,j)=255;
end
end
end
figure;imshow(g);title('ãÐÖµ·Ö¸îºóµÄͼÏñ');
四、实验结果与分析
1.哈夫变换
哈夫(Hough)变换是利用图像全局特性而将边缘象素连接起来组成区域封闭边界的1种方法。
哈夫变换的基本思想是点一线的对偶性(duality)。
在图像空间XY里,所有过点(x,y)的直线都满足方程:
y=px+q 其中p为斜率,q为截距。
上式也可写成:
q=-px+y
上式可认为代表参数空间PQ中过点(p,q)的1条直线。
如果直线接近竖直方向,则会由于p和q的值都接近无穷,此时可用直线的极坐标方程:
ρ=xcosθ+ysinθ
实验步骤如下:
(1)在原图中找目标点。
(2)根据目标点坐标在θρ平面画正弦曲线,曲线经过之处,计数器投票加1。
(3)在θρ平面的最大值,根据其坐标求直线的斜率k,截距b
k=-cotθ,b=ρ/sinθ
(4)将最大值的邻域清零。
(5)重复3),4),直到找到所有直线。
实验结果如下:
图2-1图2-2
2.边缘检测
由于图像在边缘处的灰度值不连续,故在图像边缘处求导数(1阶或2阶)是会出现尖峰,这就是边缘检测的原理。
在计算机实现当中,应将求导过程离散化,故可应用不同的离散化模板逐像素进行卷积。
Matlab中利用edge()函数可以对图像进行边缘检测。
实验结果如下:
图2-3原始图像
图2-4prewitt算子图2-5sobel算子
3.阈值分割
阈值分割是最常见的并行的直接检测区域的分割方法。
假设图像由具有单峰灰度分布的目标和背景组成,在目标和背景内部的相邻象素间的灰度值是高度相关的,但在目标和背景处两边的象素在灰度值上有很大的区别,这类图像常可用取阈值方法来较好的分割。
阈值分割法的关键是确定阈值,实际应用为自动选取一个阈值,可采取如下迭代步骤:
(1)为T选取一个初始估计值(图像中最大亮度值和最小亮度值的中间值)
(2)使用T分割图像。
将图像中每个象素的灰度值与T比较,象素的灰度值大于T为G1,象素的灰度值小于T为G2
(3)计算G1和G2范围内像素的平均亮度值u1和u2
(4)计算一个新阈值:
T=0.5(u1+u2)
(5)复步骤2到4连续迭代中T的差值比预先指定的参数T0小为止
实验结果如下:
图2-6阈值分割后图像
实验三:
图像增强
一、实验内容
图像增强(直方图直方图均化、对比度增强、均值滤波、中值滤波)
二、实验目的
培养学生相关图像基本处理操作的能力
三、实验源程序
源程序如下:
clear
f=imread('e:
\cat.bmp');
g=rgb2gray(f);
gzhifang=histeq(g,256);
figure;imshow(g);title('Ô»Ò¶ÈͼÏñ');
figure;imshow(gzhifang);title('Ö±·½Í¼¾ùºâ');
gzengqiang=imadjust(g,[0.30.7],[]);
figure;imshow(gzengqiang);title('¶Ô±È¶ÈÔöÇ¿')
gn=imnoise(g,'salt&pepper',0.02);figure;
imshow(gn);title('¼ÓÈëÔëÉùºóµÄ»Ò¶ÈͼÏñ');
w=[1,1,1;1,1,1;1,1,1];w=w/9;
gaver=imfilter(gn,w,'replicate');
figure;imshow(gaver);title('¾ùÖµÂ˲¨');
gmid=medfilt2(gn);figure;imshow(gmid);title('ÖÐÖµÂ˲¨');
四、实验结果与分析
实验结果如下:
结果分析:
1.直方图均衡化
此方法的基本思想是把原始图分布非均匀的直方图变换为均匀分布的形式,这样就增加了像素灰度值得动态范围从而达到增强图像整体对比度的效果。
matlab中函数命令为histeq().
2.对比度增强
增强图像对比度实际是增强原图的各部分的反差。
实际中往往是通过原图里两个灰度间的动态范围来实现的。
matlab中函数命令为imadjust().由上图可以看到对比度明显增强。
3.中值滤波
中值滤波器是一种非线性平滑滤波器。
它是让与周围像素灰度值得差比较大的像素改取于周围像素接近的值,以消除孤立的噪声点。
matlab中函数命令为medfilt2()。
由于它不是简单的取均值,所以产生的模糊比较少。
本实验选取的灰度图无噪声,为了比较中值滤波前后效果,对原图加盐椒噪声,中值滤波后,消除了噪声,图像细节基本没变化。
4.均值滤波
均值滤波器是一个线性平滑滤波器,它的3×3模板所有系数都为1。
由上面实验结果可以看到它对噪声有所消除,但同时所得达到的图像变得更为模糊。
实验四:
图像函数编程
(1)
一、实验内容
编程实现rmse、H(熵)
二、实验目的
培养学生相关图像函数基本编程的能力
三、实验源程序
源程序如下:
1.rmse
rmse是图像的均方根误差。
即公式
functionr=rmse(A,B)
r=0;[m,n,z]=size(A);
forstep=1:
z
s=sqrt(sum(sum((A(:
:
step)-B(:
:
step)).^2))/(m*n));
r=r+s;
end
r=r/3;
2.H熵
熵值的大小表示图像所包含的平均信息量的多少,反映了图像中具有不同灰度值像素的概率分布,熵越大说明图像的融合效果越好。
其中
为图像第i级灰度值的概率。
functionresult=entropy(I)
[m,n,s]=size(I);
ifs==3
I=rgb2gray(I);
else
I=I;
end
I=double(I);
A=size(I);h=A
(1)*A
(2);result=0;
fork=1:
256
X=(I==k-1);
D(k)=sum(sum(X));P(k)=D(k)./h;
if(P(k)~=0)
result=P(k)*log2(P(k))+result;
end
end
result=-result;
四、实验结果与分析
实验结果如下:
将上面编写的函数m文件名命名为函数名(rmse.m,entropy.m),以后可以直接调用此函数。
Matlab的windowscommand区键入如下命令:
>>a=imread('e:
\e1.bmp');
>>b=imread('e:
\e2.bmp');
>>RMSE=rmse(a,b)
回车运行得到
RMSE=
3.3160
其中e1.bmp和e2.bmp如下:
图4-1e1.bmp图4-2e2.bmp
对于求图4-3的H熵,如下:
图4-3twins.bmp
>>a=imread('e:
\twins.bmp');
>>H=entropy(a)
回车运行得到
H=
7.1031
实验五:
图像函数编程
(2)
一、实验内容
编程实现psnr
二、实验目的
培养学生相关图像函数基本编程的能力
三、实验源程序
PSNR是峰值信噪比简称。
PSNR的计算公式为:
PSNR=10lg(255x255/RMSE);
源程序如下:
functionresult=PSNR(A,B)
A=double(A);B=double(B);
r=0;
[m,n,z]=size(A);
forstep=1:
z
s=sqrt(sum(sum((A(:
:
step)-B(:
:
step)).^2))/(m*n));
r=r+s;
end
rmse=r/3;
result=10*log10(255^2/rmse);
四、实验结果与分析
将上面编写的函数m文件名命名为函数名psnr.m,直接调用此函数。
Matlab的windowscommand区键入如下命令:
>>a=imread('e:
\e1.bmp');
>>b=imread('e:
\e2.bmp');
>>PSNR=psnr(a,b)
其中e1.bmp和e2.bmp同上一题相同,回车运行得到:
PSNR=
39.6875
实验六:
目标表达和描述
一、实验内容
目标表达和描述(欧拉数、图像面积、bwperim、bwlabel、利用逻辑运算提取物体、特征与运算)
二、实验目的
培养学生相关图像函数基本编程的能力
三、实验源程序
源程序如下:
clear
f=imread('e:
\bird.bmp');
f=im2bw(f);
imshow(f);title('Ôʼ¶þֵͼÏñ');
euler=bweuler(f)
area=bwarea(f)
g1=bwperim(f,8);
figure;imshow(f);title('¶þֵͼÏñÖжÔÏóµÄÖܳ¤');
L=bwlabel(f,8);
[r,c]=find(L==2);
rc=[rc]
BW1=bwmorph(f,'remove');
figure;imshow(BW1);title('¶þֵͼÏñÂÖÀª');
BW2=bwmorph(f,'skel',Inf);
figure;imshow(BW2);title('¶þֵͼÏñ¹Ç¼Ü');
四、实验结果与分析
实验结果如下:
其中欧拉数E=C-H,H为区域内的孔数,C是区域内的连通组原的个数。
欧拉数为:
euler=
2
面积为:
area=
4.0891e+003
rc=
1(14,84)………1(14,92)
..
.………….
..
1(24,84)………1(24,92)
注:
rc是一个矩阵,为了方便写成了上面的形式。
由于”bird”的第二个连通组元是字母”i”上的一点,以下代码:
L=bwlabel(f,8);
[r,c]=find(L==2);
rc=[rc]
即是寻找第二个联通组元,结果与预想的一样。
说明:
此专题实验的第7,8,9题实验内容都是关于图像融合的,为了方便归为一个实验报告里,见实验七:
图像融合。
实验七:
图像融合
一、实验内容
基于GUI界面的图像处理算法-----图像融合
二、实验目的
了解有一定应用背景的图像处理算法,培养学生相关图像处理的分析问题的能力
三、实验原理
基于小波变换的融合算法原理:
①对每一路图像进行小波变换,分别到其水平、垂直、四十五度角方向的高频分量以及其低频分量,得到每路图像的小波金字塔;
②按取较大值的原则对两幅图像的不同层次、不同特征层的信息图分别进行融合;
③根据融合的各图像分量的小波序列,进行小波逆变换,得到最后的融合图像。
其中,主要使用了以下两个函数:
i.小波分解函数:
dwt2
语法格式:
[cA,cH,cV,cD]=dwt2(X,’db8’)
该语句的作用是对输入信号X做一次小波分解。
其中cA表示分解得到的近似分量系数;cH表示分解得到的水平分量系数;cV表示分解得到的垂直分量系数;cD表示分解得到的对角线分量系数;db8表示分解所用滤波器组。
ii.小波重构函数:
idwt2
语法格式:
X=idwt2(cA,cH,cV,cD,’db8’)
该语句的作用是进行一次二维小波重构。
其中,X表示重构的分量信号,cA表示分解得到的近似分量系数;cH表示分解得到的水平分量系数;cV表示分解得到的垂直分量系数;cD表示分解得到的对角线分量系数;db8表示重构所用的滤波器组。
四、实验源程序
GUI界面里最核心的为小波变换的融合算法,其他的限于篇幅不再罗列,融合算法函数如下:
functionF=Wavelet(A,B)
[m,n,dimensions]=size(A);
%imageAdecomposition
fors=1:
dimensions
[caa1,cha1,cva1,cda1]=dwt2(A(:
:
s),'db8');
S1=size(caa1);
[caa2,cha2,cva2,cda2]=dwt2(caa1,'db8');
S2=size(caa2);
[caa3,cha3,cva3,cda3]=dwt2(caa2,'db8');
S3=size(caa3);
%imageBdecomposition
[cab1,chb1,cvb1,cdb1]=dwt2(B(:
:
s),'db8');
[cab2,chb2,cvb2,cdb2]=dwt2(cab1,'db8');
[cab3,chb3,cvb3,cdb3]=dwt2(cab2,'db8');
%fusion
fori=1:
S3
(1)
forj=1:
S3
(2)
ifabs(caa3(i,j))>abs(cab3(i,j))
caf3(i,j)=caa3(i,j);
else
caf3(i,j)=cab3(i,j);
end
ifabs(cha3(i,j))>abs(chb3(i,j))
chf3(i,j)=cha3(i,j);
else
chf3(i,j)=chb3(i,j);
end
ifabs(cva3(i,j))>abs(cvb3(i,j))
cvf3(i,j)=cva3(i,j);
else
cvf3(i,j)=cvb3(i,j);
end
ifabs(cda3(i,j))>abs(cdb3(i,j))
cdf3(i,j)=cda3(i,j);
else
cdf3(i,j)=cdb3(i,j);
end
end
end
fori=1:
S2
(1)
forj=1:
S2
(2)
ifabs(caa2(i,j))>abs(cab2(i,j))
caf2(i,j)=caa2(i,j);
else
caf2(i,j)=cab2(i,j);
end
ifabs(cha2(i,j))>abs(chb2(i,j))
chf2(i,j)=cha2(i,j);
else
chf2(i,j)=chb2(i,j);
end
ifabs(cva2(i,j))>abs(cvb2(i,j))
cvf2(i,j)=cva2(i,j);
else
cvf2(i,j)=cvb2(i,j);
end
ifabs(cda2(i,j))>abs(cdb2(i,j))
cdf2(i,j)=cda2(i,j);
else
cdf2(i,j)=cdb2(i,j);
end
end
end
fori=1:
S1
(1)
forj=1:
S1
(2)
ifabs(caa1(i,j))>abs(cab1(i,j))
caf1(i,j)=caa1(i,j);
else
caf1(i,j)=cab1(i,j);
end
ifabs(cha1(i,j))>abs(chb1(i,j))
chf1(i,j)=cha1(i,j);
else
chf1(i,j)=chb1(i,j);
end
ifabs(cva1(i,j))>abs(cvb1(i,j))
cvf1(i,j)=cva1(i,j);
else
cvf1(i,j)=cvb1(i,j);
end
ifabs(cda1(i,j))>abs(cdb1(i,j))
cdf1(i,j)=cda1(i,j);
else
cdf1(i,j)=cdb1(i,j);
end
end
end
caf2=idwt2(caf3,chf3,cvf3,cdf3,'db8',S2);
caf1=idwt2(caf2,chf2,cvf2,cdf2,'db8',S1);
caf0=idwt2(caf1,chf1,cvf1,cdf1,'db8');
F(:
:
s)=uint8(caf0);
End
四、实验结果与分析
最终的GUI界面如下页图7-1:
图7-1最终界面
点击按钮“示例”,得到如下结果:
图7-2打开“示例”界面
除了示例外,还可以点击左上“打开图像”按钮,任意选择一幅图片为oriangalimage;同样选择图片为image1和image2。
结束后点击右侧“融合图像”命令,在右下区域可得到由image1和image2融合后的图像。
同时右下列显示原图像与融合后图像各自的熵值以及均方根误差。
图7-3
实验小结:
通过本专题实验,我复习了上学期学习过的图像处理和图像测量方面的知识,加深理解了关于图像方面的知识,进一步熟悉掌握了Matlab的图像处理工具箱IPT和matlab语言的GUI界面编程;了解了应用matlab工具解决有一定应用背景的图像处理算法,比如本实验的图像融合算法,增强了自己解决问题的方法和能力。
最后感谢老师提供的实验指导,使我获益匪浅,较快的解决了实验过程中遇到的问题。