creo un'immagine con PIL:Utilizzando PIL per riempire lo spazio vuoto di immagini con colori nelle vicinanze (aka inpainting)
ho bisogno di riempire lo spazio vuoto (dipinto come il nero). Potrei facilmente riempirlo con un colore statico, ma quello che mi piacerebbe fare è riempire i pixel con i colori vicini. Ad esempio, il primo pixel dopo il bordo potrebbe essere una sfocatura gaussiana dei pixel riempiti. O forse un tipo di algoritmo di push-pull descritto in The Lumigraph, Gortler, et al..
ho bisogno di qualcosa che non è troppo lento perché devo correre questo su molte immagini. Ho accesso ad altre biblioteche, come NumPy, e si può supporre che io conosco le frontiere o una maschera della regione al di fuori o regione all'interno. Qualche suggerimento su come affrontarlo?
UPDATE:
Come suggerito da Belisario, opencv's inpaint metodo è perfetto per questo. Ecco alcuni codice Python che utilizza OpenCV per ottenere quello che volevo:
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()
E l'immagine risultante:
Questo sembra carino. Puoi pubblicare il tuo codice mathematica? – jterrace
Fantastico. Ho messo un codice Python esemplificativo che converte da PIL in opencv e fa il dipinto nella mia domanda. Accettata la tua risposta Grazie! – jterrace
@jterrace Contento di aiutare! Ho votato anche la tua domanda, perché è un ottimo esempio di quanto possa essere utile SO. –