2014-07-11 33 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。正如問題中提到的那樣 –