imshow()没有显示更改的像素值

时间:2014-09-09 16:55:38

标签: image matlab image-processing

我将RGB iamge转换为灰色然后转换为二进制。我想要将二进制图像的白色像素替换为灰度图像的像素值。虽然命令窗口显示所有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)  

1 个答案:

答案 0 :(得分:2)

原因是因为当您创建新的空白图像时,会自动将其创建为double类型。在执行imshow时,如果您提供double类型的图片,则像素强度的动态范围预计介于[0,1] 0为黑色且1之间是白色的。小于0(负)的任何内容都将显示为黑色,任何大于1的内容都将显示为白色。

因为您的图片肯定不是这种情况,并且很多的值将是> 1,您将获得黑色或白色的输出。我怀疑您的图片属于uint8,因此动态范围介于[0,255]之间。

因此,您需要做的是cast输出图像,使其与输入图像的类型相同。执行此操作后,您应该能够看到正确显示的灰度值。您现在要做的只是更改newbw语句,以使变量与输入图像属于同一类。换句话说:

newbw = zeros(m,n,class(igray));

您的代码现在应该可以使用了。 FWIW,你不是第一个遇到这个问题的人。我在使用imshow时回答的几乎所有问题都归因于人们忘记了放入double类型和uint*类型的图片的行为方式不同。


次要说明

出于效率目的,我个人不会使用for循环。您可以使用boolean数组编制索引来实现上述行为。因此,我会用这个语句替换你的for循环:

newbw(bw) = igray(bw);

bw中的哪个位置为真或逻辑1,您将这些位置从igray复制到newbw