圖像重映射--OpenCv13

重映射,就是把一幅圖像中某位置的像素放置到另一個圖片指定位置的過程。

就是按照一個對應法則去轉化

g(x,y)=f( h(x,y) ) ,其中,g()是目標圖像,f()是源圖像,而h(x,y)是作用於(x,y)的映射方法函數。

若有一幅圖像I,對其按照h(x,y) = (I.cols-x,y); 那麼就會按照X軸旋轉 

 

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

第三個參數map1可以表示CV_16SC2 CV_32FC1 CV_32FC2類型的X值, 就是指圖像 X方向的重映射法則

它還可以直接表示點(x,y)的第一個映射

第四個參數map2 同上,表示Y值, 當map1表示點(x,y)時,第二個參數無效。

第五個參數interpolation爲插值方法

INTER_NEAREST--最近鄰插值

INTER_LINEAR--雙線性插值

IITER_CUBIC--雙三次樣條插值

INTER_LANCZOS4--Lanczos插值

第六個參數爲邊界模式,有默認值

第七個參數 當有常數邊界時使用的值,有默認值Scalar() 即默認值爲0

 

	Mat Img1;
	Mat GrayImg;

	Img1 = imread("demo.jpg");

	if (!Img1.data)
	{
		cout << "未找到圖片" << endl;
		return -1;
	}
	imshow("input img", Img1);

	Mat Map_x, Map_y,dstImg;

	dstImg.create(Img1.size(), Img1.type());
	Map_x.create(Img1.size(), CV_32FC1);
	Map_y.create(Img1.size(), CV_32FC1);


	for (int j = 0;j < Img1.rows;j++)
	{
		for (int i = 0;i < Img1.cols;i++)
		{
			Map_x.at<float>(j, i) = static_cast<float>(Img1.cols-i);
			Map_y.at<float>(j, i) = static_cast<float>(j);
		}
	}

	remap(Img1, dstImg, Map_x, Map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
	imshow("output img", dstImg);

 

 

 

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