puedo crear una imagen con PIL:PIL para llenar el espacio vacío de imagen con colores cercanos (aka inpainting)
que necesito para llenar el espacio vacío (representado como negro). Podría llenarlo fácilmente con un color estático, pero lo que me gustaría hacer es llenar los píxeles con colores cercanos. Por ejemplo, el primer píxel después del borde podría ser un desenfoque gaussiano de los píxeles rellenos. O tal vez un algoritmo de tipo push-pull descrito en The Lumigraph, Gortler, et al..
Necesito algo que no sea demasiado lento porque tengo que ejecutar esto en muchas imágenes. Tengo acceso a otras bibliotecas, como numpy, y puedes asumir que conozco los bordes o una máscara de la región exterior o dentro de la región. ¿Alguna sugerencia sobre cómo abordar esto?
ACTUALIZACIÓN:
Como sugiere Belisario, opencv's inpaint método es perfecto para esto. Aquí hay algo de código Python que utiliza OpenCV para lograr lo que quería:
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()
Y la imagen resultante:
Esto se ve bien. ¿Puedes publicar tu código matemático? – jterrace
Impresionante. He puesto un ejemplo de código python que convierte de PIL a opencv y hace la pintura en mi pregunta. Aceptó tu respuesta. ¡Gracias! – jterrace
@jterrace ¡Me alegro de ayudar! También voté tu pregunta, porque es un muy buen ejemplo de lo útil que puede ser el SO. –