2014-07-11 54 views
1

我正在使用jpeg编码器库(Jpegant)将原始YCbCr图像压缩为Jpeg。该库适用于YCbCr图像,该图像具有单独的Y Cb和Cr组件。同样在库中,Y,Cb和Cr流是分开编码的,生成的字节在标题后写入Jpeg文件。将原始灰度图像编码为JPEG,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)像素数组,并一次编码8 * 8的2个矩阵,我已将RSI设置为Imagewidth/16。

+0

尝试运行'jhead -v -v -v file'来查看'jhead'是否可以告诉你任何与你的文件编码有关的错误。 –

+0

@MarkSetchell输出jhead给出的上述命令如图所示pastebin.com/E8pJEDmx 我不认为这里面有任何错误... –

+0

如何使用ImageMagick的'convert yourYchannel.jpg y.png'来查看ImageMagick是否告诉你什么是错误的,无法正确转换或转换,并确认你的数据流是正确编码的? –

回答

3

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

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

0

如果你有一个YCbCr JPEG并想将它转换为灰度,你应该可以编写一个简单的过滤器。这样的滤波器几乎必须移除扫描ID为1以外的任何SOS流(扫描开始)。您还应该修改SOF帧市场以将组件数设置为1.

这将是最小。您也可以删除未被扫描1引用的任何DHT和DQT标记。

没有太多内容。

如果您使用顺序JPEG的渐进式,在这里可能会很有趣。上述过程适用于两者,但其他方法则不适用。

+0

我没有YCbCr jpeg。我有一个原始Y数据流,基本上是亮度数据。我想将这个Y数据编码为一个jpeg。正如问题中提到的那样 –