JPEG'ler birden çok kez yeniden sıkıştırıldığında hangi faktörler “üretim kaybına” neden olur veya önler?


29

Yıllarca, JPEG dosyalarının birçok kez yeniden sıkıştırılmasının , fotokopilerin fotokopilerini çekmenin yolu, tanınmayan bir karmaşa olmadıkça kalitesini yavaş yavaş düşüreceğine inandım . Bu, sezgisel olarak anlamlıdır çünkü JPEG kayıplı bir formattır. Ayrıca diğer soru cevap ve sorular da şöyle:

Ancak, ben de aynı kalite seviyesinde JPEG recompressing olacağı okudum değil görüntü kalitesini düşürebilir. Bu, başka bir yerde açıklanan kademeli bozulmaya karşı çalışır.

Bir JPEG yeniden sıkıştırıldığında teknik olarak ne olur?  Ne kayboluyor ve nasıl? Görüntü gerçekten televizyonda görünen karlı kargaşaya dönüşecek mi? Birden fazla kez sıkıştırıldıktan sonra parçalara ayrılan görüntüleri gösteren videolardan ne haber?

(Lütfen yalnızca el sıkışma ve genel kayıp kavramı temyiz etmeyin.)

(Bu soru ve şimdiye kadar çektiği cevaplar , bir JPEG dosyası birçok kez yeniden sıkıştırıldığında görüntünün bozulmasına neden olan veya önleyen teknik faktörlere (belirli ayarlar ve görüntü manipülasyonları) odaklanır .)





2
Görüntü verilerinin bir kısmı (küçük) miktarı ile kaybolur @MonkeyZeus yuvarlama hata kalite 100 tekrar sıkıştırılması ile aynı ortamda (örneğin 80 gibi) etmez olmayan neden aşamalı veri kaybı. Bu, soru ve cevapların ele alması amaçlanan "ortak bilgi" dir.
xiota

1
@MonkeyZeus "100" ve "80" (ya da Photoshop'ta "10, 11, 12") gibi değerler keyfidir -% 100 kayıpsız değildir.
mattdm

Yanıtlar:


32

Neredeyse tüm görüntü kalitesi kayıpları bir görüntü JPEG olarak ilk kez sıkıştırıldığında meydana gelir. Bir JPEG'in aynı ayarlarla kaç kez yeniden sıkıştırıldığına bakılmaksızın , üretim kayıpları yuvarlama hatasıyla sınırlıdır.

  • MCU sınırları hala sağlam (8x8 blok).

  • Chroma alt örneği devre dışı.

  • Sabit DQT (aynı kalite ayarı).

Bununla birlikte, yuvarlama hataları , yukarıdaki kriterlerin karşılanmadığı her yineleme için büyük olabilir ve tüm orijinal dosyaların yedeğini almak akıllıca olacaktır.


JPEG sıkıştırma algoritması

  1. Renk uzayını dönüştür. İstenirse, alt-örnek renk bilgisi (kroma alt numunesi) (Kayıplı) . Aşağı örneklenmezse, bilgi kaybı yuvarlama hatasının sonucudur .

  2. Segmentasyon. Her kanalı 8x8 bloğa bölün (MCU = Minimal Kodlama Ünitesi). (Kayıpsız)

    Not: Eğer kroma alt örneklemesi etkinse, MCU'lar orijinal görüntü bakımından 16x8, 8x16 veya 16x16 olabilir. Ancak, MCU'ların tümü hala 8x8 bloktur.

  3. Her MCU'da ayrık Kosinüs Dönüşümü (DCT). Bilgi kaybı, yuvarlama hatasının sonucudur .

  4. Kuantizasyonu.  MCU'nun her bir hücresindeki değer, bir niceleme tablosunda (DQT) belirtilen bir sayıya bölünür. Değerler yuvarlanır ve çoğu sıfır olur. Bu, algoritmanın birincil kayıp kısmıdır.

  5. Zig-Zag Taraması. Bir zig-zag düzenini izleyen her bir MCU'daki değerleri bir dizi diziye yeniden düzenleyin. Ölçme sırasında ortaya çıkan sıfırlar birlikte gruplandırılacaktır. (Kayıpsız)

  6. DPCM = Diferansiyel Darbe Kod Modülasyonu. Sayı dizilerini sıkıştırması kolay bir forma dönüştürün. (Kayıpsız)

  7. RLE = Çalışma Uzunluğu Kodlaması. Ardışık sıfırlar sıkıştırılır. (Kayıpsız)

  8. Entropy / Huffman Kodlaması. (Kayıpsız)

JPEG'leri yeniden sıkıştırma

Not renk kanallarını altörnekleme ve nicemleme sadece kasten kayıplı adımlardır . Şimdilik bir kenara yuvarlama hatası ayarlayarak, diğer tüm adımlar kayıpsızdır. Kantizasyon gerçekleştikten sonra, adımı tersine çevirmek ve tekrarlamak aynı sonuçları verir. Başka bir deyişle, yeniden nicelendirme (aynı DQT ile) kayıpsızdır .

Prensip olarak, ilk geçişten sonra kayıpsız bir yeniden örnekleme algoritması oluşturmak mümkündür. Bununla birlikte, ImageMagick'teki uygulamada, renkler, görüntüde görüldüğü gibi sabit bir duruma ulaşılmadan önce ciddi şekilde değişebilir.

Optimum koşullar göz önüne alındığında, bir JPEG’in aynı kalite ayarlarıyla yeniden sıkıştırılması, aynı JPEG’le sonuçlanacaktır. Başka bir deyişle, JPEG'leri yeniden sıkıştırmak potansiyel olarak kayıpsızdır . Uygulamada, JPEG'lerin yeniden sıkıştırılması kayıpsız değildir, ancak yuvarlama hatasına tabidir ve bunlarla sınırlıdır. Yuvarlama hataları sıklıkla sonunda sıfıra yaklaşsa da , aynı görüntünün yeniden oluşturulmasına rağmen , kroma alt örnekleme önemli renk değişikliklerine neden olabilir.

Gösteri (aynı kalite ayarı)

bashBir JPEG dosyasını belirli bir kalite ayarında tekrar tekrar sıkıştırmak için ImageMagick'i kullanan aşağıdaki betiği yazdım :

#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg

while true ; do
   q2=${q1}            # for variants, such as adding randomness
   convert ${n}.jpg -quality ${q2} $((n+1)).jpg
   #\rm $((n-5)).jpg   # uncomment to avoid running out of space
   n=$((n+1))

   echo -n "$q2  "
   md5sum ${n}.jpg
done

Birkaç yüz tekrar çalışmasına izin verdikten sonra md5sumsonuçlara baktım :

d9c0d55ee5c8b5408f7e50f8ebc1010e  original.jpg

880db8f146db87d293def674c6845007  10316.jpg
880db8f146db87d293def674c6845007  10317.jpg
880db8f146db87d293def674c6845007  10318.jpg
880db8f146db87d293def674c6845007  10319.jpg
880db8f146db87d293def674c6845007  10320.jpg

Gerçekten de, yuvarlama hatasının sıfıra yakınlaştığını ve aynı görüntünün tekrar tekrar çoğaltıldığını görebiliriz .

Bunu farklı görüntüler ve kalite ayarlarıyla defalarca tekrarladım. Genellikle kararlı durum ulaşıldığında ve tam aynı görüntü üzerinde çoğaltılabilir ve üzeri edilir.

Peki ya @ mattdm sonuçları ?

Ubuntu 18.04'teki Imagemagick'i kullanarak mattdm sonuçlarını çoğaltmaya çalıştım. Orijinal, Rawtherapee'de TIFF'e yapılan ham bir dönüşümdü, ancak artık mevcut görünmüyor. Onun yerine, büyütülmüş halini aldım ve orijinal boyutuna indirdim (256x256). Sonra tekrar yakınsam 75'e yakınsama yaptım. İşte sonuç (orijinal, 1, n, fark):

mattdm'yi çoğaltma girişimi

Sonuçlarım farklı. Gerçek orijinal olmadan, farkın nedenini belirlemek imkansızdır.

Peki ya @ montajı ?

Görüntüyü, montajın sol üst köşesinden 90’da yakınsamaya kadar yeniden sıkıştırdım. Sonuç bu (orijinal, 1, n, fark):

montajı çoğaltma girişimi

Chroma alt örneklemesinin etkinleştirilmesinden sonra, renklerin sabit duruma geldiği zaman renkler değişir .

ths-renk kayması

Az sayıda ayar arasında geçiş yapma

Değişkeni değiştirerek, q2kalite ayarı eşit dağılmış değerlerle sınırlandırılabilir.

q2=$(( (RANDOM % 3)*5  + 70 ))

Bir İçin ayar seçenekleri az sayıda, denge sonunda ulaşılan olabilir md5 değerleri yinelenen başladığında görülür ki,. Set büyüdükçe, dengeye ulaşılmadan önce daha uzun sürebilir ve görüntü daha da kötüleşir.

Dengedeki gibi görünen şey, nicelleştirmeden önceki DCT katsayısının, kuantum değerlerinin tümü (veya çoğunun) bölünebilir olması gerekir. Örneğin, DCT katsayısının dönüşümlü olarak 3 ve 5'e bölündüğü iki DQT arasında geçiş yapılırsa, DCT katsayısı 15 ile bölünebilir olduğunda dengeye ulaşılır. Bu, kalite düşüşünün neden orijinal ayarlar arasındaki farktan daha büyük olduğunu açıklar.

Daha fazla ayar arasında geçiş yapma

Eeyore böyle q2değiştiğinde mutlu olmaz :

q2=$(( (RANDOM % 9)  + 90 ))

Bir video yapmak için şunu kullanın ffmpeg:

rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4

İzlemek ilk 9999 tekrarlamalar neredeyse su kaynatın izlemek gibidir. İzleme hızını iki katına çıkarmak isteyebilirsiniz. 11999 yinelemeden sonra Eeyore:

11999 yineleme, rastgele DQT

MCU sınırları değişirse ne olur?

Değişiklikler sınırlı sayıda gerçekleşirse, tekrar tekrar sıkıştırmanın sabit duruma ulaşması muhtemeldir. Her yinelemede değişiklik olursa, görüntü muhtemelen DQT değiştiğindekine benzer şekilde düşer.

  • Bu içinde ne olduğudur döndürmek videolar 8 ile bölünebilir olmayan boyutlara sahip bir görüntü.

Peki ya düzenleme?

Düzenlemeden sonra yeniden sıkıştırmanın etkisi, gerçekleştirilen belirli düzenlemeye bağlıdır. Örneğin, JPEG yapılarını azalttıktan sonra aynı kalite ayarında kaydetme, aynı yapıyı yeniden ortaya koyar. Bununla birlikte, bir iyileştirme fırçası gibi yerel bir değişimin uygulanması, dokunulmayan alanları etkilemeyecektir.

Görüntü kalitesindeki en büyük düşüş, dosya belirli bir kalite ayarında ilk kez sıkıştırıldığında gerçekleşir. Daha sonra aynı ayar ile yeniden sıkıştırma, yuvarlama hatasından daha büyük bir değişiklik getirmemelidir. Bu yüzden, aynı kalitede ayarlarla kaydedilen herhangi bir görüntüye benzeyen belirli bir kalite ayarında düzenleme-kurtarma döngüleri beklerdim (MCU sınırları bozulmadan kaldığı ve kroma örnekleme devre dışı bırakıldığı sürece ).

Peki ya bu videolar?

Orijinalleri yeniden sıkıştırılmış JPEG'lerle fazla yazabilir miyim?

Tüm orijinal dosyaların yedeklerini saklamak akıllıcadır, ancak yanlışlıkla birinin üzerine yazarsanız, zarar muhtemelen sınırlıdır. Ayrıca , kroma alt örneklemenin devre dışı bırakılmasıyla JPEG’de çalışmak iyi olur .

JPEG, renk başına 8 bitten fazlasını kullanan görüntüler için kullanılamaz.


5
resim olsa da load- edit -save loop'lar ile oldukça farklı . Bu durumda, tekrarlanan miktar ölçümü bozulmaya neden olacaktır.
ths

2
Ben sadece cevap olarak aynı komut dosyası ile bir test yaptım. işte her 20'nci görüntünün bir tp 100 montajı: i.stack.imgur.com/xtob6.jpg bu önemli.
ths

2
Ah. imgemdeki sorunu buldum. Açık renk kroma örneklemeniz açıksa, ilerici bozulmaya yol açar.
ths

2
Bunu da buldum. Böylece kroma alt örneklemesinin etkinleştirilmesi, sabit duruma ulaşılmadan önce görüntüdeki rengi önemli ölçüde değiştirir.
xiota

2
Tam olarak aynı parametreleri kullanarak tekrarlanan yükler ve tasarruflar sınırsız kalite kaybına neden olmaz, çünkü çoğu girdi dosyası ek yuvarlama hatası vermeden yüklenip yeniden kaydedilebilir ve yuvarlama hatalarından etkilenecek dosyalar büyük olasılıkla dönüştürülebilir. olmaz dosyaları. Öte yandan, benzer ancak aynı olmayan sıkıştırma parametreleri arasında değişen tekrarlanan yükleme / kaydetme döngüleri, her döngüde yuvarlama hatalarına neden olabilir.
supercat,

20

Sıkıştırma kaybı, özellikle daha yüksek JPEG sıkıştırması düzeyleriyle çalışırken geçerlidir.

Eğer tam aynı parametrelerle bir JPEG dosyaları kaydetme-re Teorik olarak, ve 8 × 8 bloktan için kırpma hale getirdiğini bozulması gerektiğini minimal olması gerekir. Bununla birlikte, yüksek düzeyde bir sıkıştırma kullanıyorsanız , ilk sıkıştırma tarafından ortaya çıkarılan eserler görüntüde kalıcı değişiklikler olduğu ve daha fazla esere neden olacak şekilde yeniden sıkıştırılacağı için daha fazla kayıp göreceksiniz .

Düşük bir sıkıştırma düzeyiyle (Gimp'te "100" veya Photoshop'ta 11 veya 12 gibi yüksek kaliteli) yeniden kaydettiğinizde, yeni eklenen yapıtların fark edilmesi zor olacaktır. Görüntüyü daha iyi yapmaz, ancak daha da kötüleşmez. Ancak, tüm görüntüde değişiklikler getirecektir .

Hızlı bir test olarak, JPEG görüntüsünü% 75’de tekrar tekrar sıkıştırmak için ImageMagick kullandım. Daha fazla yeniden sıkıştırmayı önlemek için aşağıdaki örnekler PNG dosyaları olarak yüklenir ve efekti daha belirgin hale getirmek için PNG'ye dönüştürüldüğümde iki katına çıkarılır. (Testte kullanılan orijinaller iki katına çıkmadı.) Sekiz örneklemeden sonra, efektin tamamen sabit bir sonuçta bir araya geldiği, tekrar sıkıştırmanın bit için aynı bir dosyada sonuçlandığı ortaya çıktı.

İşte sıkıştırılmamış orijinal:

Orijinal, hayır jpeg sıkıştırma

İşte% 75 JPEG gitmenin sonucu:

ilk jpeg

Ve işte yeniden kaydedildi:

ikinci geçiş

Bu tek saniyelik tasarruf büyük miktarda ek bozulmaya neden olur!

Ve işte son yakınsak görüntü (8. geçiş):

yakınsak jpeg

Yine, bazı yanlış renk desenleri de dahil olmak üzere renkler kesinlikle daha da kapalıdır ve bloklu eserler daha fazla atlamaktadır. Algoritma, yakınsak bir şekilde bozulmuş bir sürüme yaklaşır. Yani bunu yapma.

Ancak, 9 geçişten sonra (% 100 kalite seviyesiyle aynı şey)

% 99 9 kez

Burada, fark ancak kayıt olur. (Kelimenin tam anlamıyla demek istediğim; pikselleri sıkıştırılmamış versiyona göre piksel cinsinden karşılaştırmak ve sapma sadece çok hafif rastgele bir gürültüdür.) Peki, o zaman% 75 imajına geri dönüp% 99'da yeniden sayarsam ne olur? Peki, bu, (sadece bir kere sonra):

Bir kez% 75 ve bir kez% 99

Yüksek kalitede kaydetme kesinlikle gözle görülür daha iyi tür benim için sürpriz, aynı parametrelerle kaydetmeyi daha. Fakat pembe süslemenin ve gözlerin çevresinde yeni bir bozulma var. Aynı ayarların geri dönüştürülmüş versiyonu ile JPEG eserleri her bir yeniden sıkıştırma ile abartılıyor. Seçtiğim düşük çözünürlük ve düşük kaliteyle, her şeyin farklı şekilde sıkıştırılmasından daha kötü olduğu ortaya çıktı.

Bu videolarda: Bulduğum bu bir Google vurmak bir üst olarak. Açıklamasında yazdığını unutmayın:

JPEG görüntüsünü rastgele yüksek kaliteli ayarlarda (85 veya üzeri) birçok kez yeniden kodlarsanız olan budur .

Vurgu eklendi - bu neden herhangi bir yakınlaşma olmadığını açıklar, çünkü aynı ayarlarla kaydetmek veya süper yüksek kalitede tasarruf etmek yerine, her seferinde rastgele ayarlar kullanılır .

Bulduğum ikinci video diyor ki:

Bir JPEG görüntü kopyalandı ve her görüntü için tam bir tur döndürüldü. [...] (596 "saat yönünde döndür" eylemleri)

Böylece, yine hataları biriktirecek bir şey yapıldı.

Her durumda, pratik fotoğraf düzenleme için , 's değerinde söz 75% tasarruf bir kez % 99'da bir kaydetmeyi çok daha kötü milyon kez . Benim örneğimde,% 75'teki eserler o kadar açıktır ki, daha sonraki bozulma, okyanusa su dökmek gibidir. Bu eserlerin gerçekten görünmeyeceği kadar yüksek bir seviyede tasarruf ederseniz, orijinal ayarlarla tekrar kaydetmek iyi bir stratejidir. Elbette, sıkıştırılmamış orijinallerden her zaman çalışmaya devam ederseniz, daha iyi durumda olursunuz.

Herhangi bir nedenden ötürü sadece JPEG ile çalışmak zorundaysanız (veya şiddetle tercih ederseniz), ilk dosyalardaki farkı görmeseniz bile , kameranızı mümkün olan en yüksek kalitede kaydetmeye ayarlayın . Bkz değer Pentax'ın Premium JPEG kalite ayarını kullanarak mı? Daha fazlası için - mutlaka gerçekten Pentax'a özgü değil.


(1)% 75 oranında tasarruf ediyorsunuz. Bu ayarda, görüntü kalitesi kaybı bekleniyor. (2) Bu görüntü JPEG sıkıştırma eserlerini abartmak için seçildi ve değiştirildi. (3) Görüntü, 8 sıkıştırma turundan sonra bir araya gelir, bundan sonra görüntü kalitesinde daha fazla azalma olmaz. (4) “Nesil kaybını” gösteren bu görüntünün videosu, ilk 1/4 saniyeden sonra gerçekleşecek hiçbir şey içermez.
xiota

5
(1) Evet. (2) Bu tür bir şeyi umursabilecekleri tipik bir fotoğraf olarak "Seçildi". Yalnızca yakınlaştırmak için "Değiştirildi". Bunun yalnızca burada görüntülenmek üzere olduğunu unutmayın - Çalıştığım görüntünün boyutunu ikiye katlamadım. (3) Evet, ama düzenleme için pratikte, umursayabileceğiniz ilk birkaç tur. (4) Bu doğru, ancak en kötü duruma yaklaşmanın ve orada kalmanın herhangi bir şekilde faydalı olduğu anlamına gelmez.
mattdm

Çoğaltmak için, ilk resmi çekin ve herhangi bir yeniden örnekleme veya enterpolasyon olmadan 256 × 256 olarak yeniden boyutlandırın.
mattdm

Gösterdiğiniz resimler arasında çok fazla fark göremiyorum . Ancak, tek tek yeniden sıkıştırılmış ve karşılıklı olarak yeniden sıkıştırılmış bir görüntünün farkını alıp onu görünür kılmak için büyütürsem, bu (çok daha ikna edici) sonucunu alıyorum : i.stack.imgur.com/57uaY.png (silindi tam olarak ne yapıldığına cevap verin) Daha inandırıcı çünkü insanların dakika farklarını tespit etmek için görüntüye bakmaya devam etmeleri gerekmiyor.
Szabolcs

Farklılıklar oldukça küçük. Eğer geniş bir LCD ekranınız varsa, biraz farklı bakış açılarından kaynaklanan farklı "gama" eserler daha belirgin görünmesini sağlayabilir.
xiota

5

Yeniden sıkıştırma, görüntü kalitesi üzerinde ölçülebilir bir etkiye sahiptir ve bu etki, sıkıştırma oranlarını değiştirirken çok daha belirgindir.

Burada hızlı bir kontrol olarak , bir çizgi özellikleri ve sürekli özellikler içeren bir test görüntüsünde gerçekleştirilen işlemler için bazı SSIM değerleri. JPG95'i seçtim çünkü bu, Ad-photo school ve JPG83'te kullanmamın öğretildiği şeydi çünkü dijital içerik sağlayıcılar arasında yaygındı.

  • Tiff resmini JPG95 - .9989 olarak kaydet
  • Tiff resmini JPG83 - .9929 olarak kaydet
  • JPG95 görüntüsünü JPG95 10 kez kurtarın - .9998
  • JPG83 resmini JPG83 olarak 10 kez kurtarın - .9993
  • JPG95'i JPG83 olarak yeniden kaydedin, ardından JPG95 - .9929 olarak yeniden kaydedin
  • JPG95'i JPG83, ardından JP83 ila JP92, ardından JPG92 ila JPG86 - .9914 olarak yeniden kaydedin

Dolayısıyla, aynı sıkıştırmada 10 kez yeniden biriktirmek için kaybedilen yapısal benzerlik miktarı, kaliteden ödün vermeyecek derecede 1 / 10'dur. Bununla birlikte, bir kez bile JPG sıkıştırmasını değiştirmekten kaynaklanan kalite kaybı, bu görüntünün Tiff'dan JPG'ye kaydedilmesinde kaybedilen kalite ile aynıdır.

Bu testi birkaç yol daha deneyeceğim ve güncelleyeceğim.

Metodoloji : ImageJ'de:

  1. Tiff RGB'yi gri tonlamalı 8 bit'e dönüştürün
  2. JPG95 ve JPG83’ü Tiff Original’den kurtarın
  3. Belirtildiği şekilde başka kurtarma işlemleri gerçekleştirme
  4. Karşılaştırma görüntüleri yükleyin ve SSIM Index Plugin kullanın

NOT: SSIM değerlerine ilk kez bakan birçok kişi, bunları yüzde olarak okur ve farkın küçük olduğunu varsayar. Bu mutlaka doğru değil. SSIM değerleri, 1'den bir sapma olarak kabul edilmek yerine, birbirlerine göre karşılaştırılmalıdır.


@ xiota, ImageJ için bir SSIM eklentisi kullanıyorum. Parametrelerin ayarlanmasını sağlayan az sayıda SSIM uygulamasından biridir (16px JPEG bloklarındaki değişiklikleri algılaması daha muhtemel olacak şekilde filtre genişliğini 8 olarak ayarladım.) SSIM'i enerji enerjisindeki farklılıklara daha duyarlı olduğu için tercih ediyorum. yeniden dağıtma. Farklılıklar iptal edilirse veya farklılıklar küçük bir alanda yoğunlaşırsa, bir fark görüntüsü yanıltıcı olabilir.
PhotoScientist

Ve ikinci sorunuza göre, JPG95'ten JPG83'e JPG95'e giden fark Tiff'den JPG83'e gitmekle aynı. Tiff-JPG95-JPG83-JPG95 istiyorsanız, bu 0,9923
PhotoScientist

Dört farklı sıkıştırma ile bir deneme eklendi. Kayıp hala daha büyük, ancak aynı sıkıştırma birkaç nesiller üzerinde görülen "yakınsama" nın birden fazla farklı sıkıştırma denediğinde de mevcut olduğu açık. Yine de bunu Uygulama merkezli bir iş akışında denemek istiyorum, ancak bu biraz daha uzun sürüyor.
PhotoScientist

Diğer bir sorun da, "kalite" ayarlarının SSIM eşiklerine standart bir şekilde eşleştirilmemesi ve önemli miktarda bilgi kaybını önlemek için hangi kalite ayarının gerekli olduğunu belirlemenin bir yolu olmamasıdır. Biri bir JPEG yükleyip yeterince yüksek bir ayarda kaydederse, ek kalite kaybından kaçınılabilir ancak dosya daha da büyüyebilir. Bir dosya oluşturulurken hangi ayarın kullanıldığını bilmiyorsa, onu yeniden kaydederken hangi ayarın kullanılacağını belirlemek zor olabilir.
supercat,

4

Bazı deneyler gibisi yok. Aşağıdaki bash betiği (Linux'ta yazılmış, ImageMagick'iniz varsa OSX üzerinde çalışabilir ):

  • ilk görüntüden başlayarak (adlandırılmış step000.jpg)
  • JPEG dosyasını alır, beyaz bir nokta ekler (bunun yeni bir resim olduğunu kanıtlamak için) ve (kayıpsız bir PNG) olarak kaydeder
  • PNG'yi alır ve JPEG olarak yeniden sıkıştırır (bu yüzden JPEG'ten JPEG'e hiçbir zaman sıkıştırmayız ve yazılımın yalnızca kodlanmış blokları kopyaladığını varsayamayız)
  • iki JPEG arasındaki farklı pikselleri gösteren bir resim yapar
  • durulayın ve önceki adımın JPG çıkışını kullanarak tekrarlayın

Sonuç şudur:

  1. JPG kalitesinde fazla kayıp yok
  2. yuvarlama hataları, kısa sürede nesiller geçtikten sonra işler artık bozulmuyor.

Elbette bütün bunlar, JPEG’in her seferinde aynı parametrelerle aynı yazılım tarafından kaydedildiğini varsayar.

#! /bin/bash
# Runs successive JPEG saves on an image to evaluate JPEG losses

# convert & compare command from imagemagick
# if you use a recent version of IM, set these variables to:
# compare="magick compare"
# convert="magick convert"
convert=convert
compare=compare

dotradius=2
defaultsteps=10
defaultquality=90 # default quality for "convert"

function usage {
        echo "Usage: $0 [quality [steps]]"
        echo ""
        echo "Where:"
        echo "       - 'quality' is the quality factor of the JPEG compression "
        echo "          (1-100, 100 is best, default is $defaultquality)"
        echo "       - 'steps' is the number of successive steps to perform"
        echo "         (default is $defaultsteps)"
        echo ""
        echo "Produces:"
        echo "   - successive saves of a JPEG image to test JPEG-induced losses."
        echo "   - compare images with the original file and the 1st JPEG save."
        echo ""
        echo "Starts from a 'step000.jpg' file in the current directory."
        exit 1
}

[[ -n "$3" ]] && { usage ; exit 1 ; }
steps=${1:-$defaultsteps}
quality=${2:-$defaultquality}    
dotcolor="white" # change this if the top of the image is too clear

echo "Running with $steps steps with quality $quality"

for step in $(seq $steps)
do 
    echo "Step $step of $steps"
    src=$(printf step%03d $(( $step - 1 )) ) 
    dst=$(printf step%03d $(( $step )) )
    dif=$(printf diff%03d $(( $step )) )
    # dot coordinates
    let cxc="2 * $dotradius * $step"
    let cxr="$cxc + $dotradius"
    let cyc="$dotradius * 2"
    let cyr="$dotsradius * 2"

    $convert $src.jpg -fill white -draw "circle $cxc,$cyc,$cxr,$cyr" $dst.png
    $convert $dst.png -quality $quality $dst.jpg
    rm $dst.png
    $compare $src.jpg $dst.jpg $dif.jpg
done

Şimdilik sonuçları göstermeyeceğim, kendi resimlerinizi denemenize izin vermeyi tercih ediyorum. Yeterince yorum ile bir örnek ekleyeceğim.


1
Farklı yazılım şeylerini merak ediyordum. 7 farklı yazılımdan 7x kaydetmeye çalıştım. Aradaki fark oldukça büyük olduğundan, her uygulamanın aynı zararı olup olmadığını görmek için bozdum. Uygulamaların 1 tanesi tüm varyasyonlardan sorumluydu. Kırmızı ringa balığı çıkardıktan sonra, 6x programlardan 6x kaydetti,
ImageJ'den

Bazı kötü kodlanmış yazılımlar olabilir. Algoritmaları çeşitli uygulamalardan karıştırmanın, yuvarlama hatalarının da çözülmesini engellemesi de mümkündür.
xenoid

@ xiota, FLEMinimizer adında tuhaf bir programdı. İlk başta neden aldığımı bile hatırlamıyorum. Diğerleri ImageJ, Matlab, Photoshop, FastStone Resim Görüntüleyici, Ifranview ve CameraRaw idi. Bu altı adım arasında herhangi bir aşamada neredeyse hiçbir değişiklik yoktu.
PhotoScientist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.