《数字图像处理》图像的几何变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理
----图像的几何变换
杨淑莹教授
天津理工大学计算机与通信工程学院
图像的几何变换
图像的转置 图像的缩放
1.图像的转置
1)理论基础
图像的转置(Transpose)操作是将图像像素的x坐标和y坐标互换。该操作将改变图像的高度和宽度,转置后图像的高度和宽度将互换。
x1=y0
y1=x0
2)理论验证
图3-6 图像转置
3)流程设计
(1) 取得原图的数据区指针。
(2) 通过对话框输入偏移量tx,ty。
(3) 开辟一个同样大小的缓冲区。
(4) 对原图依次循环每个像素,
每读入一个像素点(x0,y0),根据它的坐标,找到目标图像的位置(x1=y0,y1=x0),
将像素(x0,y0)处的颜色值赋给新图中的(x1,y1)。
4)编程实现
for(j= 0; j < height; j++)
// 针对每行图像每列进行操作
for(i = 0; i < wide;i++)
{
// 指向源DIB第j行,第i个象素的指针
lpSrc= (LPBYTE)p_data+ lLineBytes* j + i;
// 指向转置DIB第i行,第j个象素的指针
// 注意此处wide和height是源DIB的宽度和高度,应该互换
lpDst= (LPBYTE)temp + lNewLineBytes* i+ j;
// 复制象素
*lpDst= *lpSrc;
}
2.图像的缩放
理论基础
假设图像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个像素
图3-3 图像放大示意图
当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个像素
图3-4 图像缩小示意图
从上可见,放大与缩小的处理方式不同。
3)理论验证
(c )长宽各放大2
倍的效果图(a )原图(b )长宽缩小0.5倍的效果图
4)流程设计
(1) 取得原图的数据区指针。
(2) 通过对话框获得放大整数比例:kx,ky。
更改图象的宽度和高度。
(3) 每个像素依次循环。计算该象素在原图象中的坐标,将原图的像素值赋给目标象素相应位置kx*ky 个值。
// 针对图像每行进行操作
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 for(int m=0;m { lpDst= (LPBYTE)temp + newwide*(j*k1+ n) + i*k2+m; *lpDst= *lpSrc; } } } for(j = 0; j < newheight-1; j++) {// 针对图像每列进行操作 for(i= 0; i < newwide-1; 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 < wide) && (j0 >= 0) && (j0 < height)) // 判断是否在源图范围内 {// 指向源DIB第i0行,第j0个象素的指针 lpSrc= (LPBYTE)p_data + wide * j0 + i0; *lpDst= *lpSrc; // 复制象素 } else *lpDst= 255; // 对于源图中没有的象素,直接赋值为255 } } THE END 感谢各位专家指导!