数字图像处理论文.docx
《数字图像处理论文.docx》由会员分享,可在线阅读,更多相关《数字图像处理论文.docx(12页珍藏版)》请在冰豆网上搜索。
数字图像处理论文
数字图像处理
实验报告
班级:
学号:
姓名:
序号:
图像的几何变换
一、实验目的
1、 掌握图像几何变换的基本原理
2、 掌握如何利用VC++对图像进行几何变换(图像缩小、放大、旋转、裁剪等)
3、 学会自己编写简单几何变换的程序
二、实验内容
1、 对所选图像进行平移操作
2、 对所选图像进行缩放操作
3、 对所选图像进行旋转操作
三、图像的相关几何变换
<一>图像平移
1.理论基础
图像平移(Translation)是将图像中所有的点都按照指定的平移量,进行水平、垂直移动。
设初始坐标为(x0,y0)的点
经过平移(tx,ty)后
坐标变为(x1,y1)。
显然(x0,y0)和(x1,y1)的关系如下:
X1=x0+tx
Y1=y0+ty
2.流程设计
(1)取得原图的数据区指针。
(2)通过对话框输入偏移量tx,ty。
(3)开辟一个同样大小的缓冲区。
(4)对原图依次循环每个像素,每读入一个像素点(x0,y0),根据它的坐标,找到目标图像的位置(x1=x0-tx,y1=y0-ty),将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。
3.编程实现
(LPBYTE)p_data+lLineBytes*(height-1-j)+i;
inti0,j0;
//计算该象素在新DIB中的坐标
i0=i+mfor(i=0;i{for(intj=0;j{//计算该象素在源DIB中的坐标
lpSrc=_Xmove;
j0=j+m_Ymove;
if((i0>=0)&&(i0=0)&&(j0{lpDst=(LPBYTE)temp+lLineBytes*(height-1-j0)+i0;
*lpDst=*lpSrc;//复制象素
}
else
{
*((unsignedchar*)lpDst)=255;//对于源图中没有的象素,直接赋值为255
}
}
}
4.实验结果对比
<二>图像的镜像变换
1.理论基础
图像的镜像变换分为两种:
一种是水平镜像,另一种是垂直镜像。
图像的水平镜像操作是以原图像的垂直中轴线为中心,将图像分为左右两部分进行对称变换;
图像的垂直镜像操作是以原图像的水平中轴线为中心,将图像分为上下两部分进行对称变换。
镜像变换后图的高和宽都不变
设图像高度为Height,宽度为Width,
原图中的(x0,y0)经过水平镜像后,
坐标将变成(Width-x0,y0)。
即:
x1=Width-x0
y1=y0
2.流程设计
(1)取得原图的数据区指针。
(2)开辟一个同样大小的缓冲区。
(3)每个像素依次循环。
在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标(用图像的宽度减去坐标值)在显示到图像上。
垂直镜像中,则对垂直坐标做相应的处理。
3.编程实现----水平镜像
for(j=0;jfor(i=0;i{
lpSrc=(LPBYTE)p_data+wide*j+i;
lpDst=(LPBYTE)temp+wide*j+wide-i;
*lpDst=*lpSrc;
}
for(i=0;ifor(j=0;j{
lpSrc=(LPBYTE)p_data+wide*j+i;
lpDst=(LPBYTE)temp+wide*(height-j-1)+i;
*lpDst=*lpSrc;
}
4.实验结果对比
(a)原图(b)水平镜像处理效果图(c)垂直镜像处理效果图
<三>图像的缩放
1.理论基础
假设图像X轴方向缩放比率是kx,Y轴方向缩放比率是ky,那么原图中点(x0,y0)对应与新图中的点(x1,y1)为:
x1=x0*kx
y1=y0*ky
当kx>1且ky>1时,原图像被放大。
放大图像时,产生了新的像素,可通过插值算法来近似处理。
例如:
当kx=ky=2时,图像放大2倍,
原图中的某一个像素,对应新图的4个像素。
●●
●●●
(a)原图中的某一个像素(b)对应新图的4个像素
当kx<1且ky<1时,原图像被缩小。
例如,当kx=ky=0.5时,图像被缩到一半大小,原图中4个像素对应新图中的一个像素。
此时缩小后的图像中的(0,0)像素对应于原图中的(0,0)、(0,1)、(1,0)、(1,1)像素一个;
以此类推。
在原图基础上,每行隔一个像素取一点,每割一行进行操作。
如下图3-4所示。
●●●
●●
(a)原图中的某4个像素(b)对应新图的1个像素
2.流程设计
(1)取得原图的数据区指针。
(2)通过对话框获得放大整数比例:
kx,ky。
更改图象的宽度和高度。
(3)每个像素依次循环。
计算该象素在原图象中的坐标,将原图的象素值赋给目标象素相应位置kx*ky个值。
3.编程实现----放大图像
//针对图像每行进行操作
for(j=0;j{//针对图像每列进行操作
for(i=0;i{//指向源DIB第i0行,第j0个象素的指针
lpSrc=(LPBYTE)p_data+wide*j+i;
//复制象素
for(intn=0;nfor(intm=0;m{
lpDst=(LPBYTE)temp+newwide*(j*k1+n)+i*k2+m;
*lpDst=*lpSrc;
}
}
}
for(j=0;j{//针对图像每列进行操作
for(i=0;i{//指向新DIB第i行,第j个象素的指针,注意此处宽度和高度是新DIB的宽度和高度
lpDst=(LPBYTE)hDIB+newwide*j+i;
//计算该象素在源DIB中的坐标
j0=(LONG)(j/yzoom+0.5);
i0=(LONG)(i/xzoom+0.5);
if((i0>=0)&&(i0=0)&&(j0{//指向源DIB第i0行,第j0个象素的指针
lpSrc=(LPBYTE)p_data+wide*j0+i0;
*lpDst=*lpSrc;//复制象素
}
else
*lpDst=255;//对于源图中没有的象素,直接赋值为255
}
}
4.实验结果对比
(a)原图(b)长宽缩小0.5倍的效果图
(c)长宽各放大2倍的效果图
<四>图像的旋转
1.理论基础
图像的旋转必须指明图像绕着什么旋转。
一般以图像的中心为原点,旋转一定的角度。
旋转后,图像的大小一般会改变。
在旋转前:
x0=γcos(β)
y0=γsin(β)
旋转后:
x1=γcos(β-α)=γcos(β)cos(α)+γsin(β)sin(α)
=x0cos(α)+y0sin(α)
y1=γsin(β-α)=γsin(β)cos(α)-γcos(β)sin(α)
=-x0sin(α)+y0cos(α)
2.流程设计
(1)以图像的中心为原点,旋转一定的角度。
根据下图,将坐标系Ⅰ变成坐
(2)根据旋转公式,将该点顺时针旋转α角;
(3)将坐标系Ⅱ变成坐标系Ⅰ。
3.编程实现
num1=(double)(-0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold);
num2=(double)(0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold);
for(y1=0;y1{
for(x1=0;x1{//x0,y0为对应的原图上的坐标
x0=(DWORD)(x1*cosa+y1*sina+num1);
y0=(DWORD)(-1.0f*x1*sina+y1*cosa+num2);
if((x0>=0)&&(x0=0)&&(y0{
lpPtr=lpSrc+y0*Wold+x0;
lpTempPtr=lpTemp+y1*Wnew+x1;
*lpTempPtr=*lpPtr;//进行象素的复制
}
}
}
4.实验结果对比
四、实验结论
在本实验中,我学到了很多东西,如在图像的平移中,我知道了经典的图像平移有两种算法,一种不会改变图像大小,另一种可以相应扩大图像。
本程序采用了第一种算法。
为了使图像能按照用户指定的水平平移量和垂直平移量移动,首先定义了一个参数设定窗,并在图像平移菜单的事件处理函数中对此对话框进行定义,获取平移量。
然后调用图像平移函数,从而实现将图像中所有的点(像素)都按照指定的平移量水平、垂直移动,平移后的图像上的每一点都可以在原图像中找到对应的点;在图像的缩放中,程序将图像按用户设定的X轴方向的缩放比率和Y轴方向的缩放比率进行缩放。
此操作产生的图像中的像素可能在原图中找不到相应的像素点,因此必须进行近似处理。
此处理有多种方法,可以采用最邻近插值算法,也可以采用别的插值算法。
后者处理效果要好一些,但是运算量也相应增加很多,因此本程序采用前者,即最邻近插值算法。
最后,由于缩放改变了图像的高度和宽度,因此还需要对DIB头文件的高度和宽度信息进行更新;在图像的旋转中,程序将图像以图像中心为原点,按照用户设定的旋转角度进行旋转。
和图像的平移一样,可以采用不同的算法,既可以把转出显示区域的部分图像截去,也可以扩大图像范围以显示所有图像,在本程序中采用后者。
同时为了减小运算量,将图像以图像中心为坐标系原点进行旋转,而不是用户指定的任意一点。
该程序比较简单,还有许多不足:
作为图像处理的一个重要的组成部分,支持任意格式图像的读写操作,是不可缺少的部分。
但本程序考虑到灰度图使用比较方便,故只实现了BMP格式的读写,对其他格式,例如GIF,JPEG,PCX格式的图像则未做处理。
要实现这一部分,必须了解每种格式的存储结构,对不同的格式定义不同的数据结构和函数库…..
通过该程序,我对计算机图像处理的基础理论和操作有了初步认识,对VisualC++开发应用程序的流程、消息映射机制、应用程序执行过程等有了进一步的理解,深刻体会到了C++高效和简洁的特点,为以后的学习打下了一定的基础。