0003-OpenCV中重映射函数remap的使用,以图像在x和y方向的翻转为例!

首先介绍一下remap函数
remap就是用来做重映射的,重映射的含义这里先不讲,大家看完这篇文章就知道了!

函数原型如下:
C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
参数src:输入图像,即源图像。
参数dst:目标图像,需和源图片有一样的尺寸和类型。
参数map1:里面存储着源图像中各像素点的x坐标在目标图像中的x坐标,x坐标其实就是像素点列号。
参数map2:里面存储着源图像中各像素点的y坐标在目标图像中的y坐标,y坐标其实就是像素点列号。
参数interpolation:插值方式,可选的插值方式如下:
    INTER_NEAREST - 最近邻插值
    INTER_LINEAR – 双线性插值(默认值)
    INTER_CUBIC – 双三次样条插值(4×4像素邻域内的双三次插值)
    INTER_LANCZOS4 -Lanczos插值(8×8像素邻域的Lanczos插值)
参数borderMode:int类型:borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改,此时这些点的值由borderValue决定。离群点我猜应该是没有被映射的点。
参数borderValue:当参数borderMode设为BORDER_CONSTANT,其值决定了离群点的取值,有默认值,默认值为0。


代码流程如下
读取源图像→利用remap函数做重沿x和y方向的翻转操作→显示源图像和翻转后的图像

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

使用示例代码如下
源码中所需的图片下载链接:http://pan.baidu.com/s/1i5mU66D 密码:czyx

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/core/core.hpp>          
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>  
#include <iostream>   

int main(){
        cv::Mat src = cv::imread("remap_pic.jpg");
        cv::Mat map_x_1, map_y_1, map_x_2, map_y_2, map_x_3, map_y_3;
        map_x_1.create(src.size(), CV_32FC1);
        map_y_1.create(src.size(), CV_32FC1);
        map_x_2.create(src.size(), CV_32FC1);
        map_y_2.create(src.size(), CV_32FC1);
        map_x_3.create(src.size(), CV_32FC1);
        map_y_3.create(src.size(), CV_32FC1);

        for (int iH = 0; iH<src.rows; iH++){
                for (int iW = 0; iW<src.cols; iW++){
                        map_x_1.at<float>(iH, iW) = iW;
                        map_y_1.at<float>(iH, iW) = src.rows - iH;

                        map_x_2.at<float>(iH, iW) = src.cols - iW;
                        map_y_2.at<float>(iH, iW) = iH;

                        map_x_3.at<float>(iH, iW) = src.cols - iW;
                        map_y_3.at<float>(iH, iW) = src.rows - iH;
                }
        }

        cv::Mat dst1, dst2, dst3;
        remap(src, dst1, map_x_1, map_y_1, CV_INTER_LINEAR);
        remap(src, dst2, map_x_2, map_y_2, CV_INTER_LINEAR);
        remap(src, dst3, map_x_3, map_y_3, CV_INTER_LINEAR);

        cv::imshow("origin", src);
        cv::imshow("remap_1", dst1);
        cv::imshow("remap_2", dst2);
        cv::imshow("remap_3", dst3);
        cv::waitKey(0);

        return 0;
}

运行结果如下图所示

猜你喜欢

转载自blog.csdn.net/lehuoziyuan/article/details/84029770
今日推荐