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

像素重映射:

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

opencv中像素重映射操作(remap函数的使用)_第1张图片

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  
#include  
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(row,col) = 2*(col-(src.cols*0.25));
                        map_y.at(row,col) = 2*(row-(src.rows*0.25));
                    }
                    else
                    {
                        map_x.at(row,col) = 0;
                        map_y.at(row,col) = 0; 
                    }       
                    break;
                case 1 /*x方向镜像*/:
                    map_x.at(row,col) = src.cols-col-1;
                    map_y.at(row,col) = row;
                    break;
                case 2 /*y方向镜像*/:
                    map_x.at(row,col) = col;
                    map_y.at(row,col) = src.rows-row-1;
                    break;
                case 3 /*中心对称*/:
                    map_x.at(row,col) = src.cols-col-1;
                    map_y.at(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张图片

2.x方向对称

opencv中像素重映射操作(remap函数的使用)_第3张图片

3.y方向对称

opencv中像素重映射操作(remap函数的使用)_第4张图片

4.中心对称

opencv中像素重映射操作(remap函数的使用)_第5张图片

你可能感兴趣的:(opencv入门教程)