リージョン特徴量:外接長方形の取得


リージョンの外接長方形を取得し、外接長方形を画像として保存するサンプルコードです。

import pyfie
import matplotlib.pyplot as plt

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

# 入力画像読み込み
himg = pyfie.imread("region_bbox_src.png")
assert himg.f_type == pyfie.F_IMG_BIN

# リージョンに変換
hreg = pyfie.fnFIE_region_encode(himg, (0, 0))

# 座標軸に沿った外接長方形を取得
xmin = pyfie.INT()
xmax = pyfie.INT()
ymin = pyfie.INT()
ymax = pyfie.INT()
pyfie.region_get_xyrange(hreg, xmin, xmax, ymin, ymax)
# 表示
print(f"xmin: {xmin}, xmax: {xmax}, ymin: {ymin}, ymax: {ymax}")

# 外接長方形をプロットして保存
himg.imshow()
pyfie.BOX_T((xmin - 0.5, ymin - 0.5), (xmax + 0.5, ymax + 0.5)
            ).plot(color="red", ls="solid", lw=3)
plt.savefig("region_bbox_axis_aligned.png")
plt.close()


def plot_pnts_as_polygon(dpnts, **kwargs):
    """点列を多角形としてプロット"""
    coords = [(p.x, p.y) for p in dpnts]
    coords.append(coords[0])
    xs, ys = zip(*coords)
    return plt.plot(xs, ys, **kwargs)


# 慣性主軸方向の外接長方形を取得
bbox_pos = pyfie.DPNT_T.ARRAY(4)
pyfie.region_calc_rect2pos(hreg, bbox_pos)
# 表示
print(f"rect2 bbox: {bbox_pos}")

# 外接長方形をプロットして保存
himg.imshow()
plot_pnts_as_polygon(bbox_pos, c="red", lw=3)
plt.savefig("region_bbox_rect2.png")
plt.close()

# フェレ径が最小となる角度を取得
feretmin = pyfie.DOUBLE()
fmin_theta = pyfie.DOUBLE()
pyfie.region_calc_feret_diameter_maxmin(
    hreg, feretmin=feretmin, fmin_theta=fmin_theta)

# その角度での外接長方形を取得
bbox_pos = pyfie.DPNT_T.ARRAY(4)
pyfie.region_calc_bounding_rotated_rect_pos(hreg, fmin_theta, bbox_pos)
# 表示
print(
    f"feret min: {feretmin:.2f}, feret min theta: {fmin_theta:.2f}")
print(f"feret min bbox: {bbox_pos}")

# 外接長方形をプロットして保存
himg.imshow()
plot_pnts_as_polygon(bbox_pos, c="red", lw=3)
plt.savefig("region_bbox_feret_min.png")

処理結果例

$ python sample_region_bbox.py
xmin: 49, xmax: 203, ymin: 39, ymax: 221
rect2 bbox: [ DPNT_T :
    DOUBLE x = 117.05942106220787
    DOUBLE y = 33.384885319525594
, DPNT_T :
    DOUBLE x = 212.11551593696203
    DOUBLE y = 174.70494660968677
, DPNT_T :
    DOUBLE x = 134.94057893779217
    DOUBLE y = 226.61511468047433
, DPNT_T :
    DOUBLE x = 39.884484063038
    DOUBLE y = 85.29505339031316
 ]
feret min: 82.97, feret min theta: -0.53
feret min bbox: [ DPNT_T :
    DOUBLE x = 47.33350253807106
    DOUBLE y = 79.96903553299494
, DPNT_T :
    DOUBLE x = 119.89086294416245
    DOUBLE y = 36.97208121827411
, DPNT_T :
    DOUBLE x = 204.66649746192894
    DOUBLE y = 180.03096446700505
, DPNT_T :
    DOUBLE x = 132.10913705583755
    DOUBLE y = 223.02791878172587
 ]

入力画像

../../_images/region_bbox_src.png

座標軸に沿った外接長方形

../../_images/region_bbox_axis_aligned.png

慣性主軸方向の外接長方形

../../_images/region_bbox_rect2.png

フェレ径が最小となる方向の外接長方形

../../_images/region_bbox_feret_min.png

ダウンロード