我正在运行基本边缘检测,以根据此 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
?
答案 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
所以我编写的代码符合函数的逻辑。