重映射:remap()函数

版权声明:本文为博主原创文章,转载请标明出处! https://blog.csdn.net/qq_27396861/article/details/86766554

remap()函数会根据指定的映射形式,将原图像进行重映射几何变换,基于公式如下:

dst(x, y) = src( mapx(x, y), mapy(x, y) )

函数原型C++(程序 / 20):

void remap( InputArray src, OutputArray dst, InputArray map1, 
    InputArray map2, int interpolation, int borderMode = BORDER_CONSTANT,
    const Scalar& borderValue = Scalar() )

函数解析:
1)InputArray类型的src,输入图像,填Mat类的对象即可,且需要为单通道8位或者浮点型的图像;
2)OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和原图片有一样的尺寸和类型。
3)InputArray类型的map1,它有两种可能的表示对象;
表示点(x, y)的第一个映射;
表示CV_16S, CV_32FC1或CV_32FC2类型的X值;
4)InputArray类型的map2,同样,它有两种可能的表示对象,而且它会根据map1来确定表示那种对象;
若map1表示点(x, y)时,这个参数不代表任何值;
表示CV_16UC1,CV_32FC1类型的Y值(第二个值);
5)int类型的interpolation,插值方式,之前的resize()函数中有讲到,需要注意,resize()函数中提到的INTER_AREA插值方式在这里是不支持的,所以可选的插值方式如下:
INTER_NEAREST:最近邻插值;
INTER_LINEAR:双线性插值(默认值);
INTER_CUBIC:双三次样条插值(逾4x4像素邻域内的双三次插值);
INTER_LANCZOS4:Lanczos插值(逾8x8像素邻域的Lanczos插值)
6)int类型的borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点”的像素不会被此函数修改;
7)const Scalar&类型的 borderValue,当有常数边界时使用的值,默认值为0;

程序示例:


#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
	Mat srcImage, dstImage, map_x, map_y;
	
	srcImage = imread("dlrb.jpg");

	dstImage.create(srcImage.size(), srcImage.type());
	map_x.create(srcImage.size(), CV_32FC1);
	map_y.create(srcImage.size(), CV_32FC1);

	for (size_t j = 0; j < srcImage.rows; j++)
	{
		for (size_t i = 0; i < srcImage.cols; i++)
		{
			map_x.at<float>(j, i) = static_cast<float>(i);
			map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
		}
	}

	remap(srcImage, dstImage, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));

	imshow("srcImage", srcImage);
	imshow("dstImage", dstImage);

	waitKey(0);
	return 0;
}

原图:
原图

效果图:
效果图

猜你喜欢

转载自blog.csdn.net/qq_27396861/article/details/86766554