如何将PixelList转换为掩码?

时间:2013-12-30 21:43:38

标签: matlab computer-vision

我有PixelList包含二进制掩码的所有设置像素。这看起来如下:PixelList: {[1447x2 int32]}

如何有效地转换此PixelList做维度为dim的二进制掩码?

琐碎的方式是:

mask = zeros(dim);
for i=1:length(pixellist)
    mask(pixellist(i,2), pixellist(i,1)) = 1;
end

但这很慢。如何有效地做到这一点?

3 个答案:

答案 0 :(得分:3)

使用sub2ind获取非零位置的线性索引并一次性设置它们:

pixellist = PixelList{1}; % get the 1447x2 int32 array
mask = false(dim); % e.g. dim = [256 256]
mask(sub2ind(size(mask),pixellist(:,2), pixellist(:,1))) = true;

或使用accumarray获得更优雅的解决方案:

mask = accumarray(fliplr(pixellist),true,dim,@any,false)

如果没有重复的元素,这可以简化为accumarray(fliplr(pixellist),true,dim),并且上述语法对输出维度更明确。

答案 1 :(得分:3)

另一种可能性(在我看来更优雅)是使用稀疏矩阵:

mask = full(sparse(pixellist(:, 2), pixellist(:, 1), true, dim(1), dim(2));

答案 2 :(得分:1)

如果您要从regionprops中获取此数据,请尝试使用'PixelIdxList'代替PixelList。这样你就可以直接找回线性指数。

mask = zeros(dim);
pixlist = PixelIdxList{1};
mask(pixlist) = 1;