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;
}

 

posted @ 2020-05-28 16:38  xyfun72  阅读(261)  评论(0编辑  收藏  举报