2016-09-29 229 views
0

我运行基本边缘检测在此基础上http://www.mathworks.com/videos/edge-detection-with-matlab-119353.htmlMatlab:图像区域分析器。 'bwpropfilt'的替代方案?

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

回答

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。除了一些异常处理之外,上述逻辑本质上是如何实现的,因此我编写的代码与函数的逻辑一致。

+1

我的上帝我一直在你的个人资料中游荡,你是一个活着的爱因斯坦!顺便说一句,非常感谢你! –

+1

@ Hey-men-whatsup哈哈哈,你太善良了:)我不会称自己为爱因斯坦本身,主要是因为我认为我有更好的算术能力:D。无论哪种方式,非常感谢您的意见,你非常欢迎。祝你好运! – rayryeng