2012-01-10 139 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匹配并填充该图像中的特定内容,并将该分割图像的可见性设置为真。所以只有那部分会被颜色填充,因为其他部分是透明的。

这些是我用于我的一个相同类型的问题的步骤。

但我不认为这是更好的解决方案,但它适用于我。