????????OpenCV中使用remap實現圖像的重映射。
????????重映射是指將圖像中的某一像素值賦值到指定位置的操作:g(x,y) = f ( h(x,y) ),
在這里, g( ) 是目標圖像, f() 是源圖像, 而h(x,y) 是作用于 (x,y) 的映射方法函數。為了完成映射過程, 需要獲得一些插值為非整數像素的坐標,因為源圖像與目標圖像的像素坐標不是一一對應的。
? ? ? ? remap函數定義:
void remap(InputArray src, //輸入圖像OutputArraydst, //輸出圖像InputArray map1,//第一個映射InputArray map2, //第二個映射int interpolation, //插值方式intborderMode=BORDER_CONSTANT, //邊界處理方式,可以通過borderValue設置值const Scalar& borderValue=Scalar() //邊界指
)
-
第三個參數,InputArray類型的map1,它有兩種可能的表示對象:
表示點(x,y)的第一個映射。
表示CV_16SC2 , CV_32FC1 或CV_32FC2類型的X值。 -
第四個參數,InputArray類型的map2,同樣,它也有兩種可能的表示對象,而且他是根據map1來確定表示那種對象。
若map1表示點(x,y)時。這個參數不代表任何值。
表示CV_16UC1 , CV_32FC1類型的Y值(第二個值)。 -
一般情況下,map1和map2使用CV_16UC1 , CV_32FC1單通道類型,比較直觀。
-
第五個參數,int類型的interpolation,插值方式,之前的resize( )函數中有講到,需要注意,resize( )函數中提到的INTER_AREA插值方式在這里是不支持的,所以可選的插值方式如下:
- INTER_NEAREST - 最近鄰插值
INTER_LINEAR – 雙線性插值(默認值)
INTER_CUBIC – 雙三次樣條插值(逾4×4像素鄰域內的雙三次插值)
INTER_LANCZOS4 -Lanczos插值(逾8×8像素鄰域的Lanczos插值)
- INTER_NEAREST - 最近鄰插值
-
第六個參數,int類型的borderMode,邊界模式,有默認值BORDER_CONSTANT,表示目標圖像中“離群點(outliers)”的像素值不會被此函數修改。
-
第七個參數,const Scalar&類型的borderValue,當有常數邊界時使用的值,其有默認值Scalar( ),即默認值為0
-
#include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" #include <iostream>using namespace cv; int main( ) {Mat srcImage, dstImage; Mat map_x, map_y;srcImage= imread( "1.jpg", 1 );if(!srcImage.data) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定的圖片存在~! \n"); return false; } imshow("原始圖",srcImage);dstImage.create(srcImage.size(), srcImage.type() );map_x.create(srcImage.size(), CV_32FC1 );map_y.create(srcImage.size(), CV_32FC1 );//上下顛倒for(int j = 0; j < srcImage.rows;j++){for(int i = 0; i < srcImage.cols;i++){map_x.at<float>(j,i)= static_cast<float>(srcImage.cols - i);map_y.at<float>(j,i)= static_cast<float>(j);}}remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0,0));imshow("程序窗口", dstImage );waitKey();return 0; }
?