MFC空间几何变换之图像平移、镜像、旋转、缩放详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC空间几何变换之图像平移、镜像、旋转、缩放详解

一. 图像平移

前一篇文章讲述了图像点运算(基于像素的图像变换),这篇文章讲述的是图像几何变换:在不改变图像内容的情况下对图像像素进行空间几何变换的处理方式。

点运算对单幅图像做处理,不改变像素的空间位置;代数运算对多幅图像做处理,也不改变像素的空间位置;几何运算对单幅图像做处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法。

空间变换操作包括简单空间变换、多项式卷绕和几何校正、控制栅格插值和图像卷绕,这里主要讲述简单的空间变换,如图像平移、镜像、缩放和旋转。主要是通过线性代数中的齐次坐标变换。

图像平移坐标变换如下:

运行效果如下图所示,其中BMP图片(0,0)像素点为左下角。

其代码核心算法:

1.在对话框中输入平移坐标(x,y) m_xPY=x,m_yPY=y

2.定义Place=dlg.m_yPY*m_nWidth*3 表示当前m_yPY行需要填充为黑色

3.新建一个像素矩阵 ImageSize=new unsigned char[m_nImage]

4.循环整个像素矩阵处理

for(int i=0 ; i

if(i

else if(i>=Place && countWidth

ImageSize[i]=black; countWidth++; continue;

}

else if(i>=Place && countWidth>=dlg.m_xPY*3) {//图像像素平移区域

ImageSize[i]=m_pImage[m_pImagePlace];//原(0,0)像素赋值过去

m_pImagePlace++; countWidth++;

if(countWidth==m_nWidth*3) { //一行填满 m_pImagePlace走到(0,1)

number++; m_pImagePlace=number*m_nWidth*3;

}

}

}

5.写文件绘图fwrite(ImageSize,m_nImage,1,fpw)

第一步:在ResourceView资源视图中,添加Menu子菜单如下:(注意ID号)

第二步:设置平移对话框。将试图切换到ResourceView界面--选中Dialog,右键鼠标新建一个Dialog,并新建一个名为IDD_DIALOG_PY。编辑框(X)IDC_EDIT_PYX 和(Y)IDC_EDIT_PYY,确定为默认按钮。设置成下图对话框:

第三步:在对话框资源模板空白区域双击鼠标—Create a new class创建一个新类--命名为CImagePYDlg。会自动生成它的.h和.cpp文件。打开类向导(Ctrl W),选择类名:CImagePYDlg添加成员变量如下图所示,同时在Message Maps中生成ID_JHBH_PY实现函数。

第四步:在CImageProcessingView.cpp中添加头文件#include "ImagePYDlg.h",并实现平移。[cpp]view plain copy

1./********************************************************/

2./* 图像空间几何变换:图像平移 ID_JHBH_PY(几何变换-平移)

3./* 使用平移对话框:CImagePYDlg dlg

4./* 算法:f(x,y)=f(x+x0,y+y0)图像所有点平移,空的补黑'0'

5./* 注意该图像平移方法只是从左上角(0,0)处开始平移

6./* 其他方向原理相同自己去实现

7./********************************************************/

8.

9.void CImageProcessingView::OnJhbhPy()

10.{

11.if(numPicture==0) {

12. AfxMessageBox("载入图片后才能空间平移!",MB_OK,0);

13.return;

14. }

15.//定义采样对话框也是用来空间变换平移的坐标

16. CImagePYDlg dlg;

17.if( dlg.DoModal()==IDOK ) //显示对话框

18. {

19.//采样坐标最初为图片的自身像素

20.if( dlg.m_xPY>m_nWidth || dlg.m_yPY>m_nHeight ) {

21. AfxMessageBox("图片平移不能为超过原图长宽!",MB_OK,0);

22.return;

23. }

24. AfxMessageBox("图片空间变换-平移!",MB_OK,0);

25.

26.//打开临时的图片读写文件

27.FILE *fpo = fopen(BmpName,"rb");

28.FILE *fpw = fopen(BmpNameLin,"wb+");

29. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

30. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

31. fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);

32. fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

33. fread(m_pImage,m_nImage,1,fpo);

34.

35./************************************************************/

36./* 图片空间变换-平移

37. /* 坐标(dlg.m_xPY,dlg.m_yPY)表示图像平移的坐标

38. /* 先用Plave计算出平移后的起始坐标,其他的坐标赋值为'0'黑色

39. /* 然后依次平移坐标,空的赋为黑色,否则填充

相关文档
最新文档