MATLAB tif文件格式与PNG文件格式。真正无损压缩吗?

3

我一直在解决一个问题,需要将矩阵保存为图像,并且在MATLAB中是真正无损的示例。

我尝试以无损形式将图像写入png和tiff:

名称              大小                 字节  类型     属性
diff 237x354 671184 double imPng 237x354 167796 uint16 imPngD 237x354 671184 double imTiff 237x354 83898 uint8 imTiffD 237x354 671184 double padded 2042x2170 35449120 double testImage 237x354 671184 double

testImage是我想要无损保存的矩阵。

我使用以下代码将矩阵写入tif和png文件:

EDU>> imwrite(testImage,'imTiff.tif','tiff','compression','none');
EDU>> imwrite(testImage,'imTiff.png','PNG','bitdepth',16);

我随后将图像(imTiff 和 inPng)加载回工作空间,并将它们转换为双精度格式。

EDU>> imPngD = im2double(imPng);
EDU>> imTiffD = im2double(imTiff);

但是当我从testImage减去imPngD或imTiffD时,仍然会有剩余的值。

我的问题是:
我的处理中是否有错误?
如果没有,这是否意味着tif和png不是真正完全无损的?

如果您认为可以帮助,我可以提供图像。

我认为以下图片可能会有所帮助: testImage
testImage - 原图
imTiffD与testImage之间的差异
imTiffD与testImage之间的差异
imPngD与testImage之间的差异
imPngD与testImage之间的差异

请注意:图像2-3中灰色像素的值为零,即重新加载的图像与testImage之间的差异为零。


1
它们有多不同?这可能只是浮点误差的副作用吗? - im so confused
PNG的像素值是否适合16位?如果值有小数,转换为16位整数可能会导致精度损失。如果要编写真正的双精度像素值,请查看Tiff对象。 - Ashish Uthama
抱歉,我不熟悉浮点错误。差异很小,如果我取testImage - imTiffD之间的最大和最小差异,答案是+- 0.001960784313725,对于testImage - imPngD,答案是+- 7.629510948348184e-06。 - Gavin
1个回答

1
PNG和TIFF都是真正的无损格式(忽略TIFF选项中的JPEG打包,您没有使用)。但是,它们是根据其输入而真正无损的,PNG每个颜色值每像素为8或16位,TIFF每个颜色值每像素为8位。
如果您需要超出8或16位值所能承载的精度,那么您将会看到差异。

那么我是否可以得出结论,在上述图像2-3的区域(刚刚添加)中,如果与testImage有差异,则在将矩阵保存为png或tiff时,testImage的矩阵值的精度不会被保留? - Gavin
1
你可能在那个区域溢出了。由于你的源图像是双倍的,所以范围从0到1被缩放为0到255。如果数据小于0或大于1,则会发生包裹,并且当它回来时,所有值都将在0和1之间。检查你的数据。 - Mark Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接