Python-OpenCVで図形の縁を検出するルーチンを考える

python コンピュータ
python

全てのピクセルの左右上下を検査し縁に当たる部分か調べる方法で縁取りをしてみます。

#!/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には図形を検出する関数や、境界線を抽出する関数があったと思うのでそちらを使ったほうがより良い結果を得られると思います。

コメント