画像モザイクを作成するためのアルゴリズム-これよりも速い方法はありますか?


9

私は画像モザイクの作成に取り組んできました。私のスクリプトは多数の画像を取得し、それらをサムネイルサイズに縮小してから、それらをタイルとして使用してターゲット画像を概算します。

アプローチは実際にはかなり楽しいです:

すべてのタイル位置のすべての親指の平均二乗誤差を計算します。

最初は貪欲な配置を使用しました。エラーが最小の親指をタイルに最も適したタイルに配置し、次に親指を配置します。

貪欲の問題は、あまり一致しないかどうかにかかわらず、最も人気のないタイルに最も異なる親指を配置することになるということです。ここに例を示します:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

そのため、スクリプトが中断されるまでランダムスワップを実行します。結果はまったく問題ありません。

2つのタイルのランダムスワップは必ずしも改善されるとは限りませんが、3つ以上のタイルのローテーションによって全体的な改善がもたらされるA <-> B場合がA -> B -> C -> A1あります。

このため、ランダムなタイルを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、右側がランダムスワップ)


1
関連する...みたい。Codegolfでは、口蓋変換に同様の問題がありました。

1
もう1つの関連する画像のセットは、各RGBのallRGBです(ただし、その方法のヒントはそれほど多くありませんが、この問題に対処した別の領域があるだけです)。

1
数年前、モザイクメーカーとこの問題に遭遇しました。その時々の私の推論は、問題はアルゴリズム(MSE部分)ではなく、入力画像パレットの限られたサイズにあるということです。処理する画像が10億個もないので、しばらくして画像を再利用できるようにして偽装しました。ただし、アプローチを維持したい場合は、「良い」適合の最初のパスを実行してから、残りの画像をランダム(またはランダムっぽい)として処理することをお勧めします。非常に多くの選択肢。
Jトラナ2014

@MichaelTはそのすばらしいリンクに感謝します:)コードゴルフは特に魅力的です。投票された最高のソリューションはランダムスワップ(ランダムローテーションではなく)を使用しており、かなり長い間実行されていると思います...
Will

1
あなたが答えを選択して賞金を授与した後にこれに来る。別のアプローチは、これをシミュレーテッドアニーリング問題として扱うことです。SAをソリューションパイプラインのステージの1つとして使用できます。
andy256

回答:


3

はい、2つのより速くより速いアプローチがあります。

  • より単純な問題:各タイルについて、(重複の可能性がある)最高のつまみを選択します。わかりました、それはごまかしですが、より良い視覚結果につながるだけです。
  • あなたのテイクはアルゴリズム的にもっと興味深いものであり、要約すると、MSEを合計が最小でなければならない照合コストと見なすと、「線形割り当て問題」になります。そのような問題は、例えば「ハンガリーの方法」を介して、多項式時間で解決できます。

次に、基になるアルゴリズムを変更せずに、MSEをより視覚的に正確な距離に置き換えることにより、コストを調整できます。


どうも!LAPとハンガリーメソッドが私が必要としたリードでした!問題の結果で更新します。
ウィル

3

私はそれがNP困難な問題であると合理的に確信しています。「完璧な」ソリューションを見つけるには、あらゆる可能性を徹底的に試さなければならず、それは指数関数的です。

1つのアプローチは、貪欲な適合を使用してから、それを改善することです。これは、不適切に配置されたイメージ(最後のイメージの1つ)を取り、それを配置する別の場所を見つけ、そのイメージを取得して移動することなどが考えられます。(a)時間が足りなくなったとき(b)適合が「十分に良い」とき、あなたは終わりです。

確率的要素を導入すると、シミュレーテッドアニーリングアプローチまたは遺伝的アルゴリズムにつながる可能性があります。おそらく、達成しようとしているのは、エラーを均等に分散させることだけです。これはあなたがすでにやっていることに近づいているのではないかと思うので、答えは次のとおりです。正しいアルゴリズムを使用すると、より良い結果がより速く得られるかもしれませんが、Nirvanaへの魔法の近道はありません。


はい、これはあなたがすでにやっていることに似ています。ポイントは、魔法の答えを忘れ、2つのアルゴリズムの観点から考えることです。最初に入力し、次に最適化します。

塗りつぶしは、ランダム、利用可能な最高、最初は最高、十分良い、ある種のホットスポットです。

最適化はランダム、最悪の修正、または(私が示唆したように)シミュレーテッドアニーリングまたは遺伝的アルゴリズムです。

「良さ」の指標とそれに費やして実験する準備ができている時間の長さが必要です。または実際にそれを行った人を見つけます。


あなたは質問で説明されているアプローチを正確に説明しています...?
ウィル

1

最後のタイルが問題である場合、どういうわけか、それらを早い段階で配置するようにしてください;)

1つのアプローチは、一致の上位x%(直感的には33%となる)から最も遠いタイルを見て、それを最適な一致に配置することです。それはとにかく得ることができる最もよい一致です。

さらに、最悪のタイルに最適な一致を使用しないように選択することもできますが、そのスロットの最適な一致と比較してエラーが最小になるため、「ダメージコントロール"。

もう1つ覚えておくべきことは、最終的には目で処理する画像を作成することです。したがって、本当に必要なのは、エッジ検出を使用して、画像上のどの位置が最も重要かを判断することです。同様に、画像の非常に周辺で発生することは、効果の品質にとってほとんど価値がありません。これら2つの重みを重ね合わせて、距離の計算に含めます。したがって、発生するジッターは、境界に向かって引き寄せられ、エッジから離れるので、妨害が大幅に軽減されます。

また、エッジ検出が適切に行われている場合は、最初のy%を貪欲に(おそらく、タイルの「エッジ」の特定のしきい値を下回るまで)、「ホットスポット」が適切に処理されるようにします。残りは「ダメージコントロール」に切り替えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.