end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

pylsd for pythonのLSD (Line Segment Detector)で画像から線分検出

https://end0tknr.hateblo.jp/entry/20171028/1509188265

随分以前に記載した上記entryでは、 Hough変換による直線検出を使用していますが、 LSDの存在を知ったので、お試し

https://pypi.org/project/ocrd-fork-pylsd/

install pylsd

✕ $ pip install pylsd
○ $ pip install ocrd-fork-pylsd

python script

インターネットで検索すると、 opencvのcv2モジュールを使用した例が多いようですが、 今回は、Pillow(PIL)を使用しています。

#!python
# -*- coding: utf-8 -*-

import numpy as np
import os
import sys
import PIL.Image
import PIL.ImageDraw
from pylsd.lsd import lsd

def main():
    fullName = sys.argv[1]
    folder, imgName = os.path.split(fullName)
    
    img = PIL.Image.open(fullName)      # fileの読込み
    gray = np.asarray(img.convert('L')) # グレースケール化
    lines = lsd(gray, sigma_scale=2)    # 直線検出

    # 元画像に検出した線分を追記
    print( lines )
    draw = PIL.ImageDraw.Draw(img)
    
    for i in range(lines.shape[0]):
        pt1 = (int(lines[i, 0]), int(lines[i, 1]))
        pt2 = (int(lines[i, 2]), int(lines[i, 3]))
        width = lines[i, 4]
        draw.line((pt1, pt2), fill=(255,0,0), width=int(np.ceil(width / 2)))
        
    # fileとして保存
    img.save(os.path.join(folder, 'PIL_' + imgName.split('.')[0] + '.png'))

if __name__ == '__main__':
    main()

上記を実行すると、以下のようなpngが作成されます