2012-01-10 141 views
13

我要填寫的白色區域的色水性塗料的應用 所以請給我如何做這項工作的建議..如何在特定區域填充圖像顏色?

enter image description here

+5

看看經典的洪水填充算法:http://en.wikipedia.org/wiki/Flood_fill – Jave 2012-01-10 09:46:15

+0

嗨, 這裏是[鏈接] [1]獲取圖像的要點。僅指圖像的實際部分並消除透明部分。但我不能限制這個區域。 [1]:http://brownandroidattack.blogspot.com/2010/03/image-transparency-aka-absurd.html – 2012-01-10 09:52:17

+1

感謝您使用什麼工具floodfill alogrithm – 2012-01-10 11:35:54

回答

17

我發現了洪水的解決方案填補了機器人algoritham

private void FloodFill(Bitmap bmp, Point pt, int targetColor, int replacementColor){ 
Queue<Point> q = new LinkedList<Point>(); 
q.add(pt); 
while (q.size() > 0) { 
    Point n = q.poll(); 
    if (bmp.getPixel(n.x, n.y) != targetColor) 
     continue; 

    Point w = n, e = new Point(n.x + 1, n.y); 
    while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) { 
     bmp.setPixel(w.x, w.y, replacementColor); 
     if ((w.y > 0) && (bmp.getPixel(w.x, w.y - 1) == targetColor)) 
      q.add(new Point(w.x, w.y - 1)); 
     if ((w.y < bmp.getHeight() - 1) 
       && (bmp.getPixel(w.x, w.y + 1) == targetColor)) 
      q.add(new Point(w.x, w.y + 1)); 
     w.x--; 
    } 
    while ((e.x < bmp.getWidth() - 1) 
      && (bmp.getPixel(e.x, e.y) == targetColor)) { 
     bmp.setPixel(e.x, e.y, replacementColor); 

     if ((e.y > 0) && (bmp.getPixel(e.x, e.y - 1) == targetColor)) 
      q.add(new Point(e.x, e.y - 1)); 
     if ((e.y < bmp.getHeight() - 1) 
       && (bmp.getPixel(e.x, e.y + 1) == targetColor)) 
      q.add(new Point(e.x, e.y + 1)); 
     e.x++; 
    } 
}} 

洪水填充:與相同尺寸分別

請參閱各顏色的部分這個FloodFill

+0

不錯的一個但如果我只是將這個算法添加到我的Android應用程序,如果我調用函數FloodFill(具有相應的屬性),那麼它會工作嗎?在這個函數中我應該給作爲屬性Point? – 2012-03-09 05:30:14

+0

感謝@Hardik,它真的是一個很好的書面算法。但對於Android手機來說,它似乎非常緩慢。你知道任何其他方式填補洪水? – 2012-08-11 06:57:08

+0

這個鏈接是如此之快:http://stackoverflow.com/a/17426163/401403 – Arash 2014-01-26 17:37:58

4

下面是使用Python和OpenCV(應提供一個快速的應用程序在Android上,如果你足夠努力):

"""Flood fills with random color on click. Press `q' to exit.""" 
import cv 
import sys 
import random 

TOL = 10 
TOL_BGR = (TOL, TOL, TOL, 0) 

def click(event,x,y,flags,im): 
    if event == cv.CV_EVENT_LBUTTONDOWN: 
     b,g,r = [ random.random() * 255 for i in range(3) ] 
     cv.FloodFill(im, (x,y), (b,g,r,0), TOL_BGR, TOL_BGR) 

im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR) 
cv.NamedWindow(__file__, 1) 
cv.SetMouseCallback(__file__, click, im) 
while True: 
    cv.ShowImage(__file__, im) 
    key = cv.WaitKey(33) 
    if chr(key & 0xff) == 'q': 
     break 
cv.SaveImage('floodfill.png', im) 

每當用戶點擊圖像,使用點擊位置作爲種子應用洪水填充。顏色是隨機挑選的。您可以通過修改TOL(或TOL_BGR)的值來更改公差。這裏有一對夫婦的點擊後的結果:

enter image description here

的一般算法是一樣的,不管你用什麼樣的技術。

+0

可否請您發送源代碼,因爲我無法理解這部分 – dineshprasanna 2012-10-23 01:54:44

+0

不,我不會給你發郵件給codez。無論如何,源代碼都在我的答案中。如果你什麼都不懂,那麼請閱讀相關功能的文檔 - 它隨時可用。 – misha 2012-10-23 10:07:56

+0

好的沒問題,謝謝你的回覆我會嘗試 – dineshprasanna 2012-10-23 11:34:02

0

1)有分裂圖像因爲實際圖像和其他部分是透明的。 2)在繪圖文件夾中有不同顏色的每個部分繪製完整的圖像 - 這只是參考圖像。

3)在幀佈局添加所有分裂圖像和設置了所有分割無形最初和設置爲實際圖像僅

4)熱代碼從UR參考圖像(步驟2)分割爲每個顏色可見例如handSplitImageColor = green;

4)設置框架佈局的偵聽器找出x和y位置,並將x和y位置傳遞給您的參考圖像(步驟2),並找出該特定位置的顏色並使其與步驟4匹配並填充該圖像中的特定內容,並將該分割圖像的可見性設置爲真。所以只有那部分會被顏色填充,因爲其他部分是透明的。

這些是我用於我的一個相同類型的問題的步驟。

但我不認爲這是更好的解決方案,但它適用於我。