打开和写入文件时的Matlab伽玛校正

时间:2014-04-21 13:05:36

标签: matlab gamma

我正在使用matlab对图像进行一些计算,我的第一印象是,从jpeg文件读取后存储在matlab矩阵中的值经过了伽马校正。因此,我应该编写以下代码:

im = (double((imread('Myimage.jpg')))/255).^2.2;

以获得具有线性空间值的矩阵。但是,我尝试了以下方法:生成线性渐变:

for x=1:256
gradient(:,x) = ones(128,1) * (x-1)/255;
end

然后我将其写入jpeg文件并再次阅读:

imwrite(gradient, 'gradient.jpg', 'Quality', 100);
gradient_jpg = double(imread('gradient.jpg'))/255;

现在我希望渐变和gradient_jpeg不同,因为后者在写为jpg文件时被伽马校正,而另一个则没有。结果两个矩阵都是一样的。我这是我不明白的地方。在之前的测试中,我尝试从matlab和HDRShop打开相同的jpg图像。两个图像在屏幕上看起来都一样,但是当我在图像中查找值时,它们不是matlab中的值恰好是我在HDRShop中以2.2(大致)的功率得到的值。 所以myquestion是...... matlab在读取jpeg文件时是否将值存储在线性空间中,或者我是否必须专门应用gamma项(。^ 2.2)才能获得线性值?

提前致谢

2 个答案:

答案 0 :(得分:0)

这是一个很好的问题。我也是出于同样的原因。

在imread的文档中,我看不到伽马校正的选项,并且在整个问题上都没有。

我在屏幕上读取的矩阵中得到的值相同(来自imshow,使用颜色检查器实用程序)。我在屏幕上看到的值与我在其他图像查看应用中看到的值非常接近(但不完全相同)。

所以我不确定这是一个答案,但还有更多信息。

答案 1 :(得分:0)

实际上,MATLAB提供了rgb2linlin2rgb函数来进行伽玛解压缩。在下面的示例中,当直接编写渐变并在下面添加0/1棋盘时,您可以轻松地看到50%的灰色(棋盘值)与渐变中的0.5不对应:

enter image description here

但是,如果您在写入之前应用lin2rgb,这就是您所获得的,现在50%的灰度是中间值:

enter image description here

这是MATLAB代码:

gradient = zeros(128,256);
for x=1:256
    gradient(1:64,x) = ones(64,1) * (x-1)/255;
    for y = 64:128
        gradient(y,x) = mod(x+y,2);
    end
end
imwrite(gradient, 'gradient.png');
gradient_g = lin2rgb(gradient);
imwrite(gradient_g, 'gradient_g.png');