图像镜像变换

图像镜像:

  1. 水平镜像: 将图像的左右部分以图像的垂直中轴线为对称线进行镜像变换 
  2. 垂直镜像:将图像的上下部分以图像的水平中轴线为对称线进行镜像变换 
  3. 对角镜像:将图像以图像水平中轴线和垂直中轴线的交点为中心进行镜像对换,相当于将图像先后进行水平镜像和垂直镜像

假设原图像的高度为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);
            }
        }
    }
}

上述内容和代码参考 https://blog.csdn.net/linshanxian/article/details/68945307,代码还没尝试跑过

通过对上述内容的理解,其中的水平镜像和垂直镜像都是关于图像的中轴线进行镜像变换的,那如果不是中轴线呢?

比如图像绕着x=W/2-d(0<d<W)进行镜像变换,那对应的结果是怎样的?

自己理解应该是将超出对称部分的像素赋值为255或者0,如下所示赋值为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值