opencv中的重映射:remap()函数



重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

C++:

void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2,

                    int interpolation, intborderMode = BORDER_CONSTANT,

                    const Scalar& borderValue = Scalar())

  • 第一个参数:输入图像,即原图像,需要单通道8位或者浮点类型的图像
  • 第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型
  • 第三个参数:它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等
  • 第四个参数:它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示                                     CV_16UC1,CV_32FC1类型的Y值

  • 第五个参数:插值方式,有四中插值方式:(1)INTER_NEAREST——最近邻插值

                                                                     (2)INTER_LINEAR——双线性插值(默认)

                                                                     (3)INTER_CUBIC——双三样条插值(默认)

                                                                     (4)INTER_LANCZOS4——lanczos插值(默认)

  • 第六个参数:边界模式,默认BORDER_CONSTANT
  • 第七个参数:边界颜色,默认Scalar()黑色

以下为函数应用及效果展示:

#include 
using namespace cv;
int main()
{
	Mat srcImage = imread("D:\\visual studio 2010\\Projects\\remap\\1.jpg");
	Mat dstImage,map_x,map_y;
	imshow("",srcImage);
	//创建和原始图像一样的效果图,x重映射图,y重映射图
	dstImage.create(srcImage.size(),srcImage.type());
	map_x.create(srcImage.size(),CV_32FC1);
	map_y.create(srcImage.size(),CV_32FC1);
	//双层循环,遍历每一个像素点,改变map_x和map_y的值
	for(int j=0;j(j,i) = static_cast(srcImage.rows -i);
			map_y.at(j,i) = static_cast( srcImage.rows-j);
		}
	}
	//进行重映射操作
	remap(srcImage,dstImage,map_x,map_y,CV_INTER_LINEAR,BORDER_CONSTANT,Scalar(255,0,0));
    //显示效果图
	imshow("效果图",dstImage);
	waitKey(0);
	return 0;

}
opencv中的重映射:remap()函数_第1张图片
  • 将第二个for循环修改为

for(int i=0;i(j,i) = static_cast( i);
			map_y.at(j,i) = static_cast( srcImage.rows-j);
		}
运行结果:

opencv中的重映射:remap()函数_第2张图片

  • 将第二个for循环修改为:

for(int i=0;i(j,i) = static_cast(srcImage.rows -i);
			map_y.at(j,i) = static_cast(j);
		}
运行结果为:

opencv中的重映射:remap()函数_第3张图片
参考《OPENCV3编程入门
》-毛星云


你可能感兴趣的:(opencv中的重映射:remap()函数)