2012-06-18 51 views
7

Tôi có một hình ảnh nhị phân đại diện cho một số trong MATLAB:vùng Fill giữa hai thành phần kết nối trong MATLAB

image description

Tôi muốn điền vào tất cả các chữ số. Kết quả mong muốn là:

enter image description here

Điều duy nhất tôi thấy là imfill chức năng, nhưng điều đó đã không thực sự hữu ích vì tôi đã bị mất dữ liệu bên trong của tôi (của 9 vòng tròn bên trong ví dụ).

Trả lời

4

Vấn đề là cách phân biệt các lỗ từ các chữ số. Một giải pháp quảng cáo có thể là lọc chúng theo diện tích của các pixel bên trong.

function SolveSoProblem() 

    I = imread('http://i.stack.imgur.com/SUvif.png'); 

    %Fill all the holes 
    F = imfill(I,'holes'); 

    %Find all the small ones,and mark their edges in the image 
    bw = bwlabel(I); 
    rp = regionprops(bw,'FilledArea','PixelIdxList'); 
    indexesOfHoles = [rp.FilledArea]<150; 
    pixelsNotToFill = vertcat(rp(indexesOfHoles).PixelIdxList); 
    F(pixelsNotToFill) = 0; 
    figure;imshow(F); 

    %Remove the inner area 
    bw1 = bwlabel(F,4); 
    rp = regionprops(bw1,'FilledArea','PixelIdxList'); 
    indexesOfHoles1 = [rp.FilledArea]<150; 
    pixelListToRemove = vertcat(rp(indexesOfHoles1).PixelIdxList); 
    F(pixelListToRemove) = 0; 

    figure;imshow(F); 
end 

Sau bước (1):

enter image description here

Sau bước (2):

enter image description here

+0

giải pháp ấn tượng. Cảm ơn rất nhiều !! Điều nhỏ nhặt duy nhất tôi thay đổi là xóa các đối tượng không gian nhỏ hơn 2 phần trăm hình ảnh và nó hoạt động tuyệt vời !! – user1240792

0

Giả sử các điểm ảnh trên bên trái luôn luôn là bên ngoài các khu vực cần điền:

làm việc trên dòng trên cùng, sao chép pixel cho hình ảnh đầu ra

Khi bạn đến một điểm ảnh màu trắng theo sau là một điểm ảnh màu đen trong hình ảnh đầu vào, bắt đầu thiết pixel trắng trong hình ảnh đầu ra, cho đến khi bạn đến pixel màu đen theo sau là một điểm ảnh màu trắng.

+3

Sẽ không hoạt động đối với "hình ảnh ồn ào" ... –

+0

@EitanT: đủ chính xác - Tôi đang thực hiện mẫu được cung cấp. –

+1

@MartinThompson hình ảnh là hình ảnh nhị phân, vì vậy nhận xét bạn nhận được không liên quan. – mmgp

6

Một khả năng khác là sử dụng BWBOUNDARIES chức năng, trong đó:

vết ranh giới bên ngoài của đối tượng, cũng như ranh giới của lỗ bên trong các đối tượng này

Đó thông tin được chứa trong đầu ra thứ tư A, một ma trận kề đại diện cho các phụ thuộc cha-con-lỗ.

%# read binary image 
bw = imread('SUvif.png'); 

%# find all boundaries 
[B,L,N,A] = bwboundaries(bw, 8, 'holes'); 

%# exclude inner holes 
[r,~] = find(A(:,N+1:end));  %# find inner boundaries that enclose stuff 
[rr,~] = find(A(:,r));      %# stuff they enclose 
idx = setdiff(1:numel(B), [r(:);rr(:)]); %# exclude both 
bw2 = ismember(L,idx);      %# filled image 

%# compare results 
subplot(311), imshow(bw), title('original') 
subplot(312), imshow(imfill(bw,'holes')), title('imfill') 
subplot(313), imshow(bw2), title('bwboundaries') 

enter image description here

+0

Tuyệt vời! Tôi có cảm giác rằng phải có chức năng Matlab, nhưng không biết –

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