我有一个二进制图像,我需要随机选择一个值为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
这段代码有效,但是当涉及到具有大量像素的真实图像时,这种搜索过程变得非常详尽,而且计算成本很高,这使得它实际上无用。有没有办法以更快的方式完成这项工作?
答案 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的东西。
基本上,您的问题归结为这样一个事实:您无法比较浮点数以获得完全相等。