gpt4 book ai didi

libtiff.net - 更有效的 TIFF 无损压缩

转载 作者:行者123 更新时间:2023-12-03 04:24:01 25 4
gpt4 key购买 nike

我正在尝试将 TIFF 图像存档在数据库中,并且我想尽可能地压缩图像,即使以更高的 CPU 使用率和高内存为代价。

为了测试 LibTiff.NET 中可用的压缩,我使用了以下代码(修改自 this sample ):

//getImageRasterBytes and convertSamples are defined in the sample
void Main() {
foreach (Compression cmp in Enum.GetValues(typeof(Compression))) {
try {
using (Bitmap bmp = new Bitmap(@"D:\tifftest\200 COLOR.tif")) {
using (Tiff tif = Tiff.Open($@"D:\tifftest\output_{cmp}.tif", "w")) {
byte[] raster = utils.getImageRasterBytes(bmp, PixelFormat.Format24bppRgb);
tif.SetField(TiffTag.IMAGEWIDTH, bmp.Width);
tif.SetField(TiffTag.IMAGELENGTH, bmp.Height);
tif.SetField(TiffTag.COMPRESSION, cmp);
tif.SetField(TiffTag.PHOTOMETRIC, Photometric.RGB);

tif.SetField(TiffTag.ROWSPERSTRIP, bmp.Height);

tif.SetField(TiffTag.XRESOLUTION, bmp.HorizontalResolution);
tif.SetField(TiffTag.YRESOLUTION, bmp.VerticalResolution);

tif.SetField(TiffTag.BITSPERSAMPLE, 8);
tif.SetField(TiffTag.SAMPLESPERPIXEL, 3);

tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);

int stride = raster.Length / bmp.Height;
utils.convertSamples(raster, bmp.Width, bmp.Height);

for (int i = 0, offset = 0; i < bmp.Height; i++) {
tif.WriteScanline(raster, offset, i, 0);
offset += stride;
}
}
}
} catch (Exception ex) {
//code was run in LINQPad
ex.Dump(cmp.ToString());
}
}
}

测试图像为200dpi 24bpp,1700宽×2200高,使用LZW压缩;文件大小接近 7 MB。 (该图像代表我要存储的图像。)

在有效的算法中 ( some failed with various errors ),最小的压缩文件是使用 Compression.Deflate 创建的,但仅压缩到 5MB,我希望它小得多(低于 1) MB)。

必须有某种算法来实现更高的压缩;包含此图像的 PDF 文件约为 500Kb。

如果特定算法与其他 TIFF 查看器/库不兼容,这不是问题,只要我们可以从数据库中提取压缩的 TIFF 并将其转换为 System.Drawing.Bitmap 使用 LibTiff.Net 或其他一些库。

如何通过无损压缩生成更小的文件?对于这些类型的图像来说这可能吗?

更新

PDF file
TIFF file

最佳答案

测试图像的简单评估

只是给出示例图像(tiff 图像)上的一些数字。所有压缩都是无损的,并且可以重新创建任何其他无损格式,例如 bmp/png(已检查)。

tiff-orig         5.779.814  
png (unoptimized) 3.084.641 53.37%
png (optimized) 2.795.230 48.36%
png (zopfli) 2.791.680 48.30%
jpeg2000 2.230.967 38.60%
webp 2.021.710 34.98% BSD
gralic 1.795.457 31.06%
flif 1.778.976 30.78% LGPL3

备注

  • 这些只是一张图像的结果
    • 其中大多数仍有潜在 yield ,但需要大量时间进行压缩
    • 虽然一般观察结果(关于这些压缩机的压缩效率的排序)应该成立,但对于更大的测试集,这些值将会发生变化
  • 大多数压缩器都是为了处理单图像而创建的
    • 将多个任务拆分为单个任务将是一项简单的任务;压缩每一个;以某种方式存储连接
    • 这在数据库设置中也是很自然的
    • 如果这些多 tiff 图像密切相关,则可以使用此方法(例如通用压缩器;或自定义方法)
  • 正如我在评论中指出的,对于大多数类型的图像(例如照片或扫描件;坚持无损压缩),您想要的那种减少是不可能的
    • 有很多东西要讲,但最重要的一点是:它们包含大量噪声,并且噪声无法压缩

为了好玩:降噪+无损压缩

由于噪声是破坏无损压缩潜力的最重要因素,因此让我们删除一些噪声。我们正在使用基于 python 的代码来完成此操作,但还有更多可能的方法。以下代码使用非线性滤波器,尝试在保留重要边缘的同时消除噪声。

当然,信息在这里丢失了,但实际上我更喜欢去噪图像,因为它更容易阅读(在我看来)。

去噪代码

from skimage.io import imread, imsave
from skimage.restoration import denoise_bilateral

img = imread("200 DPI.tif")
img_denoised = denoise_bilateral(img, multichannel=True, sigma_range=0.05, sigma_spatial=15)
imsave("200 DPI_denoised.png", img_denoised)

评估

flif (denoised) 1.140.497  19.73%

enter image description here

关于libtiff.net - 更有效的 TIFF 无损压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39712178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com