数字图像处理论文.docx

上传人:b****5 文档编号:8199768 上传时间:2023-01-29 格式:DOCX 页数:12 大小:508.63KB
下载 相关 举报
数字图像处理论文.docx_第1页
第1页 / 共12页
数字图像处理论文.docx_第2页
第2页 / 共12页
数字图像处理论文.docx_第3页
第3页 / 共12页
数字图像处理论文.docx_第4页
第4页 / 共12页
数字图像处理论文.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数字图像处理论文.docx

《数字图像处理论文.docx》由会员分享,可在线阅读,更多相关《数字图像处理论文.docx(12页珍藏版)》请在冰豆网上搜索。

数字图像处理论文.docx

数字图像处理论文

 

数字图像处理

实验报告

 

班级:

学号:

姓名:

序号:

 

图像的几何变换

一、实验目的

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;j

for(i=0;i

{

lpSrc=(LPBYTE)p_data+wide*j+i;

lpDst=(LPBYTE)temp+wide*j+wide-i;

*lpDst=*lpSrc;

}

for(i=0;i

for(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;n

for(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++高效和简洁的特点,为以后的学习打下了一定的基础。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1