一、重映射及remap()函數介紹
重映射,就是把一幅圖像中某位置的像素放置到另一圖像指定位置的過程。即:
在重映射過程中,圖像的大小也可以同時發生改變。此時像素與像素之間的關系就不是一一對應關系,因此在重映射過程中,可能會涉及到像素值的插值計算。
src:輸入圖像,灰度圖或真彩圖均可。
dst:輸出圖像,要求大小和xmap,ymap相同,通道數目及數據類型和src相同。
xmap:用於存放圖像X方向的映射關系,類型必須是CV_32FC1的。
ymap:用於存放圖像Y方向的映射關系,類型必須是CV_32FC1的。
interpolation:插值方式。
borderMode:圖像邊界處理方式,邊界的類型有以下幾種:
1)BORDER_REPLICATE:重復: aaaaaa|abcdefgh|hhhhhhh
2)BORDER_REFLECT:反射: fedcba|abcdefgh|hgfedcb
3)BORDER_REFLECT_101:反射101: gfedcb|abcdefgh|gfedcba
4)BORDER_WRAP:外包裝: cdefgh|abcdefgh|abcdefg
5)BORDER_CONSTANT:常量復制: iiiiii|abcdefgh|iiiiiii(i的值由后一個參數Scalar()確定,如Scalar::all(0) )
borderValue:若上一參數為BORDER_CONSTANT,則由此參數確定補充上去的像素值。可選用默認值。
二、程序及結果分享
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat mImage = imread("goalkeeper.jpg");
if (mImage.data == 0)
{
cerr << "Image reading error !" << endl;
system("pause");
return -1;
}
namedWindow("The original image", WINDOW_NORMAL);
imshow("The original image", mImage);
Mat mResult = mImage.clone();
//mMapX和mMapY的數據類型必須是 CV_32FC1
Mat mMapX(mImage.rows, mImage.cols, CV_32FC1, Scalar(0));
Mat mMapY(mImage.rows, mImage.cols, CV_32FC1, Scalar(0));
int Rows = mImage.rows;
int Cols = mImage.cols;
for (int i = 0; i <Rows; i++)
{
float* ptrX = mMapX.ptr<float>(i);
float* ptrY = mMapY.ptr<float>(i);
for (int j = 0; j < Cols; j++)
{
//左右翻轉
ptrX[j] =(float)(Cols - j);
ptrY[j] = (float) i;
//上下翻轉
//ptrX[j] = (float)j;
//ptrY[j] = (float)(Rows - i);
}
}
remap(mImage, mResult, mMapX, mMapY, INTER_LINEAR);//重映射
namedWindow("The processed image",WINDOW_NORMAL);
imshow("The processed image", mResult);
waitKey();
destroyAllWindows();
return 0;
}
學會重映射,以后門神就單張單張地買,終於可以省錢娶媳婦了,哈哈哈: