图像处理学习笔记之图像的几何变换(4)镜像变换

图像镜像分为水平镜像、垂直镜像和对角镜像三种:水平镜像是指将图像的左右部分以图像垂直中轴线为中心进行镜像对换;垂直镜像是将图像的上下两部分以图像水平中轴线为中心进行镜像对换;对角镜像是将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换,相当于将图像先后进行水平镜像和垂直镜像。下面具体阐述不同镜像的变换方法。

假设原图像的高度为h,宽度为w,变换后,图像的尺寸不变。那么原图像中(x0y0)经过水平镜像后坐标变为(w-1-x0y0)。用矩阵表示为:

 

逆变换为:

 

 

 

 

 

 

同理图像经过垂直镜像变换后的逆运算为

 

对角镜像的逆运算为:

 

 

 

主要代码如下:

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);
            }
        }
    }
}

在opencv中可以使用flip函数可以很方便的实现图像镜像变换。函数原型如下:

void cv::flip(InputArray src, OutputArray dst, int flipCode);

  • src:输入图像
  • dst:输出图像
  • flipCode: 用于指定如何翻转图像的标志;0表示绕x轴翻转,正值(例如1)表示绕y轴翻转。负值(例如-1)表示围绕两个轴翻转。

因此,实现水平镜像、翻转镜像和对角镜像的代码分别是:

flip(srcImage, dstImage, 0); //水平镜像
flip(srcImage, dstImage, 1); //垂直镜像
flip(srcImage, dstImage, -1); //对角镜像

 

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值