我正在运行基本的边缘检测来检测基于这个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
方法。
% 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
呢?
发布于 2016-09-29 13:32:11
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
的,因此我编写的代码与函数的逻辑是一致的。
https://stackoverflow.com/questions/39767979
复制相似问题