画像の細線化(スケルトン化)

2020/11/21

Python3.8.2, OpenCV4.4.0, Scikit-Image0.17.2

画像を線画にする処理をスケルトン化というらしい。

dst = cv2.ximgproc.thinning(image, thinningType=cv2.ximgproc.THINNING_ZHANGSUEN)

thinningTypeには

cv2.ximgproc.THINNING_ZHANGSUEN
cv2.ximgproc.THINNING_GUOHALL

がある。

OpenCVによる細線化.(スケルトン化)
https://emotionexplorer.blog.fc2.com/blog-entry-200.html


以下、OpenCVに細線化がないと思い込んでいたので、Scikit-Imageという別の画像処理ライブラリを使った方法。
(Python3.8.2, OpenCV4.4.0, Scikit-Image0.17.2)

Scikit-Imageのインストール

pip install scikit-image


スケルトン化

import cv2
import numpy as np
from skimage.morphology import skeletonize

img = cv2.imread(img_path)
#2値化
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.GaussianBlur(img,(5,5),0)
ret,img = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

#細線化(スケルトン化)
ske = skeletonize(~(img != 0))
ske_gray = (ske * 255).astype(np.uint8)
ske_rgb = cv2.cvtColor(ske_gray, cv2.COLOR_GRAY2RGB)

#結果の表示
cv2.imshow('test',ske_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()


ラスター画像からベクター画像への変換について
https://teratail.com/questions/244128

Scikit-Imageの細線化(Skeletonize)をOpenCVと組み合わせて試す。
https://emotionexplorer.blog.fc2.com/blog-entry-198.html