私はPILの画像を作成すると、空の画像の空間を充填するPILを使用した:近く色(別名インペインティング)
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()
し、得られた画像:
これはいいですね。あなたはあなたのmathematicaコードを投稿できますか? – jterrace
私はPILからopencvに変換し、私の質問で絵を描くサンプルのPythonコードをいくつか入れました。あなたの答えを受け入れました。ありがとう! – jterrace
@jterrace喜んで助けてください!私はあなたの質問にも投票しました。なぜなら、それはSOの有用性の非常に良い例なのですから。 –