图像镜像分为水平镜像、垂直镜像和对角镜像三种:水平镜像是指将图像的左右部分以图像垂直中轴线为中心进行镜像对换;垂直镜像是将图像的上下两部分以图像水平中轴线为中心进行镜像对换;对角镜像是将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换,相当于将图像先后进行水平镜像和垂直镜像。下面具体阐述不同镜像的变换方法。
假设原图像的高度为h,宽度为w,变换后,图像的尺寸不变。那么原图像中(x0,y0)经过水平镜像后坐标变为(w-1-x0,y0)。用矩阵表示为:
逆变换为:
即
同理图像经过垂直镜像变换后的逆运算为
对角镜像的逆运算为:
主要代码如下:
void Mirror(const Mat &srcImage, Mat &dstImage, int flag)
{
dstImage.create(srcImage.size(), srcImage.type());
int nRowNum = srcImage.rows;
int nColNum = srcImage.cols;
switch(flag)
{
//水平镜像
case 1:
for(int i = 0; i < nRowNum; i++)
{
for(int j = 0; j < nColNum; j++)
{
dstImage.at<Vec3b>(i, j) = srcImage.at<Vec3b>(nRowNum - i - 1, j);
}
}
break;
//垂直镜像
case 2:
for(int i = 0; i < nRowNum; i++)
{
for(int j = 0; j < nColNum; j++)
{
dstImage.at<Vec3b>(i, j) = srcImage.at<Vec3b>(i, nColNum - j - 1);
}
}
break;
//对角镜像
case 3:
for(int i = 0; i < nRowNum; i++)
{
for(int j = 0; j < nColNum; j++)
{
dstImage.at<Vec3b>(i, j) = srcImage.at<Vec3b>(nRowNum - i - 1, nColNum - j - 1);
}
}
}
}