2011-08-17 4 views
9

私はPILの画像を作成すると、空の画像の空間を充填するPILを使用した:近く色(別名インペインティング)

example image

Iは(黒として示されている)空のスペースを埋めるために必要。私は簡単に静的な色で塗りつぶすことができますが、私がしたいのは、ピクセルを近くの色で塗りつぶすことです。例えば、境界線の後の最初の画素は、塗りつぶされた画素のガウスぼかしであってもよい。あるいは、おそらくThe Lumigraph, Gortler, et al.に記載されているプッシュプル型のアルゴリズムです。

私はこれを多くの画像で実行する必要があるため、あまりにも遅くないものが必要です。私はnumpyのような他のライブラリにアクセスすることができます。そして、あなたは外側の領域や内側の領域の境界やマスクを知っていると仮定できます。これにアプローチする方法に関する提案はありますか?

UPDATE:ベリサリウスによって示唆されるように

opencv's inpaint方法は、このために最適です。ここに私が欲しかったものを達成するためにOpenCVのを使用して、いくつかのpythonコードだ:

import Image, ImageDraw, cv 

im = Image.open("u7XVL.png") 
pix = im.load() 

#create a mask of the background colors 
# this is slow, but easy for example purposes 
mask = Image.new('L', im.size) 
maskdraw = ImageDraw.Draw(mask) 
for x in range(im.size[0]): 
    for y in range(im.size[1]): 
     if pix[(x,y)] == (0,0,0): 
      maskdraw.point((x,y), 255) 

#convert image and mask to opencv format 
cv_im = cv.CreateImageHeader(im.size, cv.IPL_DEPTH_8U, 3) 
cv.SetData(cv_im, im.tostring()) 
cv_mask = cv.CreateImageHeader(mask.size, cv.IPL_DEPTH_8U, 1) 
cv.SetData(cv_mask, mask.tostring()) 

#do the inpainting 
cv_painted_im = cv.CloneImage(cv_im) 
cv.Inpaint(cv_im, cv_mask, cv_painted_im, 3, cv.CV_INPAINT_NS) 

#convert back to PIL 
painted_im = Image.fromstring("RGB", cv.GetSize(cv_painted_im), cv_painted_im.tostring()) 
painted_im.show() 

し、得られた画像:

painted image

答えて

8

いい結果が得られる方法は、Navier-Stokes Image Restoration.です。私はOpenCVにはありますが、PILについてはわかりません。

あなたの例:

enter image description hereenter image description here

私はMathematicaのでそれをやりました。

編集

あなたreuquestを1として、コードは次のとおりです。

i = Import["http://i.stack.imgur.com/uEPqc.png"]; 
Inpaint[i, [email protected]@i, Method -> "NavierStokes"] 

ColorNegate @が...部品は交換用のマスクを作成します。 充填は、Inpaint[]コマンドでのみ行われます。

+0

これはいいですね。あなたはあなたのmathematicaコードを投稿できますか? – jterrace

+0

私はPILからopencvに変換し、私の質問で絵を描くサンプルのPythonコードをいくつか入れました。あなたの答えを受け入れました。ありがとう! – jterrace

+0

@jterrace喜んで助けてください!私はあなたの質問にも投票しました。なぜなら、それはSOの有用性の非常に良い例なのですから。 –

0

あなたは、このアプリケーションをデプロイしている方法に応じて、別のオプションは、使用するかもしれませんGimpのpython interfaceは画像操作を行う。

私がリンクしているドキュメントページは、Pythonアプリケーションのバックグラウンドgimpインスタンスと対話するのではなく、PythonでGIMPプラグインを書く方が対象ですが、これも可能ですgimp/pythonインターフェイスでは、私はちょっと曇っています)。

+0

それはこのような何かを行うためのルーチンを持っていますか? – jterrace

+0

悲しいことに、あなたが望むものに合ったプラグインがあるかどうかは分かりません。ビルドするにはもっと強力なツールがあるので、気づかないかもしれないオプションとして主に投稿しました:マスク、ガウスぼかしフィルタ、および低レベルピクセル領域オブジェクトに対する非超音波インタフェースを含む。今、私はそれについてもっと考えています。特に、たくさんのファイルを処理しなければならない場合は、あなたの目的のために過度に肥大化するかもしれません。その価値があるかもしれないアルゴリズムの1つに、Gimp用の[resynthesizer](http://www.logarithmic.net/pfh/resynthesizer)プラグインがあります。これは「コンテンツ対応の塗りつぶし」アルゴリズムです。 –

-1

あなたはまた、例えば、機能CreateImage()でマスクを作成することができます。

inpaint_mask = cv.CreateImage(cv.GetSize(im), 8, 1) 
関連する問題