0

我有一个二值图像,我需要从中随机选择一个值为 1 的像素(一个白色像素)。我写了一个while/if循环来完成这项工作,这是我的代码:

Clear all
clc

%  I have defined matrix A  as an example of a given bw image

A=[0 0 1 0 0;0 0 0 1 0;0 1 0 0 0;0 0 0 1 0;1 0 0 0 0];
bwImage=mat2gray(A);
Number_Of_Pixls = numel(bwImage)
Number_Of_Interest_Points=numel(find(bwImage))

% randomly select a pixel

condition=0;
while ~(condition)                      
    RandomPixel = randi(Number_Of_Pixls)
    bwImage(RandomPixel)      % to show the value of the selected pixel
    if bwImage(RandomPixel) == 1
        condition = 1;  break
    else
        continue
    end
end
SelectedPixel =RandomPixel  % show which pixel had been selected

这段代码有效,但是当涉及到具有大量像素的真实图像时,这个搜索过程变得非常详尽,计算量也很大,这使得它实际上毫无用处。有什么方法可以更快地完成这项工作吗?

4

3 回答 3

2

您可以轻松地做到这一点,无需循环:

A = [0 0 1 0 0;0 0 0 1 0;0 1 0 0 0;0 0 0 1 0;1 0 0 0 0]; % data
ind = find(A); % linear indices of nonzero values
ind_sel = ind(randi(length(ind))); % randomly select one, in linear index...
[ row_sel col_sel ] = ind2sub( size(A), ind_selected); % ...or in subindices
于 2013-10-28T18:33:46.127 回答
1

如果您只对那些点感兴趣,为什么要首先迭代所有点???

idx = find(bwImage==1); %only choose points that are 1
RandomPixel = randi(length(idx));

idx[RandomPixel] 将是 bw 图像的随机像素的索引,值为 1。

于 2013-10-28T18:34:20.753 回答
-1

我的猜测是这mat2gray就是问题所在。首先,您不需要它,因为您已经拥有A它只有值 0 或 1。如果有的话,您可能希望将其转换为逻辑值。

我猜想当mat2gray尝试重新调整值时,你会得到接近 1 的值,但不完全是 1,因为浮点数很奇怪。

从本质上讲,您的问题归结为您无法比较浮点数的精确相等性。

于 2013-10-28T18:33:31.850 回答