影像變換(12):重映射
一,重映射的概念;二,實作重映射:remapO函式;三,基礎示例程式:基本重映射
一,重映射的概念
重映射,就是把一幅影像中某位置的像素放置到另一個圖片指定位置的程序,為了完成映射程序,需要獲得一些插值為非整數像素的坐標,因為源影像與目標影像的像素坐標不是一一對應的,一般情況下,我們通過重映射來表達每個像素的位置(x,y),像這樣:

影像會按照x軸方向發生翻轉,那么,源影像和效果圖分別如圖7.27和7.28所示,

二,實作重映射:remapO函式
remap()函式會根據指定的映射形式,將源影像進行重映射幾何變換,基于的公式如下:

第一個引數,InputArray型別的src,輸入影像,即源影像,填Mat類的物件即可,且需為單通道8位或者浮點型影像,
第二個引數,OutputArray型別的dst,函式呼叫后的運算結果存在這里,即這個引數用于存放函式呼叫后的輸出結果,需和源圖片有一樣的尺寸和型別,
第三個引數,InputArray型別的 map1,它有兩種可能的表示物件,
表示點(x,y)的第一個映射,
表示CV_16SC2、cV_32FC1或CV_32FC2型別的X值,
第四個引數,InputArray型別的map2,同樣,它也有兩種可能的表示物件,而且它會根據map1來確定表示那種物件,
若map1表示點(x,y)時,這個引數不代表任何值,
表示CV_16UC1,cV_32FC1型別的Y值(第二個值),
第五個引數,int型別的 interpolation,插值方式,之前的 resize()函式中有講到,需要注意,resize()函式中提到的 INTER_AREA插值方式在這里是不支持的,所以可選的插值方式如下(需要注意,這些宏相應的OpenCV2版為在它們的宏名稱前面加上“CV_”前綴,比如“INTER_LINEAR”的OpenCV2版為“CV_INTER_LINEAR"):
INTER_NEAREST——最近鄰插值
INTER_LINEAR——雙線性插值(默認值)
INTER_CUBIC——雙三次樣條插值(逾4x4像素鄰域內的雙三次插值)
INTER_LANCZOS4———Lanczos插值(逾8×8像素鄰域的Lanczos插值)
第六個引數,int型別的borderMode,邊界模式,有默認值 BORDERCONSTANT,表示目標影像中“離群點( outliers)”的像素值不會被此函式修改,
第七個引數,const Scalar&型別的borderValue,當有常數邊界時使用的值,其有默認值Scalar(),即默認值為0,
三,基礎示例程式:基本重映射
代碼如下:
//-------------【頭檔案、命名空間部分】--------------
// 描述:包含程式所依賴的頭檔案和命名空間
//---------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/utils/logger.hpp>
using namespace std;
using namespace cv;
int main()
{
cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制臺不在輸出日志檔案
//【0】變數定義
Mat srcImage, dstImage;
Mat map_x, map_y;
//【1】載入原始圖
srcImage = imread("E:/pictures/2.jpg");
if (!srcImage.data) { printf("讀取圖片錯誤,請確定目錄下是否有imread函式指定的圖片存在~! \n"); return false; }
imshow("原始圖", srcImage);
//【2】創建和原始圖一樣的效果圖,x重映射圖,y重映射圖
dstImage.create(srcImage.size(), srcImage.type());
map_x.create(srcImage.size(), CV_32FC1);
map_y.create(srcImage.size(), CV_32FC1);
//【3】雙層回圈,遍歷每一個像素點,改變map_x & map_y的值
for (int j = 0; j < srcImage.rows; j++)
{
for (int i = 0; i < srcImage.cols; i++)
{
//改變map_x & map_y的值.
map_x.at<float>(j, i) = static_cast<float>(i);
map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j);
}
}
//【4】進行重映射操作
remap(srcImage, dstImage, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
//【5】顯示效果圖
imshow("【程式視窗】", dstImage);
waitKey();
return 0;
}
運行結果:


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437010.html
標籤:AI
