OPENCV學習之基本重映射

基本概念

重映射就是把一幅圖像上某處的像素放在另一個圖像的指定位置。因爲源圖像與目標圖像的像素座標不是一一對應的額,於是會使用重映射來表達像素的位置(x,y);g(x,y)=f(h(x,y));f()指源圖像,h(x,y)指作用於(x,y)的映射方法。

實現重映射可以通過remap函數

remap(InputArray src,OutputArray dst,InputArray map1,InputArray
map2,int interpolation,int

borderMode=BORDER_CONSTANT,const Scalar& borderValue=Scalar());

第一個參數InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象,且爲單通道8位或者浮點型圖像。

第二個參數OutputArray類型的dst,爲輸出的圖像,和源圖像一樣大小類型一致即可。

第三個參數InputArray類型的map1表示在X方向進行的變換操作

第四個參數InputArray類型的map2表示在Y方向進行的變換操作

第五個參數,表示插值方法,有下列方法可供選擇

INTER_NEAREST--------最近鄰插值

INTER_LINEAR-----------雙線性插值(默認值)

INTER_CUBIC---------雙三次樣條插值

INTER_LANCZOS4-------Lanczos插值

一般主要使用的是前兩個插值方法。

第六個參數 邊界模式,有默認的值BORDER_CONSTANT,表示目標圖像中“離羣點”的像素不會被修改

第七個參數,const Scalar&類型的borderValue,默認值爲0;

具體例子:

Mat src = imread("1.jpg");
	imshow("原圖", src);

	Mat dst, map_x, map_y;
	//創建和原始圖一樣的效果圖,x重映射圖,y重映射圖
	dst.create(src.size(), src.type());
	map_x.create(src.size(), CV_32FC1);
	map_y.create(src.size(), CV_32FC1);
	//雙層循環,遍歷每個像素,修改map_x和map_y的值
	for (int j=0; j < src.rows; j++)
	{
		for (int i = 0; i < src.cols; i++)
		{
			map_x.at<float>(j, i) = static_cast<float>(i);
			map_y.at<float>(j, i) = static_cast<float>(src.rows-j);
		}
	}
	//重映射操作
	remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
	
	imshow("效果圖", dst);

	waitKey(0);
	return(0);

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章