重映射,就是把一幅圖像中某位置的像素放置到另一個圖片指定位置的過程。
就是按照一個對應法則去轉化
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);