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()
実行結果
個人的にはBORDER_DEFAULTにもなっている、BORDER_REFLECT_101を使う事が多いです。
参照ページ
OpenCV: Operations on arrays
外周画像の処理
平滑化フィルタやメディアンフィルタなどの注目画素の周辺画素を用いた画像フィルタ処理では、画像の外周部分が下図のように画像の外側を参照してしまうため、処理ができなくなります。 この外周部分を処理する方法はいくつかあるのですが、代表的な方法を紹...
コメント