2012-01-10 136 views
3

如果您正在創建一個應用程序,其中想讓圖像的「背景」透明或白色,有沒有辦法做到這一點?以編程方式使圖像的背景變得透明或白色

例如:

在圖像中,http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg,我想以編程方式變換圖像,使得僅雕像仍然存在,以及背景(即,圖像的其餘部分)是所有白色或透明的。另外,用戶可能會指出應該「保留」的圖像部分,其餘部分應該全部是白色或透明的。

這怎麼辦?另外,如果有一個合適的Java庫或一段代碼,這將會有所幫助。

問候

+1

可能的重複 - http://stackoverflow.com/questions/665406/how-to-make-a-color-transparent-in-a-bufferedimage-and-save-as-png – mre 2012-01-10 16:45:09

+2

它不是重複的,但它是相關的。在這篇文章中,這個人想要1)以編程方式分離前景和背景2)並使背景變得透明。你提到的帖子只有2)。當然,1)是問題的一個較難的部分。 – misha 2012-01-11 02:20:55

回答

2

對於該特定圖像,有幾種方法可以解決部分問題。也許如果你結合了幾種方法提供用戶交互選擇,你可以在相當短的時間內開發一個好的軟件。我會用它!

你和米莎已經討論過的前兩個項目:用Canny或其他手段

  1. 邊緣檢測。我建議你應該使用「原始」邊緣強度圖像,而不是對邊緣強度進行閾值生成二值化圖像。請注意,在這種情況下,這個數字非常關注,大部分背景都沒有關注。儘管這不是一個通用的解決方案,但對於這個特定的圖像,可以過濾掉(a)屬於線(使用Hough或RANSAC)但(b)具有低於閾值陡度的梯度的邊。
  2. 洪水填充。 Misha已經提供了鏈接。填充「靜態」值的洪水不應太難實現(例如,相對於單擊的像素填充值爲+/- N的所有相鄰像素)。當然,考慮到由於照明和三維曲率造成的梯度,實施動態填充填充是很好的做法。 。 。哎喲!
  3. Mean shift clustering。這甚至可以作爲幫助將相同HSV值的像素聚集在一起的第一步。然而,只是眼睛的形象,前景數字的色調和大部分背景的色調是相似的。 OpenCV實現了均值漂移。有一個相關CAMSHIFT算法的視頻在工作:http://www.youtube.com/watch?v=iBOlbs8i7Og
  4. 邊緣跟隨強邊緣。如果用戶點擊靠近邊緣,則識別最接近的強邊緣,然後使用輪廓跟蹤(或「輪廓跟蹤」)算法。基本輪廓跟隨算法適用於二值圖像;你可以調整你的算法,試圖在RGB空間中佔據強大的優勢。整蠱!
  5. 由於您正在爲用戶編寫軟件,因此請花一些時間來提高軟件的可用性,而不是僅僅試圖解決一般的圖像處理問題。
  6. 檢查背景曲線的遮擋。確定項目是否屬於背景的另一種方法是確定它是否被前景對象遮擋(隱藏)。如果發現兩條共線的線段並且具有平緩的漸變(即它們沒有聚焦),則它們可能是兩條線段而不是一條線段,因爲它們被前景對象遮擋。
  7. 如果您有任何機會可以使用相機而不是現有圖像,則可以通過在不同對焦設置下拍攝多張連續圖像來模仿「光場」或全光照相機(例如Lytro https://www.lytro.com/camera)。這可以幫助您根據漸變的變化識別不同深度的圖形。如果雕像相對靠近相機,當相機朝向無限遠對焦時,它將失去焦點。

提高可用性

  1. 假設你可以將圖像分割成是相當不同的塊,提示用戶點擊屬於同一感興趣對象塊。每個塊可以有自己的邊緣強度調整參數集,顏色驗收範圍等。具有塊特定參數可以幫助使軟件可用,即使存在影響分割的陰影,變化的光照等。類似這樣的事情可以通過組合選擇在GIMP和Photoshop中完成,但它的可用性不如它。

  2. 對於已識別的塊,實現「對齊邊緣」功能,可幫助用戶將發現的邊緣曲線移動到真實的邊緣曲線上。如果用戶抓取一個塊輪廓並向一個方向拖動它,輪廓可以在該方向上捕捉到下一個較強的邊緣。

  3. 提供批處理選項。如果用戶在相同條件下拍攝了一系列照片,則用戶選擇的第一張圖像塊可以幫助引導軟件設置連續圖像的參數。這並不是爲了解決一般的分割問題,但可能會爲用戶節省一些特定圖像組的時間和精力。

這是一個有趣的問題。祝你好運!

2

什麼你問的是前臺和後臺的程序分割。由於這是一個活躍的研究領域,您不太可能找到任何現成的即用型源代碼(特別是在Java中)。

如果您有時間,請查閱image segmentation並瀏覽Google學術搜索上的相關論文。你會發現在一般情況下,計算機解決問題並不是一個簡單的問題。在特定情況下,您可以嘗試利用某些條件。在您指定的圖像中,背景非常模糊,因此圖形的邊緣非常突出。與Canny operator邊緣檢測給你:

enter image description here

它並不完美,但它是一個開始。使用邊緣信息,您可以找到主要的外部輪廓並提取舞者身材。

+0

感謝您的幫助。另外,我還有一個問題。如果用戶可以指定他想保留的圖像部分呢?像這樣的東西.... http://www.mediacollege.com/adobe/photoshop/transparent/background.html。如鏈接指向的網頁所示,「使用魔術棒或套索工具,選擇您想要透明的圖像區域」。謝謝 – Vaibhav 2012-01-11 04:24:56

+0

我不熟悉Photoshop中魔棒的實現,但如果我不得不猜測,我會說他們正在使用某種洪水填充算法(http://en.wikipedia.org/wiki/Flood_fill)。也看看這個答案:http://stackoverflow.com/questions/8801047/how-to-fill-color-in-image-in-particular-area。 – misha 2012-01-11 04:48:04

+1

GIMP的來源可用。 GIMP相當於「模糊選擇」(魔術棒)的實現可以爲您提供有關調整的線索,以提高標準填充算法的穩健性。 http://www.gimp.org/source/ – Rethunk 2012-01-15 17:13:53