我與PIL創建一個空的圖像圖像空間:使用PIL,以填補附近顏色(又名補繪)
我需要填寫的空白空間(被描繪爲黑色)。我可以很容易地用靜態顏色填充它,但我想要做的是用附近的顏色填充像素。例如,邊界之後的第一個像素可能是填充像素的高斯模糊。或者可能是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
太棒了。我已經把一些示例python代碼從PIL轉換爲opencv,並在我的問題中進行繪製。接受你的答案。謝謝! – jterrace
@jterrace很高興幫助!我也投了你的問題,因爲這是一個非常好的例子,說明SO有多有用。 –