2013-02-12 25 views
6

我知道JPEG壓縮是有損的。 我有2個問題:重新編碼JPEG圖像是冪等操作嗎?

發出的操作T:
1.取JPEG-80圖像
2.解碼到一個字節緩衝器
3.編碼給定字節緩衝液作爲JPEG-80

在視覺質量方面,T是冪等操作嗎? 或者當我重複T時,圖像質量是否會降低? 這對JPEG-XR編解碼器也適用嗎?

謝謝!

編輯: 由於曾經存在相互矛盾的答案,這將是巨大的,如果你能提供參考!

+0

我不知道,但我不會指望它。尤其是在不同的發動即使使用單個引擎,發生的近似值在應用兩次時也可能不會導致相同的區域。 – 2013-02-12 21:11:36

+1

我會說不。在每次編碼爲jpeg後,會有更多的「損失」。 – leppie 2013-02-13 20:28:14

回答

1

如果您使用相同設置的相同JPG壓縮引擎,它通常是冪等的。我不知道這是否有保證,但我認爲大多數實現都會照顧它。我確實知道Java運行時的實現碰巧是冪等的。

+0

我正在使用WIC API:http://msdn.microsoft.com/en-us/library/windows/desktop/gg430027(v=vs.85).aspx – Sau 2013-02-12 22:02:47

+0

我假設Dave試圖重新編碼JPEG圖像,而沒有首先將它轉換爲位圖,所以這個證據不是很有說服力。我對任何API都不熟悉,但我懷疑Dave使用的Java JPEG編碼器實現可能「足夠聰明」,如果它記得先前編碼過它,就不會*重新編碼JPEG圖像。畢竟,重新編碼一個JPEG通常是不需要的,所以API可以容忍這個函數潛在的普遍濫用,儘管它可能會拋出一個警告,要清楚「在引擎蓋下發生了什麼」 「。 – StockB 2013-09-19 13:48:09

2

根據定義,有損操作通過以最終用戶不理解的方式簡化表示來丟棄數據。然而,編碼器沒有用於確定哪些像素重要且哪些不重要的神奇方法,因此它對所有像素進行均等編碼,即使它們是僞像!

換句話說,編碼器會將損失壓縮的圖像視爲無損圖像。有損圖像將進一步簡化,丟棄該過程中的附加數據,因爲對於所有編碼器都知道,用戶意圖來表示僞像。

這裏是JPEG代損失的一些例子:

http://vimeo.com/3750507

http://en.wikipedia.org/wiki/File:JPEG_Generarion_Loss_rotating_90_(stitch_of_0,100,200,500,900,2000_times).png

+3

並不那麼簡單。 JPEG並不總是丟棄信息,而是量化它。如果輸入數據恰好與量化數據完全匹配,則它根本不會改變。它有點類似於減少圖像中的顏色數量 - 如果輸入圖像顏色已經很少,那麼它將不會改變(除了JPEG在DCT頻率而不是顏色上)。 – Kornel 2014-07-27 21:04:00

+0

這可以解釋爲什麼維基百科的例子將圖像旋轉了90º。您應該將其放入答案或編輯我的圖像。 – StockB 2014-07-29 16:24:13

1

它不能保證,但它可能發生。特別是如果您重複編碼 - >解碼 - >編碼 - >解碼過程足夠多的時間,它最終會解決一個固定點,並進一步停止質量丟失(只要您堅持相同的質量和相同的編碼器)。

JPEG編碼在幾個步驟來完成:

  1. RGB至YUV轉換
  2. DCT(變化爲頻域)
  3. 量化(扔掉DCT的比特)
  4. 無損壓縮

而解碼是相同的過程倒退。

步驟1和步驟2有四捨五入誤差(特別是在使用整數數學的速度優化編碼器中),所以對於冪等重新編碼,您需要很幸運能夠使編碼和解碼舍入誤差變小或相互抵消。

步驟3是主要的有損步驟,實際上是冪等的。如果您的解碼像素轉換爲類似的DCT,它將再次量化爲相同的數據!

JPEG XR也使用YUV,所以它可能會遭受一些舍入誤差,但是OTOH而不是DCT它使用了可以計算而不捨入誤差的不同變換,所以它應該比其他的更容易往返JPEG-XR格式。