あらかじめ内部が塗りつぶされた画像、あるいはfindContoursのような前処理で外接輪郭を塗りつぶした画像があれば、以下のようにmorphologyEx
とModeFilter
で輪郭をなめらかにすることができます。
Python
1import numpy as np
2import cv2
3from PIL import Image, ImageFilter
4
5# 中身が白、外側が黒に反転
6img = cv2.imread('pika.png')
7img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
8img2 = 255-img2
9
10# 円形(なめらか)に膨張
11kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (40,40)) # 膨張サイズは適当に
12img2 = cv2.morphologyEx(img2, cv2.MORPH_DILATE, kernel)
13
14# モード(最頻)フィルターを適用
15img2 = Image.fromarray(img2) # cv -> PIL
16img2 = img2.filter(ImageFilter.ModeFilter(20))
17img2 = np.array(img2, dtype=np.uint8) # PIL -> cv
18
19# 外接する輪郭を取得して内部を塗りつぶす
20contours, hierarchy = cv2.findContours(img2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
21img2 = cv2.drawContours(img, contours, -1, (0,0,0), thickness=cv2.FILLED)
22cv2.imwrite('ret.png', img2)
pika.png
ret.png
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/18 17:31