![数字图像处理与机器视觉:Visual C++与Matlab实现(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/381/22651381/b_22651381.jpg)
4.3 图像镜像
镜像变换又分为水平镜像和竖直镜像。水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行对换;而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线为中心轴进行对换,如图4.4所示。
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0108_0001.jpg?sign=1739015129-SXZxcYouAgaWOJ048mAocMNL1HhwbU9a-0-0b6f19e30fadbce87e74aa55b0ddc036)
图4.4 镜像变换,其中心轴在图中以虚线标出
4.3.1 图像镜像的变换公式
◆ 水平镜像的变换关系为:
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0108_0002.jpg?sign=1739015129-lLgAdNMSHUUFnMHHVGRy7SlASXTcyMYd-0-071f9fe0cd84b6f29dbe0b6c2f7f8081)
◆ 竖直镜像的变换关系可形式化地描述如下:
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0108_0003.jpg?sign=1739015129-8DbhNDMuy1a5xI52CDjQllUEnDe2wOSj-0-b415e67788f2cf6eb0a5103cd6c99670)
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0109_0001.jpg?sign=1739015129-5Hnk1FLhFjLiDkclcP36Z7CCH7DJkxJi-0-48d66c6bf342d97643abb5cd2cf7be56)
4.3.2 图像镜像的实现
1.MATLAB编程实现
Imtransform()函数用于完成一般的二维空间变换,形式如下。
B = imtransform(A, TFORM, method);
• 参数A为要进行几何变换的图像。
• 空间变换结构TFORM指定了具体的变换类型。
• 可选参数method允许为imtransform()函数选择的插值方法,其合法值如表4.1所示。
表4.1 参数methocl的合法值
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0109_0002.jpg?sign=1739015129-t9MALGWcImfvr2FyDRxZh00gg7lgCPTP-0-8f009894a89abb2ee5fdf53c6cf9b54a)
这些插值方式的具体含义请参见4.7节。默认时为双线性插值——'bilinear'。
函数输出B为经imtransform()变换后的目标图像。
可以通过两种方法来创建TFORM结构,即使用maketform()函数和cp2tform()函数。cp2tform是一个数据拟合函数,它需要原图像与目标图像之间的对应点对儿作为输入,用于确定基于控制点对儿的几何变换关系,本书将在4.8节图像配准中对它进行介绍;这里仅给出使用maketform()函数获得TFORM结构的方法。
T=maketform(transformtype, Matrix);
• 参数transformtype指定了变换的类型,如常见的’affine’为二维或多维仿射变换,包括平移、旋转、比例、拉伸和错切等。
• Matrix为相应的仿射变换矩阵。
镜像变换程序的代码如下。
% 镜像变换 A=imread('girl.bmp'); [height, width, dim]=size(A); tform = maketform('affine', [-1 0 0;0 1 0; width 0 1]); %定义水平镜像变换矩阵 B = imtransform(A, tform, 'nearest'); tform2 = maketform('affine', [1 0 0;0-1 0; 0 height 1]); %定义竖直镜像变换矩阵 C = imtransform(A, tform2, 'nearest'); subplot(1,3,1), imshow(A); title(’原图像’); subplot(1,3,2), imshow(B); title(’水平镜象’); subplot(1,3,3), imshow(C); title(’竖直镜象’);
运行结果如图4.5所示。
![](https://epubservercos.yuewen.com/E09B87/11229143803763806/epubprivate/OEBPS/Images/figure_0110_0001.jpg?sign=1739015129-vdEev6zbMHbV9d56D9wFvlskrlmooBkj-0-c6e7ca688fc199a59acc35ea5ea19ecc)
图4.5 镜像变换效果图
2.Visual C++实现
(1)水平镜像的Visual C++实现。
/******************* void CImgProcess::HorMirror(CImgProcess * pTo) 功能: 图像的水平镜像 注: 图像左右镜像 参数: CImgProcess * pTo:处理后得到的图像的CImgProcess指针 返回值: 无 *******************/ void CImgProcess::HorMirror(CImgProcess* pTo) { int nHeight = pTo->GetHeight(); int nWidth = pTo->GetWidthPixel(); int i, j; int u; for(i=0; i<nWidth; i++) { u=nWidth-i-1; for(j=0; j<nHeight; j++) { pTo->SetPixel(i, j, GetPixel(u, j)); }//for j }//for i }
HorMirror()函数的调用方式如下所示。
// 调用HorMirror()函数实现图像水平镜像 imgInput.HorMirror(&imgOutput); // 将结果返回给文档类 pDoc->m_Image = imgOutput;
读者可以通过示例程序DIPDemo中的菜单命令“几何变换→水平镜像”来观察处理效果。
(2)竖直镜像的Visual C++实现。
/******************* void CImgProcess::VerMirror(CImgProcess * pTo) 功能: 图像的竖直镜像 注: 图像上下镜像 参数: CImgProcess * pTo:处理后得到的图像的CImgProcess指针 返回值: 无 *******************/ void CImgProcess::VerMirror(CImgProcess* pTo) { int nHeight = pTo->GetHeight(); int nWidth = pTo->GetWidthPixel(); int i, j; int u=0; for(i=0; i<nWidth; i++) { for(j=0; j<nHeight; j++) { u=nHeight-j-1; pTo->SetPixel(i, j, GetPixel(i, u)); }//for j }//for i }
VerMirror()函数的调用方式如下所示。
// 调用VerMirror()函数实现图像竖直镜像 imgInput.VerMirror(&imgOutput); // 将结果返回给文档类 pDoc->m_Image = imgOutput;
读者可以通过示例程序DIPDemo中的菜单命令“几何变换→竖直镜像”来观察处理效果。