放射状エッジ検出¶
放射状エッジ検出を行い、検出結果を画像として保存するサンプルコードです。
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
入力画像

エッジ検出範囲

エッジ検出結果
