从二进制图像中随机选择一个像素(具有指定值)

时间:2013-10-28 18:27:11

标签: matlab image-processing

我有一个二进制图像,我需要随机选择一个值为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

这段代码有效,但是当涉及到具有大量像素的真实图像时,这种搜索过程变得非常详尽,而且计算成本很高,这使得它实际上无用。有没有办法以更快的方式完成这项工作?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果你只对一个点感兴趣,为什么要在第一个位置迭代所有点?

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

idx [Random Pixel]将是bw图像随机像素的索引,其值为1.

答案 2 :(得分:-1)

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

我猜测当mat2gray尝试重新缩放值时,由于浮点怪异,你会得到接近1但不完全是1的东西。

基本上,您的问题归结为这样一个事实:您无法比较浮点数以获得完全相等。