Fast Line Detector(高速ライン検出器)による線の検出

20200322_mikan70.jpg

以前書いたハフ変換による線検出の記事を書いた。

リンク
    Emotion Explorer - 直線の検出


LSD(Line Segment Detector)という線分検出アルゴリズムOpenCV4に
実装されているのを見つけた。
ハフ変換より、精度よく線分を検出するようだが、ライセンスの問題か?
AGPL v3の回避のため、OpenCV 4.1.0で削除されているようだ。残念。
ちなみにオープンソース画像処理ライブラリOpenCVBSDライセンスです。
このへんのライセンス問題については、現状でどうなっているのか?
今後どうなるかは不明のために、現代段階ではLSD(Line Segment Detector)は使いづらい。
大体の画像処理アルゴリズムとしてFLD(Fast Line Detector : 高速ライン検出器)
アルゴリズムを試してみたいと思います。


Pythonサンプルプログラム

import cv2
import numpy as np

# FLDテスト処理
# fileImage : 画像ファイルパス
#
def testFastLineDetector(fileImage):
colorimg = cv2.imread(fileImage, cv2.IMREAD_COLOR)
if colorimg is None:
return -1
image = cv2.cvtColor(colorimg.copy(), cv2.COLOR_BGR2GRAY)

# FLDインスタンス生成
length_threshold = 4 # 10
distance_threshold = 1.41421356
canny_th1 = 50.0
canny_th2 = 50.0
canny_aperture_size = 3
do_merge = False

# 高速ライン検出器生成
fld = cv2.ximgproc.createFastLineDetector(length_threshold,distance_threshold,
canny_th1,canny_th2,canny_aperture_size,do_merge)
#fld = cv2.createLineSegmentDetector(cv2.LSD_REFINE_STD) # LSD

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

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

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

createFastLineDetector()でFLDインスタンスを生成し、
fld.detect()で線分を検出。
fld.drawSegments()で検出した線を描きます。
fld.drawSegments()はカラー画像を入力しても、グレイスケール画像で
出力されますね。仕様なのかな?



cv2.createFastLineDetector関数


retval = cv2.ximgproc.createFastLineDetector([, length_threshold[,
     distance_threshold[, canny_th1[, canny_th2[,
     canny_aperture_size[, do_merge]]]]]])
パラメーター
  • length_threshold - 長さ閾値(規定値:10)
    これより短いセグメントは破棄されます
  • distance_threshold - 距離閾値(規定値:1.41421356)
    これより遠い仮説線分から配置されたポイントは、外れ値と見なされます。
  • canny_th1 - Cannyヒステリシス1(規定値:50)
    Canny()のヒステリシス手順の最初のしきい値
  • canny_th2 - Cannyヒステリシス1(規定値:50)
    Canny()のヒステリシス手順の2番目のしきい値
  • canny_aperture_size - Cannyソベルオペレータ アパチャーサイズ(規定値:3)
    Canny()のソベルオペレータ アパチャーサイズ
  • do_merge - 増分マージオプション(規定値:False)
    Trueの場合、セグメントの増分マージが実行されます

FastLineDetectorオブジェクト作成し、それを初期化します。


FastLineDetectorの詳細は下記リンク

    cv::ximgproc::FastLineDetector Class Reference



動作環境

Windows10 Anaconda
Python 3.8.1
OpenCV 4.0.1
numpy 1.18.1



試行1 新宿高層ビル

  20200322_building70.jpg

直線部分が多く、今回の画像処理向き。


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

  20200322_FastLine0.png

検出した線のみを描画しています。
線の色は赤のみで変えられないようだ。


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

  20200322_build0.jpg

検出した線と処理画像との合成しています。
結果は、ちょっと!って感じだけれど、パラメータ追い込めば何とかなりそう。



試行2 伊予柑


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

  20200322_iyokan.jpg

線幅の問題で、線が見えなくなっている部分もありますが結構きれいに
とらえています。
伊予柑がどのようにとらえるか興味があって試したけれど、思ったより良かった。
しきい値しだいかな。



感想として

オープンソースでライセンスに引っ掛かり、別のアルゴリズム開発というのは
ときどきある話で、結構難しい問題だったりします。その都度回避していくしかないかな。

FLDについて、おおざっぱに線分検出するにはいいかもしれない。
結局、しきい値調整、パラメータ調整をどうするかなんだろうね。
でも、ラフにぱっと作って適当なパラメータでもそれなりに動くのはいいね。

いい感じかないかな。



加筆・修正

  • 2021/02/17 加筆
    cv2.ximgproc.createFastLineDetector()について加筆.
  • 2021/04/20 修正
    IntersectionObserver’s による画像のオフスクリーン遅延読み込み処理に変更。
    IE11未対応。


    関連



    参照



    引用

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


    #画像処理

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



    コメント

    非公開コメント