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を使う事が多いです。
参照ページ
https://docs.opencv.org/4.8.0/d2/de8/group__core__array.html#ga209f2f4869e304c82d07739337eae7c5