Image imshow()不显示更改的像素值
我将RGB图像转换为灰色,然后转换为二进制。我想用灰度图像的像素值代替二值图像的白色像素。虽然命令窗口显示所有的1都被替换为灰色像素值,但相同的值不会反映在图像中。 二进制图像(bw)和新图像(newbw)看起来完全一样。为什么会这样Image imshow()不显示更改的像素值,image,matlab,image-processing,Image,Matlab,Image Processing,我将RGB图像转换为灰色,然后转换为二进制。我想用灰度图像的像素值代替二值图像的白色像素。虽然命令窗口显示所有的1都被替换为灰色像素值,但相同的值不会反映在图像中。 二进制图像(bw)和新图像(newbw)看起来完全一样。为什么会这样 clc;clear all;close all; i = imread('C:\Users\asus\Documents\Academics 2014 (SEM 7)\DIP\matlabTask\im1.jpg'); igray = rgb2gray(i); b
clc;clear all;close all;
i = imread('C:\Users\asus\Documents\Academics 2014 (SEM 7)\DIP\matlabTask\im1.jpg');
igray = rgb2gray(i);
bw = im2bw(igray);
[m,n]=size(bw);
newbw = zeros(m,n);
for i=1:m
for j=1:n
if bw(i,j)==1
newbw(i,j)=igray(i,j);
else
newbw(i,j)=bw(i,j);
end
end
end
subplot(311),imshow(igray),subplot(312),imshow(bw),subplot(313),imshow(newbw)
原因是,当您创建新的空白图像时,它会自动创建为
double
类型。执行imshow
时,如果提供双
类型图像,则像素强度的动态范围应在[0,1]
之间,其中0
为黑色,1
为白色。小于0(负数)的任何内容将显示为黑色,大于1的任何内容将显示为白色
因为在您的图像中肯定不是这种情况,而且很多值都将是>1
,因此您将获得黑色或白色的输出。我怀疑您的图像类型是uint8
,因此动态范围介于[0255]
之间
因此,您需要做的是cast
输出图像,使其与输入图像的类型相同。完成此操作后,您应该能够看到正确显示的灰度值。现在只需更改newbw
语句,使变量与输入图像属于同一类。换言之:
newbw = zeros(m,n,class(igray));
您的代码现在应该可以工作了。FWIW,你不是第一个遇到这个问题的人。在使用imshow
时,我回答的几乎所有问题都是因为人们忘记了在图像中输入类型double
和类型uint*
的行为是不同的
小调 为了提高效率,我个人不会使用
For
循环。通过对布尔值
数组进行索引,可以实现上述行为。因此,我将用以下语句替换您的for
循环:
newbw(bw) = igray(bw);
无论
bw
中的哪个位置是正确的还是符合逻辑的1,您都可以将这些位置从igray
复制到newbw
如果您只执行figure,imshow(newbw)
,它会给您预期的输出吗?很好的一个@rayryeng!我正要评论数据类型可能不正确。哦,我还想在OP中补充一点,命名变量/图像“I”可能会产生不必要的行为……所以尽可能避免这种情况+1 !@迪玛-哇。很惊讶我没注意到那个小小的拼写错误。当我接住那些错误的时候,我通常都很在行。谢谢我猜@rayryeng,好吧,你做得很大胆。:)所以我注意到了。:@Dima-hahaha谢谢:)当我拼写某个单词时,很多其实是我最讨厌的事情之一。我很惊讶我没抓到那个。我正赶着写一个答案,所以当我第一次看这篇文章时,我没有注意到任何拼写错误。。。但话说回来,我很着急。谢谢你批改:)@Benoit_11-对不起,我以为我已经回复你了。感谢您的评论,我也同意将I
作为变量:)