函式原型
void copyMakeBorder(InputArray src, OutputArray dst,
int top, int bottom, int left, int right,
int borderType, const Scalar& value = Scalar() );
引數說明
- InputArray型別的src,輸入影像,如Mat型別,
- OutputArray型別的dst,輸出影像,
- int型別的top,表示向上擴展多少像素,
- int型別的bottom,表示向下擴展多少像素,
- int型別的left,表示向左擴展多少像素,
- int型別的right,表示向右擴展多少像素,
- int型別的borderType,推斷影像邊緣像素的邊界模式,
- const Scalar&型別的value,有默認值Scalar(),即0,
測驗代碼
#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
cv::Mat image_make_border(cv::Mat &src);
int main(void)
{
Mat test = imread("liu.jpg", 0);
cv::Mat result=image_make_border(test);
imshow("original", test);
imshow("result", result/255);
waitKey(0);
system("pause");
return 0;
}
// 影像邊界處理
cv::Mat image_make_border(cv::Mat &src)
{
int w = cv::getOptimalDFTSize(src.cols); // 獲取DFT變換的最佳寬度
int h = cv::getOptimalDFTSize(src.rows); // 獲取DFT變換的最佳高度
cv::Mat padded;
// 常量法擴充影像邊界,常量 = 0
cv::copyMakeBorder(src, padded, 0, h - src.rows, 0, w - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));
padded.convertTo(padded, CV_32FC1);
return padded;
}
測驗效果
上圖展示了4種不同的影像擴展方案:CONSTANT就不多說了,常數擴展,第八個引數設定為255,那就擴展的資料全是255;圖1是REPLICATE擴展,最邊緣的資料是什么,那么下面那一列或者行都是這個資料,圖中看出來就是一條條豎線;圖2是WRAP擴展,把另一頭的資料拿到下面來補上,有點類似于周期性的感覺;圖3是REFLECT擴展,將影像下方資料鏡像反轉,對稱式填充,從圖中可以看出來;圖4是REFLECT101,顧名思義,0不動,只對稱1,和圖3不一樣的地方在于,它把最邊緣的那一行資料作為軸線,不參與翻轉,也就是從次邊緣開始對稱填充~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287827.html
標籤:其他
