はじめに
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の詳細については、後述します。

図形の近似
approximate_polygon()関数を使用して図形の近似を行います。このアニメーションでは、toleranceパラメータを徐々に変化させることで、近似される形状の変化を視覚的に表示します。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が大きくなるほど頂点数が減少し、形状が単純化されていく様子が分かります。画像処理や形状認識において、適切な近似レベルを選ぶ際の参考になります。
参考

コメント