2016-04-20 5 views
0

Я нашел пару областей, относящихся к заполнению пробелов в бинарных изображениях в Matlab, однако я все еще борется. Я написал следующий код, но я не могу заставить его работать. Вот мое двоичное изображение:Заполнение пробелов в двоичном изображении

Binary_image.png.

Однако то, что я пытаюсь достичь следующих

Binary_image_after.

Кто-нибудь знает, как это сделать? Я пытался использовать imfill, но я знаю, что мне нужно определить границы также с помощью функции bwlabel, но я не знаю, как это сделать. Любая помощь будет принята с благодарностью.

%%Blade_Image_Processing 

clc; 
clear; 

%%Video file information 
obj = VideoReader('T9_720p;60p_60mm_f4.MOV'); 

% Sampling rate - Frames per second 
fps = get(obj, 'FrameRate'); 
dt = 1/fps; 

% ----- find image info ----- 
file_info = get(obj); 
image_width = file_info.Width; 
image_height = file_info.Height; 

% Desired image size 
x_range = 1:image_height; 
y_range = 1:image_width; 
szx = length(x_range); 
szy = length(y_range); 



%%Get grayscale image 
grayscaleimg1 = rgb2gray(read(obj,36)); 
grayscaleimg = imadjust(grayscaleimg1); 
diff_im = medfilt2(grayscaleimg, [3 3]); 
t1=60; 
t2=170; 
range=(diff_im > t1 & diff_im <= t2); 
diff_im (range)=255; 
diff_im (~range)=0; 

% Remove all those pixels less than 300px 
    diff_im = bwareaopen(diff_im,2000); 

    %imshow(diff_im) 

    %imhist(grayscaleimg) 

    %Fill gaps in binary image 
    BW2 = imfill(diff_im,'holes'); 

ответ

1

Есть две основные проблемы: желаемый объект не имеет легкоиспользуемых отличительных признаков, и он касается другого объекта. Вторая проблема может быть, возможно, очищена с морфологическим открытием/закрытием (касание объекта тонкое, желаемого объекта нет, всегда так ли?), Но первая проблема остается. Если ваш объект коснулся края, но другие не сделали этого или наоборот, вы могли бы что-то сделать с imfill и вычитаниями. Как сейчас, MAYBE что-то вроде этого будет работать:

  • С открытием/закрытием удалите соединение, поэтому ваш объект не пересекается.
  • С помощью imfill удалите то, что осталось от этой тонкой горизонтальной вещи.
  • Затем вы можете удалить bwlabel и удалить все, что касается сторон или снизу изображения - в показанном случае, который оставил бы только ваш объект.

Точное решение сильно зависит от того, какие дополнительные ограничения существуют для ваших фотографий. Я считаю, что это не один выстрел, скорее у вас есть больше этих фотографий и вы хотите правильно найти объекты на всех? Вы должны проверить, что удерживается для всех изображений, например, если объект всегда касается только чего-то тонкого или всегда касается только верхнего края и т. Д.

Смежные вопросы