-
像素重映射简介:
像素重映射简单的说就是把输入图像中各个像素按照一定的规则映射到另外一张图象的对应位置上去,形成一张新的图像;例如我们平时生活中的照镜子的行为也是一种重映射。
-
像素重映射中用到的相关API
CV_EXPORTS_W void remap( InputArray src//输入图像, OutputArray dst,//输出图像 InputArray map1,//对应的x方向映射表 InputArray map2,//对应的y方向映射表 int interpolation, //选择的插值方法,常见线性插值,可选择立方插值 int borderMode = BORDER_CONSTANT,//通常我们选择该参数为BORDER_CONSTANT const Scalar& borderValue = Scalar());//color
-
实验代码及程序分析:
#include "stdafx.h" #include "iostream" #include "opencv2\opencv.hpp" using namespace std; using namespace cv; void image_remap(void); int index = 0; Mat src, dst, map_x, map_y; int main() { src = imread("G:/He/opencv_images/test.jpg"); if (src.empty()) { cout << "could not load the images..." << endl; return -1; } namedWindow("input_images", CV_WINDOW_AUTOSIZE); namedWindow("output_images", CV_WINDOW_AUTOSIZE); imshow("input_images", src); map_x.create(src.size(), CV_32FC1); map_y.create(src.size(), CV_32FC1); int c = 0; while (1) { c = waitKey(500); index = c % 4; if ((char)c == 27)break; else { image_remap(); remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 255)); imshow("output_images", dst); } } waitKey(0); destroyAllWindows(); return 0; } void image_remap(void) { for (int col = 0; col < src.cols; col++) { for (int row = 0; row < src.rows; row++) { switch (index) { //获取图像的一半 case 0: if (col > (src.cols*0.25) && col<(src.cols*0.75) && row>(src.rows*0.25) && row < (src.rows*0.75)) { map_x.at<float>(row, col) = 2 * (col - (src.cols*0.25)); map_y.at<float>(row, col) = 2 * (row - (src.rows*0.25)); } else { map_x.at<float>(row, col) = 0; map_y.at<float>(row, col) = 0; } break; //图像左右反转 case 1: map_x.at<float>(row, col) = (src.cols - col-1); map_y.at<float>(row, col) = row; break; //图像上下反转 case 2: map_x.at<float>(row, col) = col; map_y.at<float>(row, col) = (src.rows - row-1); break; //图像上下左右均反转 case 3: map_x.at<float>(row, col) = (src.cols - col-1); map_y.at<float>(row, col) = (src.rows - row-1); break; } } } }