我有PixelList
包含二进制掩码的所有设置像素。这看起来如下:PixelList: {[1447x2 int32]}
。
如何有效地转换此PixelList
做维度为dim
的二进制掩码?
琐碎的方式是:
mask = zeros(dim);
for i=1:length(pixellist)
mask(pixellist(i,2), pixellist(i,1)) = 1;
end
但这很慢。如何有效地做到这一点?
答案 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;