2

具有大小MxN包含 0 和 1 的掩码。

如何随机选择(均匀分布)选择n这个掩码的 1 个像素?

编辑:我想选择n掩码为 1 的这个掩码的像素。这些n像素应该随机分布在整个图像/掩码上。

4

3 回答 3

2

在矩阵中找到“1”的索引,然后用于randperm选择其中的一个随机子集:

idx = find(mask==1);
y = randperm(length(idx),n); %take n values from 1 to the number of values in idx
rand_idx = idx(y); %select only those values out of your indexes
于 2013-11-01T15:41:51.953 回答
2

另一个简洁的解决方案是randi允许重复采样(带替换采样):

nonZeroSampleInds = randi(nnz(mask),1,n);
maskInds = find(mask);
maskSampleInds = maskInds(nonZeroSampleInds);

对于非重复样本,randperm可以在 nkjt 的答案中使用,或者只是为了好玩,您可以从以下内容开始,

[~,nonZeroSampleInds]=sort(rand(1,nnz(mask)));

我认为 MATLABrandperm非常适合这项工作,但这sort一行实际上是 MATLAB在成为 MEX 文件之前用来实现的方式,所以我想我会提供它,因为我喜欢一点 MATLAB 琐事。randperm.m

如果您希望按顺序排列位置,请sort使用nonZeroSampleIndsmaskSampleInds

于 2013-11-01T18:13:23.860 回答
0

您可以执行以下操作:

idx = find( mask == 1); % This found all 1s in your mask

idx2Take = 1:5:size(idx,1); % This take 1s on every 5 (uniform distributed)

uniformPts = idx(idx2Take); % Finally, obtain the mask position from the uniform distribution

所以之后,你只需要得到所有的uniformPts。

于 2013-11-01T15:20:17.627 回答