全てのピクセルの左右上下を検査し縁に当たる部分か調べる方法で縁取りをしてみます。
#!/usr/bin/env python3
# coding: utf8
import cv2
import numpy as np
def createBaseImage():
# 黒色のキャンバス(512x512)作成
img = np.full((512, 512), 0, dtype=np.uint8)
# 円を描画
color = 255 # 白
radius = 128 # 半径
center = (256, 256) # 中心
cv2.circle(img, center, radius, color, thickness=16, lineType=cv2.LINE_8, shift=0)
return img
def getFutidoriImage(gray):
h, w = gray.shape[:2]
# 黒色のキャンバスを作成
img = np.full((h,w), 0, dtype=np.uint8)
# ループ
for y in range(1, h-1):
for x in range(1, w-1):
if (gray[y][x] > 0):
continue
# 左を検査
if (gray[y][x-1] > 0):
img[y][x] = 255
continue
# 上を検査
if (gray[y-1][x] > 0):
img[y][x] = 255
continue
# 右を検査
if (gray[y][x+1] > 0):
img[y][x] = 255
continue
# 下を検査
if (gray[y+1][x] > 0):
img[y][x] = 255
continue
return img
img = createBaseImage()
cv2.imwrite("./BaseImage.png", img)
result = getFutidoriImage(img)
cv2.imwrite("./FutidoriImage.png", result)
2つの画像を重ね合わせる際、縁の部分をなじませる加工を施したいので、検出方法を考えてみました。
結果を見て思ったのですが、OpenCVには図形を検出する関数や、境界線を抽出する関数があったと思うのでそちらを使ったほうがより良い結果を得られると思います。
コメント