ハフ直線検出


ハフ直線検出を行い、検出結果を画像として保存するサンプルコードです。

import pyfie
import matplotlib.pyplot as plt

# 利便のため PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# 入力画像読み込み
himg = pyfie.imread("houghline_input.png")

# ソーベルフィルタを利用したエッジ検出
edges = pyfie.F_DEDGE.PTR()
nedges = pyfie.INT()
pyfie.fnFIE_edge_sobel_subpix(
    himg, None, pyfie.F_EDGE_SOBEL_PARAMS(mag_threshold=40, nms_length=1),
    pyfie.F_EDGE_FEAT_DIRECT, pyfie.F_BORDER_NONE, (0.0, 0.0),
    edges, nedges
)

# エッジ点をプロットし途中画像として保存
himg.imshow()
edges.plot(nedges, c="lime", s=1)
plt.savefig("houghline_edge.png")
plt.close()

# 直線検出ハフライブラリのオープン
hhough = pyfie.fnFIE_hough_lines_open(
    0, 359, 0, 0, himg.width, himg.height, None)
assert hhough is not None

# 直線ハフ投票空間の初期化
pyfie.fnFIE_hough_lines_init_space(hhough)

# エッジの投票用パラメータ設定
vot_width = 10

# エッジの投票
nvoted = pyfie.INT()
pyfie.fnFIE_hough_lines_voting_d(hhough, edges, nedges, vot_width, nvoted)

# 直線検出のパラメータを設定
rgn_r = 10
rgn_q = 10
max_lines = 10

# データ受け取り用変数を用意
nlines = pyfie.INT()
detedted_lines = pyfie.F_LH_LINE.ARRAY(max_lines)

# 直線の検出
pyfie.fnFIE_hough_lines_detection(
    hhough, max_lines, rgn_r, rgn_q, detedted_lines, nlines)

# 取得した直線を表示
print("num lines:", nlines)
for i in range(nlines):
    line = detedted_lines[i]
    print("#{}: a = {:.2f}, b = {:.2f}, c = {:.2f}, score = {}".format(
        i, line.a, line.b, line.c, line.score
    ))

# 取得した直線をプロットし結果画像として保存
himg.imshow()
detedted_lines.plot(nedges, num=nlines, color="red")
plt.savefig("houghline_result.png")

# エッジを解放
edges.fnOAL_free()

処理結果例

$ python sample_houghline.py
num lines: 10
#0: a = 3993.00, b = -32523.00, c = 3495813.00, score = 78
#1: a = -16876.00, b = -28087.00, c = 5675655.00, score = 74
#2: a = -14876.00, b = -29196.00, c = 7295537.00, score = 57
#3: a = -14364.00, b = -29451.00, c = 3945014.00, score = 56
#4: a = -21497.00, b = -24730.00, c = 6731279.00, score = 52
#5: a = 22762.00, b = 23571.00, c = -8813489.00, score = 52
#6: a = -16384.00, b = -28377.00, c = 3248528.00, score = 51
#7: a = 29697.00, b = -13848.00, c = -3487585.00, score = 49
#8: a = 28087.00, b = -16876.00, c = -2499312.00, score = 48
#9: a = -27788.00, b = 17364.00, c = 2348658.00, score = 47

入力画像

../../_images/houghline_input.png

エッジ画像

../../_images/houghline_edge.png

直線検出結果

../../_images/houghline_result.png

ダウンロード