題:
是否可以保證JPG產生相同的像素?
Wayne Werner
2016-10-16 05:27:10 UTC
view on stackexchange narkive permalink

我知道用RAW拍攝有很多好處,但是目前看來JPG對我來說還不錯。文件的大小要小得多,並且 darktable似乎可以很好地工作(儘管有趣的是,似乎編輯RAW文件的速度實際上更快,但這可能只是一種幻覺)。

據我所知,暗表的工作方式是通過創建一個包含要對原始JPG文件進行的編輯的邊車文件,因此從理論上講,這些編輯是非破壞性的(即,它不會將圖像重新壓縮為JPG)

鑑於所有這些,我很好奇-相同的JPG文件是否保證每次渲染時都能產生相同的像素?例如,假設我有一個以98%的質量保存的JPG文件。如果我以100%縮放比例打開它,那麼在暗表中打開該像素時是否會與在Google Chrome中打開該像素時像素相同?還是在Photoshop中打開它時?那麼壓縮率更高的文件呢? 50%的質量?

一些編碼器允許在浮點數和整數DCT之間進行選擇。知道他們在說什麼的人(在這種情況下不是我!)可以解決這個問題,然後是否可以將其“存儲”為浮點值嗎?還是僅僅是中間計算?
它們之間會有差異,它們雖然很小,但在數學上肯定不同。
七 答案:
Aaganrmu
2016-10-21 13:51:07 UTC
view on stackexchange narkive permalink

簡短答案

否,不能保證解碼始終相同。但是,保證差異非常小。

ISO規範

JPEG的國際標準化組織(ISO)規範具有以下解碼器規範(強調我的):

解碼器應

a)具有適當的精度,將任何壓縮的圖像數據轉換為重建的圖像數據參數在應用程序支持的範圍內,並且符合附件B中為解碼器實現的解碼過程指定的交換格式語法;

b)接受並正確存儲任何表,符合附件B中為解碼器實現的解碼過程指定的表規範數據語法的縮寫格式的規範數據;

c)具有適當的精度,將其轉換重構圖像數據,任何符合指定壓縮圖像數據語法縮寫格式的壓縮圖像數據附件B中有關解碼器實現的解碼過程的條件是,前提是事先已將用於解碼壓縮圖像數據所需的表規範數據安裝到解碼器中。

適當的精度非常嚴格遵循這些規範的任何轉換器都必須與參考算法進行比較。對於單個像素,每個分量只能與參考相差一位。此外,每個8x8像素塊以及整個圖像的(平方)誤差必須非常低。

但是為什麼會有所不同?

與bmp或png不同,jpeg不會存儲像素本身,而是存儲圖像說明。為了重建單個像素,使用了複雜的數學算法。每一步驟之後,算法會將結果存儲在內存中。這可能會出錯:內存中的值具有一定的精度,即機器精度。因此,該值必須四捨五入。雖然規範確保使用最低的精度,但沒有最高的精度。因此,對於每個實現,舍入可以是不同的。它甚至可能取決於所使用的硬件,因為某些處理器使用的精度比要求的更多。某些早期的Pentium處理器甚至完全犯了錯誤。

微小的簡化示例:通過重複加法計算5 * 0.12。

使用一位精度存儲中間值,計算機可能會這樣做:0.12 + 0.12 = 0.24,將中間結果存儲為0.2(向下舍入)。然後計算0.2 + 0.12 = 0.32,存儲為0.3(再次四捨五入)。繼續此模式,結果將為0.5,而不是預期的結果0.6。如果使用更高的精度(例如兩位數),結果將有所不同。

我相信這是正確的答案。我嘗試了幾個常見的應用程序,以查看是否可以檢測到任何1位差異,但是到目前為止,我還是失敗了。
發現我先前的失敗僅是由於我對手邊的圖像編輯器缺乏經驗。一旦我弄清楚如何適當地增強圖像差異,它們就顯而易見了。我留下了自己的答案來演示。
很好,您實際上有證據。
存在ISO標準並不意味著現實世界中的實施通常會遵循該標準。
Mark Ransom
2016-10-21 22:08:06 UTC
view on stackexchange narkive permalink

不,您不能依賴於解碼後的JPEG圖像逐位相同。

例如,我嘗試在兩種不同的瀏覽器中查看此頁面頂部的圖像: 53.0.2785.143和Internet Explorer 11.0.9600.18426。它們外觀相同,但是我將屏幕截圖放入了圖像編輯器,並放大了差異。您會看到它們不一樣。

這是原始圖像:

Original image

兩種瀏覽器渲染之間的差異得到了增強:

Enhanced difference

如果您在兩個不同的標籤頁中以chrome瀏覽器打開該怎麼辦-那麼您是否看到了相同的圖像?
-1
如果Chrome和Internet Explorer使用不同的顏色管理,您是否也嘗試過使用PNG?
@LoganPickup不,我沒有,但這是個好主意。
null
2016-10-16 06:27:06 UTC
view on stackexchange narkive permalink

是否可以保證同一JPG文件每次渲染時都能產生相同的像素?

是。它只是代表顏色值的數字列表(以巧妙的方法使其變小)。在打開jpeg文件的過程中沒有“產生”的信息,這在兩個應用程序之間會有所不同。

壓縮率較高的文件(例如, 50%質量?

然後列表中的數字會有所不同。 (更多零)除此之外,沒有區別。

就減壓部分而言,這是正確的。不過,有一個很大的警告:轉換為目標色彩空間時,不同的色彩管理代碼可能會產生不同的結果-特別是如果一個應用程序指定了黑點補償而另一應用程序則沒有指定。而且這甚至都沒有考慮可能會或可能不會發生的中間計算的任何截斷。
因此,在相同的壓縮率下,無論我們對原始圖像執行壓縮過程多少次,生成的圖像的md5哈希值都應保持相等。
Euri Pinhollow
2016-10-16 22:17:10 UTC
view on stackexchange narkive permalink

壓縮和JPEG內部結構本身不會影響已壓縮文件的可重現性-假定照片的顏色空間與顏色相匹配,它將在正確工作的程序中產生相同的像素輸出。

  • 顏色管理系統的空間
  • 您正在以100%的比例查看圖像,即,將像素到像素輸出到監視器

例如,如果圖像文件包含AdobeRGB數據,因此在sRGB彩色系統中可能會產生不同的像素數據,因為可以使用不同的算法將AdobeRGB轉換為sRGB,並且它們可能使用不同的精度進行計算。 Photoshop和Chrome很有可能使用不同的算法進行顏色轉換。

許多瀏覽器未正確設置用於比色的目的,可能根本沒有使用監視器配置文件,並且顯示的圖像與Photoshop完全不同。

按比例縮放圖像時,同樣會顯示大小調整算法之間的差異。


這可能會過於復雜,但您可能想知道。

James Snell
2016-10-17 18:40:16 UTC
view on stackexchange narkive permalink

大多數JPEG編碼方案並非旨在準確無誤,它們“在視覺上無損”。可以在編碼器和解碼器算法的實現中應用這種原理。

可以合理地期望在解碼器中將實現一些優化,而不是在精度上實現顏色管理,從而實現性能優先於準確性。所有這些,而且解碼器之間的RGB-Y'CrCb轉換將不完全相同。

JPEG的含義是“足夠好”,差異會很細微,這就是我們應該期望的輸出。無論應用到源文件的壓縮級別如何,都適用相同的原理。

xiota
2018-07-21 06:39:16 UTC
view on stackexchange narkive permalink

@Aaganrmu通常是正確的。 不能保證每次打開特定的JPEG文件都會完全以相同的方式呈現,即使使用同一程序也是如此。

實際上,除非程序已更新,否則使用相同程序打開相同文件將產生相同結果。許多程序還使用相同的解碼庫並產生相同的結果。對於程序員來說,有意在每次打開文件時在JPEG算法中引入變體以產生不同的結果將花費太多的精力。這也不是用戶期望或想要的。 (這忽略了顏色配置文件和校正,這是 解碼之後的一個單獨步驟。)

變化的可能性來自不同的輸入,可能會導致作為 JPEG算法的一部分進行轉換,舍入和量化的結果相同。這些操作也是JPEG偽像的來源。

JPEG variations

JPEG解碼器 knusperli jpeg2png 旨在在JPEG算法允許的限制內減少JPEG偽像。它們產生的輸出應該提供與使用相同設置重新量化時輸入的數據相同的數據。 (如果我正確理解了它們的操作,它們將忽略舍入誤差可能引起的差異。)因此,它們需要花費更長的時間進行解碼,並且其輸出與其他解碼器相比有所不同(更好?)。

這裡有100%的農作物來顯示 libjpeg (左)和 jpeg2png (右)之間的差異:

jpeg2png example

WayneF
2016-10-16 21:02:35 UTC
view on stackexchange narkive permalink

像素只是一種顏色,是從該微小像素區域採樣的一種平均顏色。顏色是我們看細節的方式。我們看到黑色電源線穿過藍天的圖像只是因為顏色不同。顏色就是細節。

JPG質量50僅是50,只是數字,不是50%。
JPG 100不是任何東西的100%。 100是相當不錯的JPG,但它仍然是JPG。

JPG偽像(由較低的品質因數引起)會改變像素顏色。像素是一種不同的顏色,而像素只是一種顏色,因此是一種不同的像素。

編碼(創建)JPG在每個程序中通常是不同的。有幾個選項,在不同的程序中假設不同。一個程序中的質量80不可能與另一個程序中的質量80相匹配。

我的猜測是解碼(顯示)JPG是標準的,可以顯示編碼的內容。

JPG今天比它更好

JPG偽像的一種類型是JPG試圖使8x8像素塊中的顏色全部為64,如果它們已經是相似的顏色,則都是相同的一種顏色。低JPG質量往往會在相似顏色的區域(天空,牆壁等)中顯示8x8像素塊。

有關JPG偽像的示例,請參見 http://www.scantips.com/basics09b.html

低JPG質量會導致電子郵件和互聯網變得更小,更快,但是對於我們的實際照片而言,似乎沒有充分的理由來說明我們為什麼會要求較低的JPG質量。 :)



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...