OpenCV学习 day11 像素重映射
像素重映射
简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
API
Remap( InputArray src,// 输入图像 OutputArray dst,// 输出图像 InputArray map1,// x 映射表 CV_32FC1/CV_32FC2 InputArray map2,// y 映射表 int interpolation,// 选择的插值方法,常见线性插值,可选择立方等 int borderMode,// BORDER_CONSTANT const Scalar borderValue // color )
最重要是建立映射表
演示代码
#include<iostream> #include<opencv2/opencv.hpp> #include<math.h> using namespace std; using namespace cv; void update_map(Mat src, Mat map_x, Mat map_y, int index) { for (int y = 0; y < src.rows; y++) { for (int x = 0; x < src.cols; x++) { switch (index) { //图像缩小一半 case 0: if (x > src.cols * 0.25 && x < src.cols * 0.75 && y > src.rows * 0.25 && y < src.rows * 0.7) { map_x.at<float>(y, x) = 2 * (x - src.cols * 0.25); map_y.at<float>(y, x) = 2 * (y - src.rows * 0.25); } else { map_x.at<float>(y, x) = 0; map_y.at<float>(y, x) = 0; } break; //y方向对调 case 1: map_x.at<float>(y, x) = x; map_y.at<float>(y, x) = src.rows - y; break; //x方向对调 case 2: map_x.at<float>(y, x) = src.cols - x; map_y.at<float>(y, x) = y; break; //x y方向同时对调 case 3: map_x.at<float>(y, x) = src.cols - x; map_y.at<float>(y, x) = src.rows - y; break; } } } } int main(int arg, char** argv) { Mat src, dst, map_x, map_y; //src = imread("D://Learning/image/11.png"); src = imread("D://Learning/image/9.jpg"); if (!src.data) { printf("not found image\n"); return -1; } imshow("input image", src); map_x.create(src.size(), CV_32FC1); //32位浮点型 1通道图像 map_y.create(src.size(), CV_32FC1); //32位浮点型 1通道图像 int index = 0; while (true) { index = waitKey(500); if ((char)index == 27) { break; } index = index % 4; update_map(src, map_x, map_y, index); remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(255, 0, 255)); namedWindow("remap image", WINDOW_AUTOSIZE); imshow("remap image", dst); } return 0; }