我必须编写一个程序,将强度图像转换为黑白图像。我只是想我可以从原始矩阵中取一个值,如果它高于平均值,则使另一个数组中的相应单元格等于1,否则等于零:
for x=1:X
for y=1:Y
if I(x,y)>mean(I(:))
bw(x,y)=1;
elseif I(x,y)<mean(I(:))
bw(x,y)=0;
end
end
end
image(bw)
不幸的是,我得到的图像都是黑色的。为什么呢?
我在uint8
,顺便说一下。 2-Lena.tiff图像
答案 0 :(得分:8)
使用此:
bw = im2bw(I, graythresh(I));
这里是im2bw;
的文档使用imshow(I,[]);
,不会评估0到255之间的图像,而是评估min(I(:))
和max(I(:))
之间的图像
修改强>
您可以更改graythresh(I)
任何其他级别。您仍然可以使用图像的平均值。 (归一化在0和1之间)。
maxI = max(I(:));
minI = min(I(:));
bw = im2bw(I,(maxI - mean(I(:)))/(maxI - minI));
答案 1 :(得分:4)
使用imagesc(bw)
(而不是image(bw)
)。这会自动缩放图像范围。
另请注意,您可以使用此向量化,更高效的版本替换所有代码:
bw = double(I>mean(I(:)));
答案 2 :(得分:2)
一个问题是你总是使用mean
,直到那时。
您要做的是在循环之前执行此操作:
myMean = mean(I(:));
然后将所有mean(I(:))
的{{1}}替换为myMean
。
使用正在运行的平均值肯定会减慢速度,但这并不是它变得全黑的原因。