当使用具有多行的二进制图像时,我知道此代码显示最长行:
lineStats = regionprops(imsk, {'Area','PixelIdxList'});
[length, index] = max([lineStats.Area]);
longestLine = zeros(size(imsk));
longestLine(lineStats(index).PixelIdxList)=1;
figure
imshow(longestLine)
有没有办法显示第二长的线?我需要显示一条比最长线稍短的线,以便连接它们。
编辑:有没有办法在二进制图像上显示两行?
谢谢。
答案 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图片库的snowflakes
和coins
图片进行了一些基准测试。
示例运行 -
imsk = im2bw(imread('coins.png')); %%// Coins photo from MATLAB Library
N = 2:
N = 3: