我目前正在使用MATLAB的bweuler
功能查找"孔的数量"在一个对象中。由于这些图像的分辨率相对较低,我有困难,目前只能达到50%的成功率。下面是一个失败的图像示例(为方便测试而裁剪):
标准化并按比例放大,以便您可以查看正在进行的操作:
这里的洞数应该是1,但是我还没有找到一种可靠的方法来限制这个小区域,同时保持周围环境的完好无损。
我当前的方法使用自适应阈值,但这是有问题的,因为正确的窗口大小在所有样本中不是恒定的。例如,此示例将使用窗口大小为6,但其他示例将失败。
作为参考,这里有几个失败案例:
N = 1 - >
N = 2 - >
我的当前方法处理的一些情况:
N = 6 - >
N = 1 - >
N = 1 - >
我也会发布我当前代码的简短版本,但正如我之前所说,我不相信自适应阈值处理方法会起作用。在此期间,我将使用其他一些形态分割方法。只需阅读其中一个测试图像并调用findholes(image)
。
function N = findholes(I)
bw = imclearborder(adaptivethreshold(I, 9));
N = abs(1 - bweuler(bw2, 4));
end
function bw=adaptivethreshold(IM,ws,C,tm)
%ADAPTIVETHRESHOLD An adaptive thresholding algorithm that seperates the
%foreground from the background with nonuniform illumination.
% bw=adaptivethreshold(IM,ws,C) outputs a binary image bw with the local
% threshold mean-C or median-C to the image IM.
% ws is the local window size.
% C is a constant offset subtracted from the final input image to im2bw (range 0...1).
% tm is 0 or 1, a switch between mean and median. tm=0 mean(default); tm=1 median.
%
% Contributed by Guanglei Xiong (xgl99@mails.tsinghua.edu.cn)
% at Tsinghua University, Beijing, China.
%
% For more information, please see
% http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm
if (nargin < 2)
error('You must provide IM and ws');
end
if (nargin<3)
C = 0;
tm = 0;
end
if (nargin==3)
tm=0;
elseif (tm~=0 && tm~=1)
error('tm must be 0 or 1.');
end
IM=mat2gray(IM);
if tm==0
mIM=imfilter(IM,fspecial('average',ws),'replicate');
else
mIM=medfilt2(IM,[ws ws]);
end
sIM=mIM-IM-C;
bw=im2bw(sIM,0);
bw=imcomplement(bw);
end