Как залить цвет в изображении в определенной области? - PullRequest
13 голосов
/ 10 января 2012

Я хочу заполнить цвет в белой области для приложения на основе краски поэтому, пожалуйста, дайте мне совет, как сделать эту работу ..

enter image description here

Ответы [ 3 ]

19 голосов
/ 19 января 2012

Я нашел решение с заполнением Flood 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++;
    }
}}

Flood fill в Android:

См. Это FloodFill

4 голосов
/ 11 января 2012

Вот быстрое приложение, использующее 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 голосов
/ 25 марта 2013

1) Разделяйте изображение для каждой цветовой части отдельно с тем же размером, что и фактическое изображение, а другая часть является прозрачной. 2) Получите полное изображение, на котором каждая часть раскрасится другим цветом, в папке для рисования - это просто контрольное изображение.

3) Добавьте все разделенные изображения в макет кадра и установите все разделенные невидимыми изначально и установите видимыми только фактическое изображение

4) Горячий код цвет для каждого разделения на эталонное изображение (шаг 2), например, handSplitImageColor = зеленый;

4) Установите прослушиватель для макета кадра, определите положение x и y и передайте положение x и y своему эталонному изображению (шаг 2), найдите цвет в этом конкретном месте и сопоставьте цвет с шагом 4 заполнить конкретное в этом изображении и установить истинность видимости для этого разделенного изображения. Таким образом, только эта часть будет заполнена цветом, так как другая часть прозрачна.

Это шаги, которые я использовал для одной из моих проблем такого же типа.

Но я не думаю, что это лучшее решение, но оно хорошо работает для меня.

...