私は画像モザイクの作成に取り組んできました。私のスクリプトは多数の画像を取得し、それらをサムネイルサイズに縮小してから、それらをタイルとして使用してターゲット画像を概算します。
アプローチは実際にはかなり楽しいです:
すべてのタイル位置のすべての親指の平均二乗誤差を計算します。
最初は貪欲な配置を使用しました。エラーが最小の親指をタイルに最も適したタイルに配置し、次に親指を配置します。
貪欲の問題は、あまり一致しないかどうかにかかわらず、最も人気のないタイルに最も異なる親指を配置することになるということです。ここに例を示します:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
そのため、スクリプトが中断されるまでランダムスワップを実行します。結果はまったく問題ありません。
2つのタイルのランダムスワップは必ずしも改善されるとは限りませんが、3つ以上のタイルのローテーションによって全体的な改善がもたらされるA <-> B
場合がA -> B -> C -> A
1
あります。
このため、ランダムなタイルを2つ選んで改善されないことがわかった後、タイルの束を選び、そのような回転で3番目のタイルになるかどうかを評価します。4つのタイルの任意のセットを有利に回転できるかどうかなどは検討しません。それはまもなく超高額になるでしょう。
しかし、これには時間がかかります。
より良い、より速いアプローチはありますか?
バウンティ更新
ハンガリー語メソッドのさまざまなPython実装とバインディングをテストしました。
はるかに高速だったのは、純粋なPython https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
私の直感は、これが最適な答えに近いということです。テストイメージで実行すると、他のすべてのライブラリが結果に同意しましたが、このkuhnMunkres.pyは桁違いに高速でしたが、他の実装が同意したスコアに非常に非常に近づいています。
速度はデータに大きく依存します。モナリザは13分でkuhnMunkres.pyを駆け抜けましたが、スカーレットチェステッドインコは16分かかりました。
結果は、インコのランダムスワップとローテーションとほとんど同じでした。
(左側はkuhnMunkres.py、右側はランダムにスワップ、比較のための元の画像)
しかし、私がテストしたモナリザの画像では、結果が著しく改善され、彼女は実際に彼女の定義された「笑顔」を輝かせていました:
(左側がkuhnMunkres.py、右側がランダムスワップ)