欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv中像素重映射操作(remap函数的使用)

程序员文章站 2023-12-23 20:45:09
...

像素重映射:

简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。

opencv中像素重映射操作(remap函数的使用)

API:cv::remap

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 <opencv2/opencv.hpp> 
#include <iostream> 
using namespace cv;

Mat src, dst,map_x,map_y;
int index =0;

void update_map(void){
    for(int row = 0; row < src.rows; row++)
    {
        for (int col = 0; col < src.cols; col++)
        {
            switch (index)
            {
                case 0/*缩小一半*/:
                    if(row >= src.rows*0.25 && row <= src.cols*0.75 && col >= src.cols*0.25 && col <= src.cols*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 /*x方向镜像*/:
                    map_x.at<float>(row,col) = src.cols-col-1;
                    map_y.at<float>(row,col) = row;
                    break;
                case 2 /*y方向镜像*/:
                    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;            
            }
        }   
    }
}

int main(int argc, char** argv) {

	src = imread("C:\\Users\\Administrator\\Pictures\\as.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

    map_x.create(src.size(),CV_32FC1);//32位1通道
    map_y.create(src.size(),CV_32FC1);//32位1通道

    while(true){
        int c = waitKey(500);
        if((char)c == 27)//ESC键
        {
            break;
        }
        index = c % 4; 
        update_map();
        /*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 
        )
        */
        remap(src,dst,map_x,map_y,INTER_LINEAR,BORDER_REFLECT);
        imshow("remap image",dst);
    }

	return 0;

}

效果:

1.缩小一半

opencv中像素重映射操作(remap函数的使用)

2.x方向对称

opencv中像素重映射操作(remap函数的使用)

3.y方向对称

opencv中像素重映射操作(remap函数的使用)

4.中心对称

opencv中像素重映射操作(remap函数的使用)

上一篇:

下一篇: