我将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)
答案 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
。