数字图像处理实习报告.docx
《数字图像处理实习报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理实习报告.docx(23页珍藏版)》请在冰点文库上搜索。
数字图像处理实习报告
数字图像处理课程综合实习
实习报告
学院
遥感信息工程学院
班级
09031
学号
20
姓名
吴雪薇
日期
2011年5月28日
指导教师
实习一将RAW图像格式转换成BMP图像格式
一、实习目的和意义
熟悉常用的图像文件格式与格式转换,认识各图像格式的优缺点;掌握RAW和BMP格式的存储和读取,编程实现RAW—〉BMP格式的转换,为读取各种格式文件打基础。
二、实习原理和方法
RAW格式:
文件按照数字图像组成的二维矩阵,将像素按行列号顺序存储在文件中。
这种文件只含有图像像素数据,不含有信息头,因此,在读图像时,需要根据文件大小,计算图像所包含的行列号,或者需要事先知道图像大小(矩阵大小)。
但这种文件读取和保存简单。
RAW文件按图像上行到下行、左列到右列顺序存储,而BMP文件数据区按图像上下行到上行、左列列到右列顺序存储到数据区。
实现RAW文件到BMP文件的转换,需要为BMP文件生成文件头、信息头、颜色表、数据区,将RAW文件数据区赋值到BMP文件数据区。
三、实习过程和步骤
1、根据学号新建自己的文件夹:
F:
\*****_20;
2、使用AppWizard生成一个基于多文档的项目20;
3、将CxxxxView类的基类设为CscrollView类,使项目显示图像时支持滚动条;
4、添加菜单项“RAW-〉BMP”,并建立相应的消息处理函数;
5、新建Raw->Bmp对话框,并建立对话框类,为对话框类定义成员变量和成员函数。
6、在函数体内添加自己的代码,实现RAW的读取,并实现RAW到BMP格式的转换功能。
voidCRawToBmpDlg:
:
OnButtonSeeraw()
{
CFileDialogdlg(TRUE);
if(dlg.DoModal()==IDOK)
{
m_sRawIn=dlg.GetPathName();
UpdateData(FALSE);
}
}
voidCRawToBmpDlg:
:
OnButtonSeebmp()
{
CFileDialogdlg(TRUE);
if(dlg.DoModal()==IDOK)
{
m_sBmpOut=dlg.GetPathName();
UpdateData(FALSE);
}
}
voidCRawToBmpDlg:
:
OnOK()
{
UpdateData();
CBmpFilebmpFile;
bmpFile.CreateBmp(m_iHeight,m_iWidth,(m_iGray?
3:
1));
CFilerawFile;
rawFile.Open(m_sRawIn,CFile:
:
modeRead);
rawFile.Read(bmpFile.m_pImgDat,m_iHeight*m_iWidth*(m_iGray?
3:
1));
rawFile.Close();
bmpFile.Save2File(m_sBmpOut);
CDialog:
:
OnOK();
}
7、修改程序编制中出现的各种语法错误和逻辑错误,检查程序运行结果。
四、实习结果分析与评价
本程序能够实现将RAW图像格式转换成BMP图像格式的功能。
正确运用bmpfile.h提供的相关函数实现了上述功能,对位图图像有了了进一步了解。
实习二编写线性灰度变换的程序
一、实习目的和意义
熟悉图像点增强的一般方法,掌握图像点增强的算法和原理,会用编程方法实现其算法。
二、实习原理和方法
点运算是指像素值(即像素点上的灰度值)通过运算改变之后,可以改善图象的显示效果。
这是一种像素的逐点运算,是旧图象与新图象之间的映射关系,是一种简单但却十分有效的一种图象处理手段。
灰度的线性变换就是指图像的中所有点的灰度按照线性灰度变换函数进行变换。
灰度变换方程如下:
该方程为线性方程。
式中参数
为输入图像的像素的灰度值,参数
为输出图像的灰度。
二、实习过程和步骤
1、打开实习一所建的项目20;
2、添加菜单项“线性拉伸”;为该菜单项建立消息处理函数;
3、新建线性拉伸对话框,并建立对话框类,为对话框类定义成员变量和成员函数。
4、在函数定义处添加自己的源代码。
核心代码如下:
for(i=0;ifor(j=0;j{
y=pImg[i*rows+j]*a+b;
if(y<0)y=0;
if(y>255)y=255;
pImg[i*rows+j]=(BYTE)y;
}
5、编译检查语法错误,若编译通过,运行程序,检查是否能实现灰度线性变换。
四、实习结果分析与评价
本程序能够实现图像灰度的线性变换。
能够通过图像灰度的线性变换实现对图像的增强处理,掌握了对图像点处理的原理和方法。
实习三编写局部处理的程序
一、实习目的和意义
熟悉图像局部处理的一般方法,掌握图像局部处理的算法和原理,会用编程方法实现其算法。
二、实习原理和方法
局部处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某一点的像素值。
目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数,目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。
经过处理后,目标像素的值为经过特定算法计算后所得的结果。
三、实习过程和步骤
1、打开项目20;
2、添加菜单项“3x3低通/高通滤波”菜单项;
3、新建3*3滤波对话框,要求用户自己选择滤波算子实现3*3高通或低通滤波。
并建立相应的对话框类,为对话框类定义成员变量和成员函数。
4、为菜单项建立消息处理函数;
5、在函数体内添加实现3x3低通/高通滤波的源代码。
核心代码如下:
for(i=1;ifor(j=1;j{
intp1,p2,p3,p4,p5,p6,p7,p8,p9;
p1=pImg[(i-1)*cols+j-1]*k1;
p2=pImg[(i-1)*cols+j]*k2;
p3=pImg[(i-1)*cols+j+1]*k3;
p4=pImg[i*cols+j-1]*k4;
p5=pImg[i*cols+j]*k5;
p6=pImg[i*cols+j+1]*k6;
p7=pImg[(i+1)*cols+j-1]*k7;
p8=pImg[(i+1)*cols+j]*k8;
p9=pImg[(i+1)*cols+j+1]*k9;
inty;
if((k1+k2+k3+k4+k5+k6+k7+k8+k9)==0)
y=p1+p2+p3+p4+p5+p6+p7+p8+p9;
else
y=(p1+p2+p3+p4+p5+p6+p7+p8+p9)/(k1+k2+k3+k4+k5+k6+k7+k8+k9);
if(y>255)y=255;
if(y<0)y=0;
pDoc->m_bmpfile.m_pImgDat[i*cols+j]=y;
}
6、编译检查语法错误,若编译通过,运行程序,检查是否能实现局部处理算法。
四、实习结果分析与评价
先打开一幅图,点击“3*3高通/低通滤波”,弹出对话框,输入低通滤波算子,点击“OK”,得到低通滤波后的图像,可以看出图像经低通滤波后变得平滑;若使用高通滤波,输入高通滤波算子,可以看出高通滤波使图像的边缘得到增强。
用户还可以根据需要输入其它算子进行相应的滤波运算。
实习四中值滤波
一、实习目的和意义
熟悉图像中值滤波原理和快速排序的方法,编程实现灰度图像中值滤波功能,探讨其去噪特性及其适用性,提高图像增强处理的技能。
二、实习原理和方法
中值滤波是一种典型的低通滤波器,它的目的是去除噪声,同时能保护图像边缘。
中值滤波一般采用一个含有奇数个点的滑动窗口,将窗口中各点灰度值的中值来代替指定点(一般为窗口中心)的灰度值。
对于奇数个元素,中值是取窗口中各元素按由小大排序后中间的灰度值;对于偶数个元素,一般取排序后中间两个元素灰度值的平均值为中值。
三、实习过程和步骤
1、打开项目20;
2、添加菜单项“中值滤波”菜单项;
3、为菜单项建立消息处理函数;
4、在函数体内添加实现中值滤波的源代码。
for(i=1;ifor(j=1;j{
a[0]=pImg[(i-1)*rows+(j-1)];
a[1]=pImg[(i-1)*rows+j];
a[2]=pImg[(i-1)*rows+(j+1)];
a[3]=pImg[i*rows+(j-1)];
a[4]=pImg[i*rows+j];
a[5]=pImg[i*rows+(j+1)];
a[6]=pImg[(i+1)*rows+(j-1)];
a[7]=pImg[(i+1)*rows+j];
a[8]=pImg[(i+1)*rows+(j+1)];
for(s=0;s<9;s++)
{
for(t=s+1;t<9;t++)
{
if(a[t]>a[s])
{
y=a[t];
a[t]=a[s];
a[s]=y;
}
}
}
y=a[4];
if(y<0)y=0;
if(y>255)y=255;
pDoc->m_bmpfile.m_pImgDat[i*rows+j]=(BYTE)y;
}
5、编译检查语法错误,若编译通过,运行程序,检查是否能实现中值滤波算法。
四、实习结果分析与评价
打开一幅图像进行中值滤波处理,可见中值滤波处理后图像变得平滑,能够起到一定的去噪效果。
实习五直方图均衡化
一、实习目的和意义
熟悉直方图均衡化的原理和方法,编程实现直方图均衡化功能,提高图像增强处理的技能。
二、实习原理和方法
直方图均衡化是通过对原图像进行某种变换,使原图像的灰度直方图修正为均匀分布的直方图的一种方法。
三、实习过程和步骤
1、打开所建的项目20;
2、添加菜单项“直方图均衡化”菜单项;
3、为新加的菜单项分别建立消息处理函数;
4、在函数体内添加实现直方图均衡化的源代码。
核心代码如下:
for(i=0;ifor(j=0;j{
intgray=pDoc->m_bmpfile.m_pImgDat[i*cols+j];
h[gray]++;
}
doubleper[256];
for(i=0;i<256;i++)
{
per[i]=0.0;
for(j=0;j<=i;j++)
per[i]+=h[j];
per[i]*=(255.0/(double)(rows*cols));
}
for(i=0;ifor(j=0;j{
intgray=gray=pDoc->m_bmpfile.m_pImgDat[i*cols+j];
pImg[i*cols+j]=(int)per[gray];
}
5、编译检查语法错误,若编译通过,运行程序,检查是否能实现局部处理算法。
四、实习结果分析与评价
打开一幅图像进行直方图均衡化,可见直方图均衡化后图像的对比度变大,许多细节更加清晰,对应的直方图变得平坦多了。
实习六图像平移
一、实习目的和意义
熟悉图像几何处理:
图像平移、旋转、缩放的一般方法,掌握图像几何处理:
图像平移、旋转、缩放的算法和原理,会用编程方法实现其算法
二、实习原理和方法
将图像中所有的点都按照指定的平移量水平、垂直移动。
设(x0,y0)为原图像上的一点,图像水平平移量tx,垂直平移量为ty,则平移后点(x0,y0)的坐标变为(x1,y1)。
(x0,y0)与(x1,y1)之间的关系为:
x1=x0+tx;
y1=y0+ty;
平移后的图像中每个像素的颜色是由原图像中的对应点颜色确定。
三、实习过程和步骤
1、打开项目20;
2、添加菜单项“平移”菜单项;
3、新建平移对话框,要求用户自己分别输入X或Y方向的平移量。
并建立相应的对话框类,为对话框类定义成员变量和成员函数。
4、为菜单项建立消息处理函数;
5、在函数体内添加实现平移的源代码。
for(i=0;ifor(j=0;jnewbmp.m_pImgDat[i*(cols+x)+j]=255;
for(i=0;ifor(j=0;j{
if(((i-y)=0)&&((j-x)=0))
newbmp.m_pImgDat[i*(cols+x)+j]=pDoc->m_bmpfile.m_pImgDat[(i-y)*cols+j-x];
}
pDoc->m_bmpfile=newbmp;
6、编译检查语法错误,若编译通过,运行程序,检查是否能实现平移功能。
四、实习结果分析与评价
打开一幅图像,在弹出的对话框中,分别输入X、Y方向的平移量,点击“OK”,可以看到图像在相应的方向上进行了平移。
实习七图像旋转、转置
一、实习目的和意义
熟悉图像几何处理:
图像平移、旋转、缩放的一般方法,掌握图像几何处理:
图像平移、旋转、缩放的算法和原理,会用编程方法实现其算法
二、实习原理和方法
通常是以图像的中心为圆心旋转,按顺时针方向旋转。
旋转前:
x0=r*cos(b);
y0=r*sin(b);
旋转a角度后:
x1=r*cos(b-a)=r*cos(b)*cos(a)+r*sin(b)*sin(a)=x0*cos(a)+y0*sin(a)
y1=r*sin(b-a)=r*sin(b)*cos(a)-r*cos(b)*sin(a)=-x0*sin(a)+y0*cos(a)
以矩阵的形式表示
坐标系是以图像的中心为原点,向右为x轴正方向,向上为y轴正方向。
它和以图像左上角为原点,向右为x轴正方向,向下为y轴正方向的坐标系之间的转换关系
三、实习过程和步骤
1、打开所建项目20;
2、添加菜单项“旋转”,“转置”;
3、新建旋转对话框,要求用户自己选择旋转角度。
并建立相应的对话框类,为对话框类定义成员变量和成员函数。
4、为该菜单项建立消息处理函数;
5、在函数定义处添加自己的源代码。
旋转核心代码:
doublea=dlg.m_ea*PI/180;
doublesina=sin(a),cosa=cos(a);
doubleOx=(cols-1)/2,Oy=(rows-1)/2;//中心坐标
doublesx1=-Ox,sy1=Oy,
sx2=Ox,sy2=Oy,
sx3=-Ox,sy3=-Oy,
sx4=Ox,sy4=-Oy;//原图像四角坐标
doubledx1=cosa*sx1+sina*sy1,dy1=-sina*sx1+cosa*sy1,
dx2=cosa*sx2+sina*sy2,dy2=-sina*sx2+cosa*sy2,
dx3=cosa*sx3+sina*sy3,dy3=-sina*sx3+cosa*sy3,
dx4=cosa*sx4+sina*sy4,dy4=-sina*sx4+cosa*sy4;//新图四角坐标
Ncols=(int)(max(abs(dx1-dx4),abs(dx3-dx2))+0.5);
Nrows=(int)(max(abs(dy1-dy4),abs(dy2-dy3))+0.5);//定义新的行和列
newbmp.CreateBmp(Ncols,Nrows,1);
f1=-(Ncols-1)/2*cosa-(Nrows-1)/2*sina+Ox;
f2=(Ncols-1)/2*sina-(Nrows-1)/2*cosa+Oy;
for(i=0;ifor(j=0;jnewbmp.m_pImgDat[i*Ncols+j]=255;
for(i=0;ifor(j=0;j{
inty=(int)(-sin(a)*j+cos(a)*i+f2+0.5);
intx=(int)(cos(a)*j+sin(a)*i+f1+0.5);
if(y>=0&&y=0&&xnewbmp.m_pImgDat[i*Ncols+j]=pDoc->m_bmpfile.m_pImgDat[y*cols+x];
}
pDoc->m_bmpfile=newbmp;
转置核心代码:
for(i=0;ifor(j=0;jnewbmp.m_pImgDat[i*Ncols+j]=pImg[j*cols+i];
6、编译检查语法错误,若编译通过,运行程序,检查是否能实现旋转变换。
四、实习结果分析与评价
打开一幅图像,点击“旋转”,输入相应的旋转角度,可以看到图像进行了相应的旋转变换。
同理,点击“转置”,可以实现对图像的转置变换。
实习八图像缩放
一、实习目的和意义
熟悉图像几何处理:
图像平移、旋转、缩放的一般方法,掌握图像几何处理:
图像平移、旋转、缩放的算法和原理,会用编程方法实现其算法
二、实习原理和方法
假设放大因子为ratio,缩放的变换矩阵为:
三、实习过程和步骤
1、打开所建项目20;
2、添加菜单项“缩放”;
3、新建缩放对话框,要求用户自己分别选择X方向和Y方向的缩放系数,如果用户不选择,则默认缩放系数为1,即既不放大也不缩小。
并建立相应的对话框类,为对话框类定义成员变量和成员函数。
4、为该菜单项建立消息处理函数;
5、在函数定义处添加自己的源代码。
for(i=0;ifor(j=0;jnewbmp.m_pImgDat[i*c+j]=255;
for(i=0;ifor(j=0;j{
inty=(int)(i/sy);
intx=(int)(j/sx);
if((y>=0&&y=0&&xnewbmp.m_pImgDat[i*c+j]=Op[y*cols+x];
}
pDoc->m_bmpfile=newbmp;
6、编译检查语法错误,若编译通过,运行程序,检查是否能实现缩放变换。
四、实习结果分析与评价
打开一幅图像,点击“缩放”,在弹出的缩放对话框中分别输入X、Y方向的缩放系数,如果用户不选择,则默认缩放系数为1,即既不放大也不缩小。
然后点击“OK”,可以看到图像在相应方向上的缩放变换。
实习九灰度图像边缘检测
一、实习目的和意义
熟悉图像几何处理:
图像平移、旋转、缩放的一般方法,掌握图像几何处理:
图像平移、旋转、缩放的算法和原理,会用编程方法实现其算法
二、实习原理和方法
图像边缘检测的原理与局部处理类似,采用卷积算法来实现。
卷积可以简单地看成加权求和的过程。
卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。
这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即为区域中心像素的新值。
三、实习过程和步骤
1、打开所建项目20;
2、添加菜单项“边缘检测”→“Roberts算子”,“Prewitt算子”,“Sobel算子”,“Laplace算子”,“自定义算子”;
3、新建自定义算子对话框,要求用户自己自己输入边缘检测算子。
并建立相应的对话框类,为对话框类定义成员变量和成员函数。
4、分别为各种算子菜单项建立消息处理函数;
5、分别在函数定义处添加自己的源代码。
以Roberts算子为例,其核心代码:
for(i=0;ifor(j=0;j{
inty=pImg[i*cols+j]*(-1)+pImg[(i+1)*cols+j+1];
if(y>255)y=255;
if(y<0)y=0;
pDoc->m_bmpfile.m_pImgDat[i*cols+j]=y;
}
6、编译检查语法错误,若编译通过,运行程序,检查是否能实现。
四、实习结果分析与评价
打开一幅图像,点击“边缘检测”,选择相应的算子,观察不同算子对图像边缘检测的效果差异。
如果用户想要自己输入算子,可以选择“自定义算子”,在弹出的自定义算子对话框中输入相应的算子即可。
实习十图像二值化
一、实习目的和意义
加深对图像分割的理解,掌握最简单图像分割的原理与方法,提高图像处理与分析能力与实际动手能力。
二、实习原理与方法
状态法(峰谷法):
如果一幅灰度图像的直方图有双峰和明显的谷,那么选择两峰之间的谷所对应的T作为阈值,对图像进行分割。
判断分析法:
假定图像的灰度区间为[0,L-1],则选择一阈值T将图像的像素分为两组。
显然,组内方差越小,则组内像素越相似;组间方差越大,则组间的差别越大。
因此
为最大值所对应的T,就是所求判断分析法的分割阈值。
三、实习过程和步骤
1、添加菜单项“状态法(峰谷法)”,“判断分析法”,“熵值法”,“自定义阈值”;
2、分别为菜单项建立消息处理函数,并在函数定义处添加自己的源代码。
以状态法和判断分析法为例:
状态法核心代码:
for(i=0;ifor(j=0;j{
intgray=pImg[i*cols+j];
hist[gray]++;
}
intt,nt=127;
for(i=0;t!
=nt&&i<100;i++)
{
t=nt;
doublep1=0.0,p2=0.0;
ints1=0,s2=0;
for(j=0;j<=t;j++)
{
p1+=(double)(j*hist[j]);
s1+=hist[j];
}
doublev1=p1/s1;//阈值左边的灰度均值
for(j=t+1;j<=255;j++)
{
p2+=(double)(j*hist[j]);
s2+=hist[j];
}
doublev2=p2/s2;//阈值右边灰