包含背景的bwconncomp的第N个最大组件

问题描述:

我的问题有两个部分。首先是:包含背景的bwconncomp的第N个最大组件

如何将背景作为组件包含在bwconncomp函数中,因为它的默认行为不包括它。

另外,这是我的另一个问题是,如何根据我使用bwconncomp得到的结果来选择第n个最大的组件。

目前,我在想这样的事情,但是,这并不工作:P

function out = getComponent(im,n) 
CC = bwconncomp(im,4); 
%image is an binary image here 

numPixels = cellfun(@numel,CC.PixelIdxList); 
sortedPixels = sort(numPixels,'descend'); 
w = sortedPixels(n); 
[largest, index] = find(numPixels==w); 
im(CC.PixelIdxList{index}) = 0; 
out = im; 

但是,这并不在所有的工作。但我不太清楚CC.PixelIdxList{index}是做什么的,它只是改变阵列中的元素。我也觉得它有点模糊PixelIdxList是。

  1. 要查找的背景下,你可以使用图像上“不”操作
  2. “PixelIdxList”是不是你所需要的。您需要'区域'属性。

功能FindBackgroundAndLargestBlob
X = imread( 'peppers.png');
I = x(:,:,2);
level = graythresh(I);
bw = im2bw(I,level);
b = bwlabel(bw,8);
rp = regionprops(b,'Area','PixelIdxList');
areas = [rp.Area];
[unused,indexOfMax] = max(areas);
disp(indexOfMax);

更新: 可以与bwconncomp做得一样好:

功能FindBackgroundAndLargestBlob
X = imread( 'peppers.png');
I = x(:,:,2);
level = graythresh(I);
bw = im2bw(I,level);
c = bwconncomp(bw,4);
numOfPixels = cellfun(@ numel,c.PixelIdxList);
[未使用,indexOfMax] = max(numOfPixels);
figure; imshow(bw);
bw(c.PixelIdxList {indexOfMax})= 0;
figure; imshow(bw);
结束

这将给以下结果: Beforeenter image description here

+0

感谢您的评论。首先,我确实是用'bwlabel'来做的,但是我读到它的使用全部被'bwconncomp'替换,因为内存使用情况。 – 2011-12-18 20:25:32

+0

@TimoWillemsen,我也是用bwconncomp做的 - 看看更新。 – 2011-12-18 22:19:53

+0

感谢您的评论,这确实是我需要的。只有我想知道,你有最大的元素。但你如何获得第n个? – 2011-12-22 10:36:36