Line Segment Detector(線分検出器)による線分検出

20200322_building70.jpg

線分検出画像処理アルゴリズムLSD(Line Segment Detector)について調べている最中に、
ライセンス問題の件がわかり調査は保留。ブログテーマをFLD(Fast Line Detector)に切り替えた。

リンク


LSDのサンプルプログラムは作っていて、動作確認済。
書かないでおこうと思ったが、使ったところで金をとられるわけではない。
せっかくプログラムは作っていたので記録のために記事にしておこうかと
思います。


Pythonプログラム

import cv2
import numpy as np

# LSD(Line Segment Detector)テスト処理
# fileImage : 画像ファイルパス
#
def testLineSegmentDetector(fileImage):
colorimg = cv2.imread(fileImage, cv2.IMREAD_COLOR)
if colorimg is None:
return -1

image = cv2.cvtColor(colorimg.copy(), cv2.COLOR_BGR2GRAY)

# LSD(Line Segment Detector)インスタンス生成
lsd = cv2.createLineSegmentDetector(cv2.LSD_REFINE_STD) # LSD

# ライン取得
lines, width, prec, nfa = lsd.detect(image) # LSD

# 検出線表示
drawnLines = np.zeros((image.shape[0],image.shape[1],3), np.uint8)
lsd.drawSegments(drawnLines, lines)
cv2.imshow("Line Segment Detector(LINE)", drawnLines)

# 検出線と処理画像の合成表示
lsd.drawSegments(colorimg, lines)
cv2.imshow("Line Segment Detector", colorimg)
cv2.waitKey()
return 0

前回書いた記事と同じ。コメントアウトしてあったところを復活させた。
簡単にアルゴリズムを切り替えられる良いライブラリー設計しているな。
detect()については、FLDと返却値が異なるので注意。



動作環境

Windows10 Anaconda
Python 3.8.1
OpenCV 4.0.1
numpy 1.18.1



試行 新宿高層ビル


入力画像

20200322_building70.jpg
Green Planetさんによる写真ACからの写真

画像は前回とおなじです。


LSD実行 検出した線のみの結果表示

20200323_LineSegmentDetector.png

検出した線のみを描画しています。
FLDと比較しても綺麗に取れている感じがする。



LSD実行 検出した線と処理画像との合成

20200323_LineSegmentDetector.jpg

FLDの場合はグレイスケールだったけれど、LSDでの結果の背景はカラーで出力してくれます。
グレイスケールの方が見やすいかな。



感想として

LSDについて、ほとんどデフォルトなのに、いい結果だね。これが使えないのは惜しい。
精度的なものは、最小二乗法で取得して線を比較すればいいんだけれど、
そこまでやる必要あるかな?
精度が欲しければ最小二乗法で計算すればいいだけなので、とりあえずはいいかな。
ハフ変換も実用されているので、それよりも良いと思われるLSD、FLDは
実用上は問題ないんじゃないかな。
今回は、ライセンスの問題も調べて、別の意味でも勉強になりました。


修正・加筆

  • 2021/04/23 修正
    IntersectionObserver’s による画像のオフスクリーン遅延読み込み処理に変更。
    IE11未対応。



参照



引用

Green Planetさんによる写真ACからの写真


#画像処理

関連記事
スポンサーサイト



コメント

非公開コメント