《数字图像处理》图像的几何变换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

感谢各位专家指导!

相关文档
最新文档