[matplotlib animation] 41. approximate_polygonのtolerance変化アニメーション

matplotlib Animation

はじめに

scikit-imageライブラリのapproximate_polygon関数を使用して、画像内の輪郭を多角形で近似する方法を紹介しています。toleranceパラメータを徐々に変化させながら、多角形の頂点数がどのように減少していくかをmatplotlibのFuncAnimationでアニメーション化しています。これにより、精度とシンプルさのトレードオフを視覚的に確認できます。

コード

解説

モジュールのインポート

図形データの生成

閉じた台形状の図形データとなります。

図の作成

ax.set_aspect(‘equal’)を使用してすべての図のアスペクト比を統一し、ax.plot(shape1[:, 0], shape1[:, 1])で元データの図形を表示します。

アニメーションの設定

空のリストの生成

これはアニメーション関数内で作成した図を格納するリストです。

ns1はapproximate_polygonを実行した図、ns2はsubdivide_polygonを実行した図を表します。

アニメーションの関数

古いプロットを消す
図形の細分化

new_shape1に所定の回数のsubdivide_polygonを適用して細分化します。subdivide_polygonの詳細については、後述します。

[scikit-image] 20. 図形の近似と細分化(measure.approximate_polygon)
skimage.measure の approximate_polygonを用いた図形の近似
図形の近似

approximate_polygon()関数を使用して図形の近似を行います。このアニメーションでは、toleranceパラメータを徐々に変化させることで、近似される形状の変化を視覚的に表示します。approximate_polygon関数の詳細については、以下で解説しています。

[scikit-image] 20. 図形の近似と細分化(measure.approximate_polygon)
skimage.measure の approximate_polygonを用いた図形の近似
図の表示

プロットして、リストに.append()で追加することで表示できます。

タイトルの表示

タイトルに「ax.set_title(“tolerance=”+str(0.01*num)+”,point=”+str(len(appr_shape1)-1))」を使用して、toleranceの値とapproximate_polygonで近似した図形のデータポイント数を表示します。

アニメーションの表示

fargs=(new_shape,)とすることで、ローカル変数(new_shape)をアニメーション関数内に渡すことができます。また、HTML(ani.to_html5_video())を実行すれば、Jupyter Notebook上にアニメーションを直接表示できます。

まとめ

approximate_polygon関数のtoleranceパラメータを変化させることで、元の形状をどの程度単純化できるかを視覚的に確認できるアニメーションを作成しました。toleranceが大きくなるほど頂点数が減少し、形状が単純化されていく様子が分かります。画像処理や形状認識において、適切な近似レベルを選ぶ際の参考になります。

参考

[scikit-image] 20. 図形の近似と細分化(measure.approximate_polygon)
skimage.measure の approximate_polygonを用いた図形の近似

コメント