[OpenCV]拓展映像邊界,opencv拓展映像邊界
影像處理中經常遇到使用當前像素鄰的像素來計算當前像素位置的某些屬性值,這樣就會導致邊界像素處越界訪問,一般有兩種方法解決這種問題:只對不越界的像素進行處理;對映像邊界進行拓展,本文主要介紹如何使用OpenCV簡單的對邊界進行拓展。
邊界的拓展方式
OpenCV提供了幾種不同的邊界拓展策略:
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba* BORDER_WRAP: cdefgh|abcdefgh|abcdefg* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified ’i’
以上內容取自OpenCV的協助文檔。其中 “|” 表示的是映像的邊界,連個“|”中間是映像的內容,最後一個邊界拓展策略還要額外給定一個i值,用於對額外的邊界進行賦值。
邊界拓展
使用OpenCV提供的函數copyMakeBorder()來拓展邊界,其原型如下
void copyMakeBorder( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value=Scalar() )
src:輸入的數組。
dst:輸出的拓展邊界後的數組。
top:在src上邊界向上拓展的行數。
bottom:在src下邊界向下拓展的行數。
left:在src的左邊界向左拓展的列數。
right:在src的右邊界向右拓展的列數。
borderType:上一節中的邊界拓展策略中的一個。
value:當你的邊界策略使用的是BORDER_CONSTANT的時候,此處是指邊界處填寫的常數值。
執行個體
用一個簡單一實例來解釋下如何拓展邊界。
Mat extendedIm;copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101, Scalar::all(0) );
在執行個體中,上下邊界分別拓展extRows行,左右分別拓展extCols列,使用的是BORDER_REFLECT_101,最有一個參數,可以不寫,我這裡寫上是為了告訴大家函數可以填寫這些參數。
以下是實驗代碼和結果:
#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int main(int argc, char**argv){Mat orgIm = imread("theImage.png");int extRows = 19;int extCols = 15;Mat extendedIm;copyMakeBorder( orgIm, extendedIm, extRows, extRows, extCols, extCols, BORDER_REFLECT_101);imshow("original image", orgIm);imshow("extended image", extendedIm);waitKey();return 0;}
是原始映像。
是拓展後的映像。