图像的几何变换之坐标映射

图像的几何变换是指在不改变图像像素值得前提下,对图像进行空间几何变换,常见的几何变换有距离变换,坐标映射、平移、镜像、旋转、缩放、放射变换等。图像的几何处理是图形处理和分析的基础,应用广泛,如字符矫正、车牌区域水平与垂直矫正及图像特征分析识别等。
坐标映射
图像的坐标映射是通过原图像与目标图像之间建立一种映射关系,这种映射关系有两种:一种就是计算原图像任意像素在映射后图像的坐标位置;二是计算变换后图像任意像素反映射的坐标位置。有原图像映射到目标图像成为正映射,反之,由目标图像通过映射关系到原图像成为反映社。由于正映射往往会映射不完全以及出现映射重复现象,一般在图像处理的过程中采用反映社的方式来保证输出木匾图像的每个像素点都可以通过映射关系在源图像中唯一的找到对应的像素。
opencv提供重映射的相关操作,重映射是指把一个图像中一个位置的像素通过映射关系转换到另以图像的对应位置。通过映射实现得到的目标图像可能存在图像像素值非整数情况,一般我们考虑插值或者向上取整。
代码实现如下:
#include 
#include 
#include 
#include 
int main()
{
    //读取原图像
    cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\1.jpg");
    cv::imshow("原图像", srcImage);
    if (srcImage.empty())
    {
        return -1;
    }
    //输出矩阵定义
    cv::Mat resultImage(srcImage.size(), srcImage.type());
    //x与y的方向矩阵
    cv::Mat xMapImage(srcImage.size(), CV_32FC1);
    cv::Mat yMapImage(srcImage.size(), CV_32FC1);
    //取图像的宽高
    int rows = srcImage.rows;
    int cols = srcImage.cols;
    //遍历图像
    for (int j=0; j
    {
        for (int i=0; i
        {
            //x与y均翻转
            xMapImage.at<float>(j,i) = cols - i;
            yMapImage.at<float>(j,i) = rows - j;
        }
    }
    //重映射操作
    remap(srcImage, resultImage, xMapImage, yMapImage, CV_INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
    //输出结果
    cv::imshow("rusultImage", resultImage);
    cv::waitKey(0);
    return 0;
}  

你可能感兴趣的:(opencv)