2011-08-17 119 views
9

我與PIL創建一個空的圖像圖像空間:使用PIL,以填補附近顏色(又名補繪)

example image

我需要填寫的空白空間(被描繪爲黑色)。我可以很容易地用靜態顏色填充它,但我想要做的是用附近的顏色填充像素。例如,邊界之後的第一個像素可能是填充像素的高斯模糊。或者可能是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() 

而產生的圖像:

painted image

回答

8

結果不錯的方法是Navier-Stokes Image Restoration.我知道OpenCV有它,不知道PIL。

你舉的例子:

enter image description hereenter image description here

我用Mathematica做到了。

編輯

根據您的reuquest,代碼:

i = Import["http://i.stack.imgur.com/uEPqc.png"]; 
Inpaint[i, [email protected]@i, Method -> "NavierStokes"] 

的ColorNegate @ ...部分創建更換面具。 填充只用Inpaint[]命令完成。

+0

這看起來不錯。你可以發佈你的mathematica代碼嗎? – jterrace

+0

太棒了。我已經把一些示例python代碼從PIL轉換爲opencv,並在我的問題中進行繪製。接受你的答案。謝謝! – jterrace

+0

@jterrace很高興幫助!我也投了你的問題,因爲這是一個非常好的例子,說明SO有多有用。 –

0

取決於你如何部署該應用程序,另一個選擇可能是使用Gimp的python interface來做圖像處理。

我鏈接的文檔頁面是面向更傾向於在Python寫GIMP插件,而不是從一個Python應用程序背景瘸子實例交互,但我敢肯定,這也有可能(它已經有一段時間,因爲我打與gimp/python界面,我有點朦朧)。

+0

它有一個例行程序做這樣的事情? – jterrace

+0

不幸的是,我不確定它是否有一個匹配你想要的插件...我主要發佈它作爲一個選項,你可能不知道,因爲它有一些更強大的工具來建立:面具,高斯模糊濾波器,以及到低級像素區域對象的pythonic接口。現在我想到了更多,爲了您的目的,它可能會變得過於誇張,特別是如果您必須處理大量文件。雖然有一種算法可以讓它值得,但Gimp的[resynthesizer]插件(http://www.logarithmic.net/pfh/resynthesizer)是一種「內容感知填充」算法。 –

-1

你也可以用函數CreateImage()創建蒙版,例如:

inpaint_mask = cv.CreateImage(cv.GetSize(im), 8, 1)