2 つの画像の 1 つまたは複数の違いの輪郭を見つけようとしています。
2 つの同一の画像があるとします。次に、画像の 1 つにランダムな位置に不透明な正方形と三角形を追加します。形状が重ならない場合があります。
これらの形状の最も外側のピクセルの座標を取得したいのですが、これらの座標は「グループ化」する必要があります -> 形状ごとに 1 セットずつ、2 セットの座標を取得したいのです。
各ピクセルを比較し、最小値と最大値の x 値と y 値を取得して、形状の境界ボックスを作成しようとしました。これには 2 つの問題があります。形状の輪郭ではなく、バウンディング ボックスが表示されます。また、画像に複数の形状がない場合にのみ機能します。
私は一生、これを成し遂げる方法を考えることができません。
私はほとんどphpに縛られていますが、gdまたはimagickのいずれかを使用できます。gd の方が少し好みですが、imagick の方が高速で強力なので、それも問題ありません。
ボーナス ポイント: 最終結果は、形状ごとに単純な (できるだけ単純な) ポリゴンにする必要があります。多少の精度の低下は問題ありませんが、実際には推奨されています。多角形の線は輪郭に完全に従う必要はありません。より少ない点を優先して多少のずれは許容されます。
編集:
「輪郭」の意味は次のとおりです。長方形が描かれた画像があるとします。見つけたい輪郭は、長方形を構成する 4 つの点です。この正方形が描かれている画像は、任意の画像にすることができます。それは白いキャンバスかもしれませんし、風景や肖像画かもしれません。
そして今気づいたのは、ポイントの順番が重要だということです。正方形を再描画でき、砂時計の形にならないようにする必要があります。
編集 2:
imagick を使用して一歩近づきました。
convert img/modified.png img/original.png -compose ChangeMask -composite out.png
このコマンドは、元の画像を修正版のマスクとして使用し、形状のみを含む画像を表示します。この画像では、標準のエッジ検出アルゴリズムを使用できるかもしれません。
解決できない問題が 1 つあります。画像内に 1 つの形状しかない場合にのみ機能します。しかし、それが結果であることが判明した場合、それは問題ないと思います。
編集 3:
複雑すぎない形状の輪郭を取得できるようになりました。しかし、それは何百ものポイントをもたらします。これは多すぎます。おそらく20ポイント程度まで圧縮する必要があります。
プロセスは次のとおりです。
- 上記の imagemagick コマンドを使用すると、形状だけの画像が得られます。画像の残りの部分は透明です
- この画像では、一番上 (0,0) から始めて下を見て、透明でないピクセルを見つけます。次に、(1,0) などを調べます。最後に到達したら、(width,0) から開始し、左の非透明ピクセルを探します。このようにして、輪郭を「感じる」ために画像全体を移動します。