放射状エッジ検出


放射状エッジ検出を行い、検出結果を画像として保存するサンプルコードです。

import math

import pyfie
import matplotlib.pyplot as plt

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

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

# 放射状エッジ検出の範囲
center = (256, 237)
start_radius = 105
range_radius = 20

# 検出範囲をプロットして保存
ax = himg.imshow()
ax.add_artist(plt.Circle(center, start_radius, color="red", fill=False))
ax.add_artist(plt.Circle(center, start_radius +
                         range_radius, color="red", fill=False))
plt.savefig("edge1d_radial_range.png")
plt.close()

# データ受け取り用変数を用意
num_edges = pyfie.INT(8)
edges = pyfie.F_DEDGE.ARRAY(num_edges)

# 放射状エッジ検出
pyfie.edge1d_radial(
    hsrc=himg,
    center=center,
    start_radius=start_radius,
    range_radius=range_radius,
    start_angle=math.pi / num_edges,
    range_angle=2 * math.pi * (1 - 1 / num_edges),
    line_num=num_edges,
    prj_mode=pyfie.F_PROJECTION_FAN,
    prj_width=5,
    filter_mode=pyfie.F_EDGE1D_DOG,
    direct_mode=pyfie.F_DRK_TO_BRI,  # 円の内側から暗→明のエッジを検出
    diff_type=pyfie.F_ABSOLUTE_THR,
    diff_thr=50,
    detect_mode=pyfie.F_POS_SORT,
    edges=edges.ref,
    edge_num=num_edges)

# 取得したエッジを表示
print("num edges:", num_edges)
for i, edge in enumerate(edges[:num_edges]):
    print("#{}: x = {:.2f}, y = {:.2f}, mag = {:.2f}".format(
        i, edge.x, edge.y, edge.mag
    ))

# 取得したエッジをプロットし結果画像として保存
himg.imshow()
edges.plot(c="red", num=num_edges, s=100)
plt.savefig("edge1d_radial_result.png")

処理結果例

$ python sample_edge1d_radial.py
num edges: 8
#0: x = 360.33, y = 280.22, mag = 85.32
#1: x = 299.28, y = 341.49, mag = 86.70
#2: x = 212.88, y = 341.10, mag = 92.70
#3: x = 152.87, y = 279.72, mag = 87.94
#4: x = 153.38, y = 194.49, mag = 98.63
#5: x = 213.44, y = 134.24, mag = 78.17
#6: x = 298.75, y = 133.78, mag = 75.64
#7: x = 359.65, y = 194.07, mag = 80.33

入力画像

../../_images/edge1d_radial_input.png

エッジ検出範囲

../../_images/edge1d_radial_range.png

エッジ検出結果

../../_images/edge1d_radial_result.png

ダウンロード