我发现有几个区域指的是在matlab中填充二进制图像中的间隙,但是我仍在努力。我写了下面的代码,但我无法让它工作。这是我的二进制图像:
。
但是,我想要实现的是以下
。
有谁知道怎么做?我一直在尝试使用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');
答案 0 :(得分:1)
有两个主要问题:所需对象没有易于使用的区别特征,它触及其他对象。第二个问题也许可以通过形态学打开/关闭来清除(触摸物体很薄,所需的物体不是,总是这样吗?),但第一个问题仍然存在。如果您的对象触及边缘但其他人没有触及,反之亦然,您可以使用imfill和减法执行某些操作。就像现在一样,MAYBE可能会起作用:
精确的解决方案在很大程度上取决于图片的附加约束。我相信它不是一次性的,而是你有更多的这些图片,并希望在所有的上正确找到对象?你必须检查所有图片的内容,例如,如果对象总是只接触薄的东西,或者它总是只接触上边缘等。