3

滑らかに保ちながらアップスケールする必要がある RGBA 画像があります。

問題は、色をそのままにしておく必要があることです (背景: 州が色分けされている地図のサイズを変更しています)。スムージング中のピクセルの色。

したがって、滑らかなエッジを得るために、最近傍を使用してアップスケールし(階段パターンを与えます)、ターゲット画像の各ピクセルを特定の半径内で最も頻繁に発生するピクセルの色に置き換えることでエッジを丸めることを望んでいました。ラ そう:

from PIL import Image, ImageFilter
amount=3
image=Image.open(<file>)
image=image.filter(ImageFilter.ModeFilter(amount))

これは、PIL の ImageFilters が各チャネルで個別に動作するため、機能しないことを除いて、かなり迅速に終了します。拳を振る

私はnumpy配列に頼って、ループで次のことをしようとしました:

dest[x,y]=Counter([tuple(e) for e in reshape(source[max(x-r,0):x+r+1,max(y-r,0):y+r+1],(-1,4))]).most_common()[0][0]

ここでの dest と source は同じ形状の XxYx4 配列であるため、再形成とタプルへの変換が必要であることに注意してください。理論的にはこれでうまくいきますが、私が操作している8,200 万ピクセル
の画像 を完了するには 12 時間かかります。これは主に、キャストと再形成による不要なオーバーヘッドが原因であると推測しています。

Python でこれを行う適切な方法は何でしょうか?

このタスクを実行するための C++ モジュールを作成する準備が整いました。
この道から私を遠ざけるものは何でも大歓迎です!

4

2 に答える 2

1

画像の色の固定セットを気にする場合は、「パレット」画像モードの方がおそらく適切です(少なくとも、マップに256色を超えていない場合)。

最初に画像を「P」モードに変換することをお勧めします(私はPILにあまり詳しくないので、それがどれほど簡単かはわかりません。おそらく、最初にパレットを明示的に作成する必要がありますか?)次に、モードフィルターを適用します。

私の頭に浮かぶもう1つの解決策は、サイズを大きくするときにバイキュービック補間を使用してから、元の画像から派生したパレットを使用してパレット画像に変換することです。これにより、現在のアプローチよりも優れた結果が得られる可能性があります(実装が容易になる可能性があります)。

于 2012-02-10T08:48:00.320 に答える
-1

Image_scalingで説明されている EPX は、新しい色を導入しません。スケール 2x はこれを行います。

  A    --\ 1 2
C P B  --/ 3 4
  D 

IF C==A => 1=A
IF A==B => 2=B
...

スケール 3x もそこに記述されています。
それとは別に、「Cに直行する」ことに同意します-あなたが知っていることに依存します。誰もnp_inlineを使用しましたか?

于 2012-02-13T17:15:04.740 に答える