2012-04-07 75 views
5

Như bạn thấy, tôi có hình dạng và đường viền màu trắng của chúng. Tôi muốn điền vào các hình dạng màu trắng.Hình dạng tô màu Matlab màu trắng

Đầu vào là: enter image description here

Tôi muốn để có được kết quả này: http://s12.postimage.org/z3txnlb3f/untitled33.png

Ai có thể giúp tôi xin vui lòng với mã này? nó không thay đổi hình elip màu đen thành màu trắng. Cảm ơn rất nhiều:]]

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 
CC = bwconncomp(Ibw); %Ibw is my binary image 
stats = regionprops(CC,'pixellist'); 

% pass all over the stats 
for i=1:length(stats), 
size = length(stats(i).PixelList); 
% check only the relevant stats (the black ellipses) 
if size >150 && size < 600 
    % fill the black pixel by white  
    x = round(mean(stats(i).PixelList(:,2))); 
    y = round(mean(stats(i).PixelList(:,1))); 
    Ibw = imfill(Ibw, [x, y]); 
end; 
end; 

imshow(Ibw); 
+0

liên quan đến http://stackoverflow.com/questions/10053651/ get-the-pixels-thuộc-một-hình dạng – Gray

Trả lời

1

Nếu hình ảnh của bạn là tất cả màu đen & trắng, và bạn có bộ công cụ xử lý hình ảnh, sau đó điều này có vẻ như những gì bạn cần: http://www.mathworks.co.uk/help/toolbox/images/ref/imfill.html

Cái gì như:

imfill(image, [startX, startY]) 

nơi startX, startY là pixel trong khu vực bạn muốn điền.

+0

cảm ơn bạn, nhưng làm thế nào tôi có thể tìm thấy các điểm ảnh của mỗi hình dạng? –

+0

Bạn có thể sử dụng bwconncomp (http://www.mathworks.co.uk/help/toolbox/images/ref/bwconncomp.html). Nếu bạn làm một cái gì đó như 'c = bwconncomp (image)', thì bạn có thể thấy các thành phần với 'c.PixelIdxList'. Đây là các chỉ mục tuyến tính vào hình ảnh, cho bạn biết pixel nào trong thành phần nào. Bạn muốn bỏ qua một thành phần (nền), mà bạn có thể giả định là danh sách lớn nhất trong PixelIdxList, hoặc bạn có thể tìm kiếm một danh sách có chứa một điểm ảnh cạnh. Từ phần còn lại của các thành phần trong c, bạn cần phải kiểm tra xem chúng có màu đen hay không. Nếu có, hãy sử dụng chúng. – Richante

+0

Ồ, tôi nhận thấy hình ảnh của bạn cũng có viền trắng lớn. Bạn cũng muốn bỏ qua thành phần đó (vì vậy có thể bỏ qua hai thành phần lớn nhất trong 'PixelIdxList'). – Richante

3

Mã của bạn có thể được cải thiện và đơn giản hóa như sau. Đầu tiên, phủ nhận Ibw và sử dụng BWCONNCOMP để tìm các thành phần 4 kết nối sẽ cung cấp cho bạn các chỉ mục cho từng vùng màu đen. Thứ hai, sắp xếp các vùng được kết nối theo số lượng điểm ảnh trong chúng và chọn tất cả nhưng hai điểm ảnh lớn nhất sẽ cho bạn chỉ số cho tất cả các vùng tròn nhỏ hơn. Cuối cùng, các chỉ số tuyến tính của các vùng nhỏ hơn này có thể được thu thập và sử dụng để điền vào các vùng có màu trắng. Dưới đây là đoạn code (khá một chút ngắn hơn và không đòi hỏi bất kỳ vòng lặp):

I = imread('untitled4.bmp'); 
Ibw = im2bw(I); 

CC = bwconncomp(~Ibw, 4); 
[~, sortIndex] = sort(cellfun('prodofsize', CC.PixelIdxList)); 

Ifilled = Ibw; 
Ifilled(vertcat(CC.PixelIdxList{sortIndex(1:end-2)})) = true; 
imshow(Ifilled); 

Và đây là hình ảnh kết quả:

enter image description here

+0

hi gnovice, cảm ơn bạn về sự giúp đỡ của bạn, nó không hoạt động nhưng Richante đã giúp tôi .. cảm ơn:] –

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