【问题标题】:Encoding a raw grayscale image to JPEG, changes in jpeg header将原始灰度图像编码为 JPEG,更改 jpeg 标头
【发布时间】:2014-07-14 13:47:52
【问题描述】:

我正在使用 jpeg 编码器库 (Jpegant) 将原始 YCbCr 图像压缩为 C 中的 Jpeg。该库适用于具有单独 Y Cb 和 Cr 组件的 YCbCr 图像。同样在库中,Y、Cb、Cr流分别被编码,生成的字节在header之后写入Jpeg文件。

现在我想使用相同的库仅将 Y 流编码为灰度 Jpeg 图像。 我做的第一步是删除 Cb 和 Cr 编码。所以只有 Y 流被编码并写入文件。 生成的文件不是灰度图像,它只是垃圾。

我尝试通过在 Cb 和 Cr 中发送零流来做同样的事情,这给了我想要的东西,所以我认为问题不在于编码,而在于标题。我使用的标头在此处描述https://github.com/t27/vt-fox-1/tree/master/STM32L1_Code/encoder#basic-output-file

我在 SOF 和 SOS 部分修改了流的数量(在上述文件中注释为“nrofcomponents”)。我还从 SOF、SOS 和 DHT 部分中删除了相关的色度表/数据。我将 Y 子采样设置为 0x11。每个部分的长度也进行了修改。我也使用了 jpegsnoop,即使这样也没有错误。

唯一的问题是大多数jpeg查看器都说我的文件无效,无法显示。

我还应该在标题中更改什么?

PS:我正在创建一个 16*8(w*h) 像素阵列并一次编码 2 个 8*8 的矩阵,我已将我的 RSI 设置为 Imagewidth/16。

【问题讨论】:

  • 尝试运行jhead -v -v -v file 看看jhead 是否可以告诉您文件编码有什么问题。
  • @MarkSetchell jhead 使用上述命令给出的输出如下所示 pastebin.com/E8pJEDmx 我认为其中没有任何错误...
  • 如何使用 ImageMagick 的convert yourYchannel.jpg y.png 来查看 ImageMagick 是否会告诉您错误并无法转换,或者是否正确转换并确认您的数据流已正确编码?
  • imageMagick 说这个pastebin.com/99arb7G8 我会检查这个。我正在创建一个 16*8(w*h) 像素阵列并一次编码 2 个 8*8 的矩阵,我已将我的 RSI 设置为 Imagewidth/16

标签: image encoding jpeg grayscale


【解决方案1】:

我找到了解决这个问题的方法。 基本上,标题具有彩色 jpeg 中色度和亮度的量化表和霍夫曼表。 此外,数据流的数量(Y,Cb,Cr)在标头本身中定义。 所以我所做的是将流的数量更改为 1,并从标题中删除不必要的量化和霍夫曼表。 同样重要的是重启间隔。当使用仅 Y 流时,我必须将重启间隔(在标题中)设置为 YUV422 格式的 YCbCr 流的 RSI 的两倍。

jpec 库(仅对灰度进行编码,与 jpegants 颜色编码相比)非常有用。 https://github.com/Moodstocks/jpec/blob/master/src/enc.c

【讨论】:

    【解决方案2】:

    如果您有一个 YCbCr JPEG 并且想要将其转换为灰度,您应该能够编写一个简单的过滤器。这样的过滤器几乎必须删除任何作为扫描 ID 不是 1 的 SOS 流(扫描开始)。您还应该修改 SOF 框架市场以将组件数设置为 1。

    这将是最低限度。您还可以删除扫描 1 未引用的任何 DHT 和 DQT 标记。

    内容不多。

    如果您使用的是顺序 JPEG 的渐进式,在这里了解一下可能会很有趣。上述过程对两者都适用,但其他过程可能不适用。

    【讨论】:

    • 我没有 YCbCr jpeg。我有一个原始 Y 数据流,基本上是亮度数据。我想将此 Y 数据编码为 jpeg。如问题中所述
    猜你喜欢
    • 2011-10-28
    • 2016-10-23
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多