将原始灰度图像编码为JPEG,更改jpeg标头

时间:2014-07-11 06:34:25

标签: image encoding jpeg grayscale

我正在使用jpeg编码器库(Jpegant)将原始YCbCr图像压缩到C中的Jpeg。该库适用于具有单独Y Cb和Cr分量的YCbCr图像。同样在库中,Y,Cb和Cr流分别编码,生成的字节在标题之后写入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部分删除了相关的Chrominance表/数据。我将Y子采样设置为0x11。每个部分的长度也会被修改。我也使用了jpegsnoop,甚至没有错误。

唯一的问题是,大多数jpeg观众都说我的文件无效且无法显示。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

它不是很多。

如果您使用渐进式JPEG,可能会很有趣。上述过程对两者都有效,但其他人可能不会。