在MATLAB中显示第二长的行?

时间:2016-08-30 13:32:54

标签: matlab

当使用具有多行的二进制图像时,我知道此代码显示最长行:

lineStats = regionprops(imsk, {'Area','PixelIdxList'});
[length, index] = max([lineStats.Area]);
longestLine = zeros(size(imsk));
longestLine(lineStats(index).PixelIdxList)=1;
figure
imshow(longestLine)

有没有办法显示第二长的线?我需要显示一条比最长线稍短的线,以便连接它们。

编辑:有没有办法在二进制图像上显示两行?

谢谢。

3 个答案:

答案 0 :(得分:5)

在复制原始矢量后,我会将最长行设置为零并再次使用max。

lineStats = regionprops(imsk, {'Area','PixelIdxList'});
[length, index] = max([lineStats.Area]);
lineAreas = [lineStats.Area]; %copy all lineStats.Area values into a new vector
lineAreas(index) = NaN; %remove the longest line by setting it to not-a-number
[length2, index2] = max(lineAreas);

编辑:对新问题的回复

对于倍数,

sort可能是更直接的方法,但您仍然可以使用最大值。

lineAreas = [lineStats.Area]; %copy all lineStats.Area values into a new vector
% add a for loop that iteratively stores the desired indices
nLines = 3; 
index = zeros(1,nLines);
for iLines = 1:nLines
    [length, index(iLines)] = max(lineAreas);
    lineAreas(index) = NaN; %remove the longest line by setting it to not-a-number
end
longestLine = zeros(size(imsk));
% I cannot be certain this will work since your example is not reproducible
longestLine([lineStats(index).PixelIdxList]) = 1;
figure
imshow(longestLine)

答案 1 :(得分:2)

而不是使用max按降序使用sort并取第二个元素。与max类似,sort也提供返回值的索引,因此这两个函数非常兼容。

eStats = regionprops(imsk, {'Area','PixelIdxList'});
[length, index] = sort([lineStats.Area], 'descend');
longestLine = zeros(size(imsk));
longestLine(lineStats(index(2)).PixelIdxList)=1; % here take the second largest
figure
imshow(longestLine)

答案 2 :(得分:2)

作为一种专注于性能和易用性的替代方案,这里使用bwlabel代替regionprops的方法 -

[L, num] = bwlabel(imsk, 8);
count_pixels_per_obj = sum(bsxfun(@eq,L(:),1:num));
[~,sidx] = sort(count_pixels_per_obj,'descend');

N = 3; % Shows N biggest objects/lines
figure,imshow(ismember(L,sidx(1:N))),title([num2str(N) ' biggest blobs']) 

在性能方面,here's one post对来自MATLAB图片库的snowflakescoins图片进行了一些基准测试。

示例运行 -

imsk = im2bw(imread('coins.png')); %%// Coins photo from MATLAB Library

N = 2:

enter image description here

N = 3:

enter image description here