基本概念
重映射就是把一幅圖像上某處的像素放在另一個圖像的指定位置。因爲源圖像與目標圖像的像素座標不是一一對應的額,於是會使用重映射來表達像素的位置(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,intborderMode=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);