【问题标题】:gray levels are changed after using imsave function使用 imsave 功能后灰度级发生变化
【发布时间】:2013-06-24 14:04:21
【问题描述】:

我使用这些代码生成了灰度在 50 到 170 之间的 RGB 图像。

a='C:\Users\sepideh\Desktop\IP_abadpour\S45C-113050518040.jpg';
b=imread(a);
b=b+50;
b(b>170)=170;

你会看到,当我调用函数 max 和 min 时,证明灰度级在 50 到 170 之间。

max(max(max(b)))

ans =

  170

min(min(min(b)))

ans =

   50  

然后我使用 imshow 和 imsave 函数将图像保存为名称“50to170”

c=imshow(b);  
d=imsave(c);

现在我是这样读取写好的图片的:

a='C:\Users\sepideh\Desktop\IP_abadpour\50to170.jpg';  
b=imread(a);

这一次当我调用 max 和 min 函数时,我看到了:

max(max(max(b)))

ans =

  235

min(min(min(b)))

ans =

    16  

我的意思是,在使用 imshow 和 imsave 功能后,灰度级似乎发生了变化!
为什么会这样?
是因为我在使用 imsave 功能时使用的格式(.jpg)吗?

【问题讨论】:

    标签: image matlab image-processing


    【解决方案1】:

    不要使用 imsave,而是使用 imwrite

    b=imread(a);
    b=b+50;
    b(b>170)=170;
    imwrite(b,'50to170.png','png')
    

    请注意,我将其保存为 png 文件而不是 jpg 以防止压缩。位图也无需压缩即可保存。

    与使用 imshow 和 imsave 相比,此方法是一种更直接的保存原始图像矩阵的方法。

    如果您想要与 imsave 相同的功能(选择文件所在的位置),请查看“uiputfile”以获取文件名和位置。

    【讨论】:

    • 嗯,我已经写了答案。感谢您的关注
    • 没问题! ;)(看到了,就是想简洁点,午休也无聊)
    【解决方案2】:

    我测试过了。
    1.首先你不能使用 imsave(b) 因为函数 imsave 期望它的第一个输入参数是单个图形对象的有效句柄。所以首先你应该以 c=imshow(b) 的形式显示图像和然后使用 c 作为函数 imsave 的输入。
    2.如果你想保存图像而不显示它首先使用函数“imwrite”并将b作为第一个输入参数传递给它。
    请注意,如果您不希望在保存后更改灰度级,则应使用“bmp”作为保存格式,而不是“jpg”。 因为'jpg'不支持索引图像,而“imwrite”在将数据写入JPEG文件之前将索引图像转换为RGB,因此灰度可能会改变。这与在matlab中显示图像时的对比度拉伸无关。它与用于保存图像的格式。

    【讨论】: