圖像處理中經常遇到使用當前像素鄰的像素來計算當前像素位置的某些屬性值,這樣就會導致邊界像素處越界訪問,一般有兩種方法解決這種問題:只對不越界的像素進行處理;對圖像邊界進行拓展,本文主要介紹如何使用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:上一節(jié)中的邊界拓展策略中的一個。
value:當你的邊界策略使用的是BORDER_CONSTANT的時候,此處是指邊界處填寫的常數值。
實例
用一個簡單實例來解釋下如何拓展邊界。
Mat?extendedIm; copyMakeBorder(?orgIm,?extendedIm,?extRows,?extRows,?extCols,?extCols,?BORDER_REFLECT_101,?Scalar::all(0)?);
在實例中,上下邊界分別拓展extRows行,左右分別拓展extCols列,使用的是BORDER_REFLECT_101,最有一個參數,可以不寫,我這里寫上是為了告訴大家函數可以填寫這些參數。
以下是實驗代碼和結果:
#include#includeusing?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;
}上圖是原始圖像。
上圖是拓展后的圖像。





