首先介绍一下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;
}
运行结果如下图所示: