OpenCV中使用remap实现图像的重映射。

        重映射是指将图像中的某一像素值赋值到指定位置的操作:g(x,y) = f ( h(x,y) ),
在这里, g( ) 是目标图像, f() 是源图像, 而h(x,y) 是作用于 (x,y) 的映射方法函数。为了完成映射过程, 需要获得一些插值为非整数像素的坐标,因为源图像与目标图像的像素坐标不是一一对应的。

        remap函数定义:

void remap(
    InputArray src, //输入图像
    OutputArraydst, //输出图像
    InputArray map1,//第一个映射
    InputArray map2, //第二个映射
    int interpolation, //插值方式
    intborderMode=BORDER_CONSTANT, //边界处理方式,可以通过borderValue设置值
    const Scalar& borderValue=Scalar() //边界指
)
  • 第三个参数,InputArray类型的map1,它有两种可能的表示对象:
    表示点(x,y)的第一个映射。
    表示CV_16SC2 , CV_32FC1 或CV_32FC2类型的X值。

  • 第四个参数,InputArray类型的map2,同样,它也有两种可能的表示对象,而且他是根据map1来确定表示那种对象。
    若map1表示点(x,y)时。这个参数不代表任何值。
    表示CV_16UC1 , CV_32FC1类型的Y值(第二个值)。

  • 一般情况下,map1和map2使用CV_16UC1 , CV_32FC1单通道类型,比较直观。

  • 第五个参数,int类型的interpolation,插值方式,之前的resize( )函数中有讲到,需要注意,resize( )函数中提到的INTER_AREA插值方式在这里是不支持的,所以可选的插值方式如下:

    • INTER_NEAREST - 最近邻插值
      INTER_LINEAR – 双线性插值(默认值)
      INTER_CUBIC – 双三次样条插值(逾4×4像素邻域内的双三次插值)
      INTER_LANCZOS4 -Lanczos插值(逾8×8像素邻域的Lanczos插值)
  • 第六个参数,int类型的borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改。

  • 第七个参数,const Scalar&类型的borderValue,当有常数边界时使用的值,其有默认值Scalar( ),即默认值为0

  • 
    #include"opencv2/highgui/highgui.hpp"
    #include"opencv2/imgproc/imgproc.hpp"
    #include <iostream>
    
    using namespace cv;
    int main( )
    {
        Mat srcImage, dstImage; 
        Mat map_x, map_y;
        srcImage= imread( "1.jpg", 1 );
        if(!srcImage.data) 
        { 
            printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); 
            return false; 
        } 
        imshow("原始图",srcImage);
    
        dstImage.create(srcImage.size(), srcImage.type() );
        map_x.create(srcImage.size(), CV_32FC1 );
        map_y.create(srcImage.size(), CV_32FC1 );
    
        //上下颠倒
        for(int j = 0; j < srcImage.rows;j++)
        {
            for(int i = 0; i < srcImage.cols;i++)
            {
                map_x.at<float>(j,i)= static_cast<float>(srcImage.cols - i);
                map_y.at<float>(j,i)= static_cast<float>(j);
            }
        }
    
        remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, 
                        BORDER_CONSTANT, Scalar(0,0,0));
        imshow("程序窗口", dstImage );
        waitKey();
        return 0;
    }

 

Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐