Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image imshow()不显示更改的像素值_Image_Matlab_Image Processing - Fatal编程技术网

Image imshow()不显示更改的像素值

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

我将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);
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
作为变量:)