OpenCV Reference

【OpenCV-Python】BorderTypes(画像の外周処理の設定)

blur(平滑化)やGaussianBlur(ガウシアンフィルタ)など、カーネルを使った画像フィルタ処理では、画像の最外周部分では、カーネルが画像からはみ出してしまうため、はみ出した部分を、どのように補うか?の設定の種類にBoarderTypes というenumが定義されています。

外周画素の処理

enum定義

cv2.BORDER_CONSTANT 指定した値(i)で補います。
iiiiii|abcdefgh|iiiiiii
cv2.BORDER_REPLICATE 最も外側の値で補います。
aaaaaa|abcdefgh|hhhhhhh
cv2.BORDER_REFLECT 外側の位置を基準に折り返すように補います。
fedcba|abcdefgh|hgfedcb
cv2.BORDER_WRAP 値が向きが変わらず、繰り返されるように補います。
cdefgh|abcdefgh|abcdefg
cv2.BORDER_REFLECT_101 最も外側の値の位置を中心に折り返すように補います。
gfedcb|abcdefgh|gfedcba
cv2.BORDER_TRANSPARENT 透過(はみ出した部分を別の画像で補います)
uvwxyz|abcdefgh|ijklmno
cv2.BORDER_REFLECT101 cv2.BORDER_REFLECT_101と同じ
cv2.BORDER_DEFAULT cv2.BORDER_REFLECT_101と同じ
cv2.BORDER_ISOLATED 画像の外側を見ない(処理しない)

 

サンプルプログラム

Boarderの処理は、blurなどの関数内部で行われる事が多いので、ボーダー付きの画像をわざわざ自分で作る事は少ないのですが、copyMakeBoarder()関数によって、ボーダー付きの画像を生成する事が出来るので、そのサンプルを下記に示します。

import cv2

src = cv2.imread("Parrots.bmp")

bd = 64 # 枠線の太さ

border0 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_CONSTANT, value = [0, 0, 255])
border1 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_REPLICATE)
border2 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_REFLECT)
border3 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_WRAP)
border4 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_REFLECT_101)
border6 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_REFLECT101)
border7 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_DEFAULT)
border8 = cv2.copyMakeBorder(src, bd, bd, bd, bd, cv2.BORDER_ISOLATED)
 
cv2.imshow("Src", src)
cv2.imshow("BORDER_CONSTANT", border0)
cv2.imshow("BORDER_REPLICATE", border1)
cv2.imshow("BORDER_REFLECT", border2)
cv2.imshow("BORDER_WRAP", border3)
cv2.imshow("BORDER_REFLECT_101", border4)
cv2.imshow("BORDER_REFLECT101", border6)
cv2.imshow("BORDER_DEFAULT", border7)
cv2.imshow("BORDER_ISOLATED", border8)

cv2.waitKey()

実行結果

OpenCV Python BorderTypes 外周処理

 

個人的にはBORDER_DEFAULTにもなっている、BORDER_REFLECT_101を使う事が多いです。

 

参照ページ

OpenCV: Operations on arrays
外周画像の処理
平滑化フィルタやメディアンフィルタなどの注目画素の周辺画素を用いた画像フィルタ処理では、画像の外周部分が下図のように画像の外側を参照してしまうため、処理ができなくなります。 この外周部分を処理する方法はいくつかあるのですが、代表的な方法を紹...

コメント

タイトルとURLをコピーしました