数字图像处理论文2010
时间:2026-01-27
时间:2026-01-27
数字图像处理
数字图像处理
实验报告
班级:
学号姓名
序号:
数字图像处理
图像的几何变换
一、实验目的
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;
int i0,j0;
// 计算该象素在新DIB中的坐标
i0 = i+mfor( i = 0; i < wide; i++)
{ for(int j = 0; j < height; j++)
{ // 计算该象素在源DIB中的坐标
lpSrc =_Xmove;
j0 = j + m_Ymove;
if( (i0 >= 0) && (i0 < wide) && (j0 >= 0) && (j0 < height)) // 判断是否在新图范围内 { lpDst = (LPBYTE)temp + lLineBytes *(height - 1 - j0) + i0;
*lpDst = *lpSrc; // 复制象素
}
else
{
* ((unsigned char*)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 < height; j++)
for(i = 0; i < wide;i++)
{
lpSrc = (LPBYTE)p_data +wide *j + i;
lpDst = (LPBYTE)temp + wide* j+ wide - i; *lpDst = *lpSrc; }
for(i = 0; i < wide;i++)
for(j = 0; j < height; 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 < newheight-1; j++)
{// 针对图像每列进行操作
for(i = 0; i < newwide-1; i++) for(j = 0; j < height-1; j++) { // 针对图像每列进行操作 for(i = 0; i < wide-1; i++) { // 指向源DIB第i0行,第j0个象素的指针 } lpSrc = (LPBYTE)p_data + wide * j + i; // 复制象素 for(int n=0;n<k1;n++) for(int m=0;m<k2;m++) { *lpDs …… 此处隐藏:2550字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:科隆2300质量流量计
下一篇:南邮通信原理a课件 第3章