2012-01-10 49 views
13

tôi muốn lấp đầy màu sắc trong vùng trắng cho các ứng dụng Sơn dựa vì vậy hãy cho tôi gợi ý cho làm thế nào để làm công việc này ..làm thế nào để điền vào màu sắc trong hình ảnh trong khu vực cụ thể?

enter image description here

+5

hãy xem thuật toán lấp đầy cổ điển: http://en.wikipedia.org/wiki/Flood_fill – Jave

+0

Xin chào, Đây là [liên kết] [1] để nhận được điểm của hình ảnh. có nghĩa là chỉ một phần thực của hình ảnh và loại bỏ phần trong suốt. nhưng tôi không thể ràng buộc khu vực. [1]: http://brownandroidattack.blogspot.com/2010/03/image-transparency-aka-absurd.html –

+1

Cảm ơn rất nhiều Jave về thông tin của alogrithm floodf –

Trả lời

17

Tôi tìm thấy giải pháp với lũ điền algoritham điền

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++; 
    } 
}} 

lũ android:

Xem FloodFill

+0

Đẹp nhất Nhưng nếu tôi chỉ thêm thuật toán này vào ứng dụng Android của tôi nếu tôi gọi hàm FloodFill (với các thuộc tính tương ứng) thì nó sẽ hoạt động? Và những gì tôi cần phải cung cấp cho là điểm thuộc tính trong chức năng này? –

+0

cảm ơn @Hardik, đây thực sự là một thuật toán được viết độc đáo. nhưng đối với điện thoại Android, nó có vẻ rất chậm. bạn có biết cách nào khác để lấp đầy lũ lụt không? –

+0

liên kết này nhanh hơn: http://stackoverflow.com/a/17426163/401403 – Arash

4

Dưới đây là một ứng dụng nhanh chóng sử dụng Python và OpenCV (nên có sẵn trên Android nếu bạn cố gắng hết sức):

"""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) 

Mỗi khi người dùng nhấp vào hình ảnh, ứng dụng sẽ tràn ngập vị trí nhấp chuột làm hạt giống. Màu sắc được chọn ngẫu nhiên. Bạn có thể thay đổi dung sai bằng cách sửa đổi giá trị của TOL (hoặc TOL_BGR). Dưới đây là kết quả sau một vài lần nhấp chuột:

enter image description here

Thuật toán nói chung là như nhau bất kể những gì công nghệ bạn sử dụng.

+0

bạn có thể vui lòng gửi mã nguồn, vì tôi không thể hiểu được phần này – dineshprasanna

+0

Không, tôi sẽ không gửi email cho bạn mã codez. Mã nguồn là trong câu trả lời của tôi, anyway. Nếu bạn không hiểu bất cứ điều gì, sau đó xin vui lòng đọc tài liệu cho các chức năng có liên quan - nó có sẵn. – misha

+0

ok không có vấn đề, cảm ơn bạn đã trả lời tôi sẽ thử – dineshprasanna

0

1) Có Split lên hình ảnh này cho mỗi phần màu riêng rẽ với cùng kích thước như hình ảnh thực tế và phần khác là minh bạch. 2) Có hình ảnh hoàn chỉnh với mỗi phần sơn màu khác nhau trong thư mục drawable ur - đây chỉ là hình ảnh tham khảo.

3) Thêm tất cả những hình ảnh chia tay trong cách bố trí khung và thiết lập tất cả chia tay vô hình ban đầu và thiết lập có thể nhìn thấy hình ảnh thực tế chỉ

4) đang nóng màu cho từng chia tay với hình ảnh tham khảo ur (bước 2) Ví dụ: handSplitImageColor = green;

4) Đặt trình nghe cho bố cục khung tìm vị trí x và y và chuyển vị trí x và y sang hình ảnh tham chiếu ur (bước 2) và tìm màu ở vị trí cụ thể đó và khớp màu với bước 4 và điền thông tin cụ thể vào hình ảnh đó và đặt mức hiển thị đúng cho hình ảnh được chia nhỏ đó. Vì vậy, chỉ có phần đó sẽ được lấp đầy bởi màu sắc vì phần khác là trong suốt.

Đây là các bước tôi đã sử dụng cho một trong các loại vấn đề tương tự của tôi.

Nhưng tôi không nghĩ đây là giải pháp tốt hơn nhưng nó hoạt động tốt cho tôi.

Các vấn đề liên quan