我使用PIL创建了一张图片:
我需要一些不太慢的东西,因为我必须在许多图像上运行它。我可以访问其他库,比如numpy,并且您可以假设我知道外部区域或内部区域的边界或掩码。有什么建议吗?
更新:
正如belisarius所建议的那样,opencv的inpaint方法非常适合这个问题。以下是使用opencv实现所需内容的Python代码:
我需要一些不太慢的东西,因为我必须在许多图像上运行它。我可以访问其他库,比如numpy,并且您可以假设我知道外部区域或内部区域的边界或掩码。有什么建议吗?
更新:
正如belisarius所建议的那样,opencv的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()
并生成相应的图像: