Matlab:图像区域分析器。 “bwpropfilt”的替代品?

时间:2016-09-29 10:37:05

标签: image matlab image-processing

我正在运行基本边缘检测,以根据此 http://www.mathworks.com/videos/edge-detection-with-matlab-119353.html 检测窗口区域

edge成功运作:

final_edge = edge(gray_I,'sobel');
BW_out = bwareaopen(imfill(final_edge,'holes'),20);
figure; 
imshow(BW_out);

现在,根据以下代码来过滤基于属性的图像时,我的 MATLAB R2013a 似乎无法识别此bwpropfilt方法。< / p>

% imageRegionAnalyzer(BW);

% Filter image based on image properties
BW_out = bwpropfilt(BW_out,'Area', [400, 467]);
BW_out = bwpropfilt(BW_out,'Solidity',[0.5, 1]);

它说:

Undefined function 'bwpropfilt' for input arguments of type 'char'.

那么我应该选择更改此bwpropfilt

1 个答案:

答案 0 :(得分:2)

bwpropfilt只是查看从regionprops输出的相应属性,并为您提供符合该特定范围的对象,并过滤掉范围之外的对象。您可以通过显式调用regionprops来重写算法,创建一个logical数组来索引结构以仅保留在正确范围内的值(在bwpropfilt的第三个输入中看到))到要检查的属性(在bwpropfilt的第二个输入中看到)。如果要在过滤后最终重建图像,则需要使用PixelIdxList属性中的列主要线性索引,将它们全部堆叠到一个向量中,并通过设置所有内容来写入新的输出图像这些值为true

具体来说,您可以使用以下代码重现您显示的最后两行代码:

% Run regionprops and get all properties
s = regionprops(BW_out, 'all');

%%% For the first line of code
values = [s.Area];
s = s(values > 400 & values < 467);

%%% For the second line of code
values = [s.Solidity];
s = s(values > 0.5 & values < 1);

% Stack column major indices
ind = vertcat(s.PixelIdxList);

% Create output image
final_out = false(size(BW_out));
final_out(ind) = true;

final_out包含已过滤的图像,仅保留所需属性指定范围内的值。

注意

以上逻辑仅适用于从regionprops返回的属性,每个唯一区域只包含一个标量值。如果您检查bwpropfilt中的受支持属性,您会看到此列表是regionprops中找到的完整列表的子集。这是有道理的,因为某些regionprops属性会根据您选择的内容返回一个向量或矩阵,因此如果您有多个值来表征由regionprops返回的特定唯一区域,则使用范围来过滤属性会变得不明确

次要注意事项

好奇,我打开bwpropfilt看看它是如何实现的,因为我现在有MATLAB R2016a。除了一些异常处理之外,上面的逻辑基本上是如何实现bwpropfilt所以我编写的代码符合函数的逻辑。