我正在尝试在MATLAB中打开一个.pgm
图像文件,使用for循环运行一个操作,然后保存为另一个.pgm文件。在进行操作之前,我正在测试是否可以重新创建图像:
clear
picture = imread('Picture.pgm');
sizePic = size(picture);
sizeX = sizePic(1);
sizeY = sizePic(2);
newPicture = zeros(sizeX,sizeY);
for i = 1:sizeX
for j = 1:sizeY
newPicture(i,j) = picture(i,j);
end
end
imwrite(newPicture, 'NewPicture.pgm');
然而,新图像几乎都是白色的,带有一些黑色斑点(不是原始图像)。难道这不能让我回到原始图像吗?
答案 0 :(得分:3)
默认情况下,从imread(XXX.pgm)创建的picture
是uint8
或uint16
数组,这意味着像素值的范围为[0 255]或[ 0 65535]。另一方面,从newPicture
创建的zeros
是double
数组,其预期像素值仅为[0 1]。在保存的图像中,任何大于1的值都将被解释为1(白色)。当您为这样的double
数组指定[0 255]值时,由于picture
中的大多数像素值都是1及以上,当然您将获得大部分白色像素
处理图像时,请务必检查图像阵列的类型。例如,通过显式转换imread返回的图像,始终使用double
类型可能是个好主意:
pictures=im2double(imread(xxx))
。