はじめに
画像に枠線を付ける方法を整理します。
やりたいこと
用途ですが、画像の中の物体の輪郭を取るとき、白い枠線があると上手く行くケースがあります。
方式
Numpyのスライスを使います。
例えば、(128, 128, 3)サイズの画像があって、一番下の部分に幅10pxの白いラインを書きたいとします。
すると下記のようなコードになります。
img[128 - 10 : 128 , : , : ] = 255
チャンネルごとに値を入れることをお勧めします。
この方式だとカラーの枠線を入れることが可能です。OpenCVで画像を開いた場合、チャンネル順序が(B,G,R)になっていることには注意してください。
img[128 - 10 : 128 , : , : ] = [255, 255, 255]
このような処理を4辺に繰り返し行います。
draw_white_edge()の関数を使います。
引数として、下記の二つを指定します。
band_width : 枠線の幅、単位はピクセル
color : [B,G,R] 範囲 0~255 整数
全体コード
簡単ですね。コードを掲示します。
import cv2
def draw_white_edge(img, band_width=10, color = [255, 255, 255]):
# Image is aligned in BGR order.
# color or Gray Scale
if len(img.shape) < 3: # gray scale
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
else:
pass
# Check the image size
height, width, channel = img.shape[0], img.shape[1], img.shape[2]
# Image copy
img_test = img.copy()
# Image process
# 1. bottom line
img_test[height - band_width:height, :, :] = color
# 2. top line
img_test[0: band_width, :, :] = color
# 3. left line
img_test[:, 0:band_width, :] = color
# 4. right line
img_test[:, width - band_width:width, :] = color
return img_test
def main():
print('Welcome to my program!')
img_array = cv2.imread('./images/apple.jpg')
img_result = draw_white_edge(img=img_array, band_width= 50, color= [255, 0, 255])
cv2.imshow('original', img_array)
cv2.imshow('result', img_result)
cv2.waitKey(0)
if __name__ == '__main__':
main()
#結果