圖像處理中經(jīng)常遇到使用當前像素鄰的像素來計算當前像素位置的某些屬性值,這樣就會導致邊界像素處越界訪問,一般有兩種方法解決這種問題:只對不越界的像素進行處理;對圖像邊界進行拓展,本文主要介紹如何使用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’
以上內(nèi)容取自O(shè)penCV的幫助文檔。其中 “|” 表示的是圖像的邊界,連個“|”中間是圖像的內(nèi)容,最后一個邊界拓展策略還要額外給定一個i值,用于對額外的邊界進行賦值。
邊界拓展
使用OpenCV提供的函數(shù)copyMakeBorder()來拓展邊界,其原型如下
void?copyMakeBorder(?InputArray?src,?OutputArray?dst,?int?top,?int?bottom,?int?left,?int?right,?int?borderType,?const?Scalar&?value=Scalar()?)
src:輸入的數(shù)組。
dst:輸出的拓展邊界后的數(shù)組。
top:在src上邊界向上拓展的行數(shù)。
bottom:在src下邊界向下拓展的行數(shù)。
left:在src的左邊界向左拓展的列數(shù)。
right:在src的右邊界向右拓展的列數(shù)。
borderType:上一節(jié)中的邊界拓展策略中的一個。
value:當你的邊界策略使用的是BORDER_CONSTANT的時候,此處是指邊界處填寫的常數(shù)值。
實例
用一個簡單實例來解釋下如何拓展邊界。
Mat?extendedIm; copyMakeBorder(?orgIm,?extendedIm,?extRows,?extRows,?extCols,?extCols,?BORDER_REFLECT_101,?Scalar::all(0)?);
在實例中,上下邊界分別拓展extRows行,左右分別拓展extCols列,使用的是BORDER_REFLECT_101,最有一個參數(shù),可以不寫,我這里寫上是為了告訴大家函數(shù)可以填寫這些參數(shù)。
以下是實驗代碼和結(jié)果:
#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; }
上圖是原始圖像。
上圖是拓展后的圖像。