填补二进制图像中的间隙

时间:2016-04-20 09:58:41

标签: matlab image-processing

我发现有几个区域指的是在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 个答案:

答案 0 :(得分:1)

有两个主要问题:所需对象没有易于使用的区别特征,它触及其他对象。第二个问题也许可以通过形态学打开/关闭来清除(触摸物体很薄,所需的物体不是,总是这样吗?),但第一个问题仍然存在。如果您的对象触及边缘但其他人没有触及,反之亦然,您可以使用imfill和减法执行某些操作。就像现在一样,MAYBE可能会起作用:

  • 打开/关闭删除连接,因此您的对象不相交。
  • 使用imfill,移除这个薄水平物的剩余部分。
  • 然后,您可以bwlabel删除触及图像侧面或底部的所有内容 - 只显示只留下您的对象的情况。

精确的解决方案在很大程度上取决于图片的附加约束。我相信它不是一次性的,而是你有更多的这些图片,并希望在所有的上正确找到对象?你必须检查所有图片的内容,例如,如果对象总是只接触薄的东西,或者它总是只接触上边缘等。