Yếu tố nào gây ra hoặc ngăn chặn mất thế hệ của người dùng khi các JPEG được nén lại nhiều lần?


29

Trong nhiều năm, tôi đã tin rằng việc giải nén các tệp JPEG nhiều lần sẽ làm giảm dần chất lượng của nó cho đến khi chúng là một mớ hỗn độn không thể nhận ra, cách tạo ra các bản sao của bản sao. Điều này theo trực giác có ý nghĩa bởi vì JPEG là một định dạng mất mát. Ngoài ra còn có các câu hỏi và trả lời khác cho rằng đây là như vậy:

Tuy nhiên, tôi cũng đã đọc rằng giải nén JPEG ở cùng mức chất lượng sẽ không làm giảm chất lượng hình ảnh. Điều này chạy ngược lại với sự xuống cấp dần dần được mô tả ở nơi khác.

Điều gì về mặt kỹ thuật xảy ra khi JPEG được nén lại?  Điều gì đang bị mất và làm thế nào? Liệu hình ảnh có thực sự biến thành mớ hỗn độn tuyết từng xuất hiện trên truyền hình? Còn những video hiển thị hình ảnh bị sụp đổ sau khi được nén lại nhiều lần thì sao?

(Xin đừng chỉ đơn thuần là rửa tay và thu hút khái niệm chung về sự mất mát.)

(Câu hỏi này và câu trả lời mà nó đã thu hút cho đến nay, tập trung vào các yếu tố kỹ thuật (cài đặt cụ thể và thao tác hình ảnh) gây ra hoặc ngăn chặn sự xuống cấp của hình ảnh khi tệp JPEG được nén lại nhiều lần.)





2
@MonkeyZeus Một số (nhỏ) số lượng dữ liệu hình ảnh bị mất do làm tròn số lỗi ở chất lượng 100. nén lại tại thiết lập tương tự (ví dụ như 80) không không dẫn đến tiến bộ mất dữ liệu. Đó là "kiến thức phổ biến" mà Q & A này dự định sẽ giải quyết.
xiota

1
@MonkeyZeus Các giá trị như "100" và "80" (hoặc "10, 11, 12" trong Photoshop) là tùy ý - 100% không phải là không mất.
mattdm

Câu trả lời:


32

Hầu như tất cả các mất chất lượng hình ảnh xảy ra lần đầu tiên khi hình ảnh được nén dưới dạng JPEG. Bất kể bao nhiêu lần JPEG được nén lại với cùng các cài đặt , tổn thất thế hệ được giới hạn ở lỗi làm tròn.

  • Ranh giới MCU vẫn còn nguyên (khối 8 x 8).

  • Lấy mẫu con Chroma bị vô hiệu hóa.

  • DQT không đổi (cài đặt chất lượng tương tự).

Tuy nhiên, các lỗi làm tròn có thể lớn đối với mỗi lần lặp mà các tiêu chí trên không được đáp ứng và nên thận trọng khi giữ các bản sao lưu của tất cả các tệp gốc.


Thuật toán nén JPEG

  1. Chuyển đổi không gian màu. Nếu muốn, hãy lấy thông tin màu xuống (lấy mẫu màu) (Mất dữ liệu) . Nếu không được ghép xuống, mất thông tin là kết quả của lỗi làm tròn .

  2. Phân khúc. Chia mỗi kênh thành các khối 8x8 (MCU = Đơn vị mã hóa tối thiểu). (Mất mát)

    Lưu ý: Nếu bật mẫu phụ màu, MCU có thể có hiệu quả là 16x8, 8x16 hoặc 16x16, về mặt hình ảnh gốc. Tuy nhiên, MCU vẫn là tất cả các khối 8x8.

  3. Biến đổi Cosine rời rạc (DCT) trên mỗi MCU. Mất thông tin là kết quả của lỗi làm tròn .

  4. Lượng tử hóa.  Giá trị trong mỗi ô của MCU được chia cho một số được chỉ định trong bảng lượng tử hóa (DQT). Các giá trị được làm tròn xuống, nhiều trong số đó sẽ trở thành số không. Đây là phần mất mát chính của thuật toán.

  5. Quét Zig-Zag. Sắp xếp lại các giá trị trong mỗi MCU thành một chuỗi các số theo mô hình zig-zag. Các số không xảy ra trong quá trình lượng tử hóa sẽ được nhóm lại với nhau. (Mất mát)

  6. DPCM = Điều chế mã xung vi sai. Chuyển đổi các chuỗi số thành một hình thức dễ nén hơn. (Mất mát)

  7. RLE = Chạy mã hóa chiều dài. Các số 0 liên tiếp được nén. (Mất mát)

  8. Mã hóa Entropy / Huffman. (Mất mát)

Giải nén JPEG

Lưu ý rằng việc lấy mẫu xuống các kênh màu và lượng tử hóa là các bước duy nhất bị mất có chủ ý . Đặt lỗi làm tròn sang một bên bây giờ, tất cả các bước khác là không mất mát. Khi lượng tử hóa đã xảy ra, đảo ngược và lặp lại bước cho kết quả giống hệt nhau. Nói cách khác, tái lượng tử hóa (với cùng một DQT) là không mất mát .

Về nguyên tắc, có thể tạo ra một thuật toán lấy mẫu lại mà không mất dữ liệu sau lần vượt qua đầu tiên. Tuy nhiên, với việc triển khai trong ImageMagick, màu sắc có thể thay đổi mạnh mẽ trước khi đạt đến trạng thái ổn định, như được thấy trong hình ảnh của ths.

Với các điều kiện tối ưu, việc giải nén một JPEG có cùng cài đặt chất lượng sẽ dẫn đến cùng một JPEG. Nói cách khác, việc nén lại JPEG có khả năng mất mát . Trong thực tế, việc nén lại JPEG không phải là mất mát, nhưng phải chịu và bị giới hạn bởi lỗi làm tròn. Mặc dù các lỗi làm tròn thường cuối cùng hội tụ về 0 , do đó, cùng một hình ảnh chính xác được tạo lại, việc lấy mẫu sắc độ có thể dẫn đến thay đổi màu sắc đáng kể.

Trình diễn (cài đặt chất lượng tương tự)

Tôi đã viết đoạn bashscript sau , sử dụng ImageMagick để liên tục giải nén tệp JPEG ở một cài đặt chất lượng nhất định:

#!/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

Sau khi để nó chạy vài trăm lần, tôi chạy md5sumkết quả:

d9c0d55ee5c8b5408f7e50f8ebc1010e  original.jpg

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

Chúng ta có thể thấy rằng, thực sự, lỗi làm tròn đã hội tụ về 0 và hình ảnh chính xác tương tự đang được sao chép, lặp đi lặp lại .

Tôi đã lặp lại điều này nhiều lần với các hình ảnh và cài đặt chất lượng khác nhau. Thông thường, trạng thái ổn định được đạt tới và hình ảnh chính xác được lặp đi lặp lại.

Còn kết quả của @ mattdm thì sao?

Tôi đã cố gắng sao chép kết quả của mattdm bằng Imagemagick trên Ubuntu 18.04. Bản gốc là một chuyển đổi thô thành TIFF trong Rawtherapee, nhưng dường như nó không còn nữa. Ở vị trí của nó, tôi lấy phiên bản phóng to và giảm kích thước xuống kích thước ban đầu (256x256). Sau đó, tôi liên tục nén lại ở 75 cho đến khi tôi hội tụ. Đây là kết quả (bản gốc, 1, n, sự khác biệt):

cố gắng sao chép mattdm

Kết quả của tôi là khác nhau. Không có bản gốc thực sự, lý do cho sự khác biệt là không thể xác định.

Điều gì về cách dựng phim của @ ths ?

Tôi đã nén lại hình ảnh từ góc trên bên trái của đoạn phim cho đến khi hội tụ ở 90. Đây là kết quả (bản gốc, 1, n, khác biệt):

cố gắng tái tạo ths-montage

Sau khi cho phép lấy mẫu sắc độ, màu sắc sẽ thay đổi theo trạng thái ổn định thời gian đạt được.

ths-màu-ca

Thay đổi giữa một số lượng nhỏ cài đặt

Bằng cách sửa đổi biến q2, cài đặt chất lượng có thể được giới hạn ở một tập hợp các giá trị được phân bổ đều.

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

Đối với một số lượng nhỏ các lựa chọn cài đặt, trạng thái cân bằng cuối cùng có thể đạt được , điều này được thấy khi các giá trị md5 bắt đầu lặp lại. Có vẻ như bộ càng lớn thì càng mất nhiều thời gian và hình ảnh càng trở nên xấu hơn, trước khi đạt được trạng thái cân bằng.

Điều dường như xảy ra ở trạng thái cân bằng là hệ số DCT trước khi lượng tử hóa phải chia hết (hoặc hầu hết) các giá trị lượng tử. Ví dụ: nếu chuyển đổi giữa hai DQT trong đó hệ số DCT được chia xen kẽ cho 3 và 5, trạng thái cân bằng sẽ đạt được khi hệ số DCT chia hết cho 15. Điều này giải thích tại sao chất lượng giảm lớn hơn nhiều so với chênh lệch giữa các cài đặt ban đầu.

Thay đổi giữa số lượng cài đặt lớn hơn

Eeyore không vui khi q2được thay đổi như vậy:

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

Để tạo video, sử dụng 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

Xem các lần lặp 9999 đầu tiên gần giống như xem nước sôi. Có thể muốn tăng gấp đôi tốc độ phát lại. Đây là Eeyore sau 11999 lần lặp:

11999 lặp, DQT ngẫu nhiên

Nếu ranh giới MCU thay đổi thì sao?

Nếu thay đổi xảy ra trong một số lần giới hạn, việc lặp lại nhiều lần có khả năng đạt đến trạng thái ổn định. Nếu thay đổi xảy ra ở mỗi lần lặp, hình ảnh có thể sẽ giảm theo cách tương tự như khi DQT thay đổi.

  • Đây là những gì xảy ra trong các video xoay hình ảnh với kích thước không chia hết cho 8.

Còn chỉnh sửa thì sao?

Hiệu quả của việc giải nén sau khi chỉnh sửa phụ thuộc vào chỉnh sửa cụ thể được thực hiện. Chẳng hạn, lưu ở cùng một cài đặt chất lượng sau khi giảm các tạo phẩm JPEG sẽ giới thiệu lại các tạo phẩm tương tự. Tuy nhiên, áp dụng thay đổi cục bộ, chẳng hạn như bàn chải chữa bệnh, sẽ không ảnh hưởng đến các khu vực không được chạm vào.

Chất lượng hình ảnh giảm mạnh nhất xảy ra lần đầu tiên khi tệp được nén ở một cài đặt chất lượng nhất định. Sau đó, việc giải nén với cùng một cài đặt sẽ không đưa ra bất kỳ thay đổi nào lớn hơn lỗi làm tròn. Vì vậy, tôi mong đợi các chu kỳ chỉnh sửa-lưu lại ở một cài đặt chất lượng nhất định trông giống như bất kỳ hình ảnh nào khác được lưu với cùng một cài đặt chất lượng (miễn là các ranh giới MCU vẫn còn nguyên và việc lấy mẫu sắc độ bị vô hiệu hóa ).

Còn những video đó thì sao?

  • Thực hiện JPEG bị lỗi? (Lưu lại 500 lần với Photoshop vào ngày 10/12. )

  • Thay đổi cài đặt chất lượng. (Hầu hết các video.)

  • Phá vỡ ranh giới MCU. (Cắt hoặc xoay )

  • Các thao tác khác làm giảm chất lượng hình ảnh hoặc can thiệp vào thuật toán JPEG?

Tôi có thể ghi đè lên bản gốc của mình bằng JPEG được nén không?

Nên thận trọng giữ các bản sao lưu của tất cả các tệp gốc, nhưng nếu bạn vô tình ghi đè lên một tệp, thiệt hại có thể bị hạn chế. Nó cũng sẽ ổn khi làm việc trong JPEG với việc tắt mẫu phụ sắc độ.

JPEG không thể được sử dụng cho hình ảnh sử dụng nhiều hơn 8 bit mỗi màu.


5
hình ảnh khá khác nhau với các vòng lặp tải- chỉnh sửa -mặc dù. trong trường hợp này, lượng tử hóa lặp đi lặp lại sẽ gây ra sự xuống cấp.
THS

2
tôi chỉ làm một bài kiểm tra với kịch bản giống như trong câu trả lời. đây là cách dựng phim của mỗi hình ảnh thứ 20 lên đến 100: i.stack.imgur.com/xtob6.jpg rất có ý nghĩa.
THS

2
à tìm thấy vấn đề với hình ảnh của tôi nếu bạn bật tính năng lấy mẫu màu, điều đó dẫn đến suy thoái lũy tiến.
THS

2
Tìm thấy điều đó quá. Vì vậy, cho phép lấy mẫu sắc độ làm thay đổi đáng kể màu sắc trong ảnh trước khi đạt đến trạng thái ổn định.
xiota

2
Tải lặp lại và lưu bằng cách sử dụng các tham số chính xác giống nhau có thể sẽ không gây ra mất chất lượng không bị chặn, vì hầu hết các tệp đầu vào có thể được tải và lưu lại mà không gây ra lỗi làm tròn bổ sung và các tệp bị ảnh hưởng bởi lỗi làm tròn sẽ có thể được chuyển thành tập tin sẽ không. Mặt khác, các chu kỳ tải / lưu lặp đi lặp lại xen kẽ giữa các tham số nén tương tự nhưng không giống nhau có thể dẫn đến lỗi làm tròn trên mỗi chu kỳ.
supercat

20

Mất nén lại là có thật, đặc biệt là khi làm việc với mức độ nén JPEG cao hơn.

Về lý thuyết, nếu bạn lưu lại một tệp JPEG có cùng tham số chính xác đã căn chỉnh crop của bạn thành các khối 8 × 8, thì sự xuống cấp phải ở mức tối thiểu. Tuy nhiên, nếu bạn đang sử dụng mức độ nén cao, bạn sẽ thấy mất thêm, bởi vì các tạo phẩm được giới thiệu bởi lần nén ban đầu là những thay đổi vĩnh viễn cho hình ảnh và cũng sẽ được nén lại, gây ra nhiều hiện vật hơn.

Nếu bạn lưu lại với mức độ nén thấp (chất lượng cao, như "100" trong Gimp hoặc 11 hoặc 12 trong Photoshop), mọi tạo tác mới được thêm vào sẽ khó nhận thấy. Nó sẽ không làm cho hình ảnh tốt hơn , nhưng không tệ hơn đáng kể. Tuy nhiên, nó sẽ giới thiệu những thay đổi trên toàn bộ hình ảnh.

Để thử nghiệm nhanh, tôi đã sử dụng ImageMagick để giải nén lại hình ảnh JPEG nhiều lần với tỷ lệ 75%. Các mẫu bên dưới được tải lên dưới dạng tệp PNG để tránh giải nén thêm và được tăng gấp đôi kích thước khi tôi chuyển đổi sang PNG để làm cho hiệu ứng rõ ràng hơn. (Các bản gốc được sử dụng trong thử nghiệm không được nhân đôi.) Hóa ra sau tám lần thay đổi, hiệu ứng đã hội tụ trên một kết quả hoàn toàn ổn định, trong đó việc giải nén lại dẫn đến một tệp giống hệt bit.

Đây là bản gốc không nén:

nguyên bản, không nén jpeg

Đây là kết quả của việc chuyển đến 75% JPEG:

jpeg đầu tiên

Và đây là bản lưu lại:

đường chuyền thứ hai

Đó là tiết kiệm thứ hai gây ra một số lượng lớn xuống cấp!

Và đây là hình ảnh hội tụ cuối cùng (đường thứ 8):

jpeg hội tụ

Một lần nữa, màu sắc chắc chắn thậm chí còn nhiều hơn , bao gồm một số mẫu màu sai, và các tạo tác khối sẽ nhảy ra nhiều hơn. Thuật toán hội tụ, nhưng đến một phiên bản xuống cấp đáng kể. Vì vậy, đừng làm điều đó.

Nhưng đây là điều tương tự với mức chất lượng 99%, sau 9 lần vượt qua (điểm mà nó hội tụ để các đường chuyền tiếp theo giống hệt nhau):

99% 9 lần

Ở đây, sự khác biệt hầu như không đăng ký. . Chà, cái này, (chỉ sau một lần):

75% một lần và sau đó 99% một lần

Tiết kiệm ở chất lượng cao chắc chắn tốt hơn rõ ràng so với việc lưu lại với các thông số tương tự, làm tôi ngạc nhiên. Nhưng, có sự xuống cấp rõ ràng mới xung quanh việc cắt tỉa màu hồng và đôi mắt. Với phiên bản tái chế của cùng các cài đặt, các tạo tác JPEG đang được phóng đại với mỗi lần nén lại. Với độ phân giải thấp và chất lượng thấp mà tôi đã chọn, điều đó hóa ra còn tệ hơn là giải nén mọi thứ khác đi.

Trên các video đó: Tôi thấy video này là một hit hàng đầu của Google. Lưu ý rằng nó nói trong mô tả:

Đây là những gì xảy ra nếu bạn mã hóa lại hình ảnh JPEG nhiều lần, ở cài đặt chất lượng cao ngẫu nhiên (85 trở lên).

Nhấn mạnh thêm - điều này giải thích tại sao không có bất kỳ sự hội tụ nào, bởi vì thay vì lưu với cùng các cài đặt hoặc lưu ở chất lượng siêu cao, các cài đặt ngẫu nhiên được sử dụng mỗi lần .

Video thứ hai tôi tìm thấy nói:

Một hình ảnh JPEG đã được sao chép và xoay một cuộc cách mạng đầy đủ cho mỗi hình ảnh. [...] (596 hành động "xoay theo chiều kim đồng hồ")

Vì vậy, một lần nữa, một cái gì đó đã được thực hiện để giữ cho các lỗi tích lũy.

Trong mọi trường hợp, để chỉnh sửa ảnh thực tế , điều đáng nói là tiết kiệm 75% một lần còn tệ hơn nhiều so với việc lưu lại 99% một triệu lần . Trong trường hợp ví dụ của tôi, các cổ vật ở mức 75% rõ ràng đến mức sự xuống cấp hơn nữa giống như đổ nước vào đại dương. Nếu bạn lưu ở mức đủ cao mà những đồ tạo tác này không thực sự hiển thị, thì lưu lại với cài đặt gốc là một chiến lược tốt. Tất nhiên, nếu bạn có thể luôn luôn làm việc từ các bản gốc không nén, bạn sẽ tốt hơn.

Nếu vì lý do nào đó bạn phải (hoặc cực kỳ thích) chỉ làm việc với JPEG, hãy đặt máy ảnh của bạn ở mức chất lượng cao nhất có thể , ngay cả khi bạn không nhận thấy sự khác biệt trong các tệp ban đầu. Xem Có đáng để sử dụng cài đặt chất lượng JPEG Premium của Pentax không? để biết thêm về điều đó - không nhất thiết phải thực sự cụ thể Pentax.


(1) Bạn đang tiết kiệm ở mức 75%. Ở cài đặt đó, mất chất lượng hình ảnh dự kiến. (2) Hình ảnh đó đã được chọn và thay đổi để phóng đại các tạo phẩm nén JPEG. (3) Hình ảnh hội tụ sau 8 vòng nén, sau đó sẽ không giảm chất lượng hình ảnh nữa. (4) Một video về hình ảnh đó cho thấy "mất thế hệ" sẽ có rất nhiều điều không xảy ra sau 1/4 giây đầu tiên.
xiota

5
(1) Có. (2) "Được chọn" là một bức ảnh điển hình trong đó người ta có thể quan tâm đến loại điều này. "Đã thay đổi" chỉ để phóng to. Lưu ý rằng điều này chỉ để hiển thị ở đây - Tôi không tăng gấp đôi kích thước của hình ảnh mà tôi đang làm việc. (3) Có, nhưng trong thực tế để chỉnh sửa, đó là vài vòng đầu tiên bạn có thể quan tâm. (4) Điều đó đúng, nhưng nó không có nghĩa là hội tụ đến trường hợp xấu nhất và ở đó là hữu ích theo bất kỳ cách nào.
mattdm

Để sao chép, chụp ảnh đầu tiên và thay đổi kích thước thành 256 × 256 mà không cần thay đổi kích thước hoặc nội suy.
mattdm

Tôi không thể thấy nhiều sự khác biệt giữa các hình ảnh bạn hiển thị. Nhưng nếu tôi lấy sự khác biệt của một hình ảnh được nén lại đơn lẻ và một hình ảnh được nén lại và khuếch đại nó để làm cho nó hiển thị, tôi nhận được kết quả này (thuyết phục hơn nhiều): i.stack.imgur.com/57uaY.png (xem tôi đã xóa trả lời về những gì đã được thực hiện chính xác) Nó thuyết phục hơn bởi vì mọi người không phải nhìn chằm chằm vào hình ảnh để phát hiện sự khác biệt phút.
Szabolcs

Sự khác biệt là khá nhỏ. Nếu bạn có màn hình LCD lớn, "gamma" khác nhau xuất phát từ các góc nhìn hơi khác nhau có thể làm cho các tạo tác xuất hiện nổi bật hơn.
xiota

5

Nén lại có ảnh hưởng có thể đo được đối với chất lượng hình ảnh và hiệu ứng đó rõ rệt hơn nhiều khi thay đổi tốc độ nén.

Như một kiểm tra nhanh ở đây vì một số giá trị SSIM cho các hoạt động được thực hiện trên hình ảnh thử nghiệm có chứa sự kết hợp của các tính năng dòng và tính năng liên tục. Tôi đã chọn JPG95 vì đó là những gì tôi được dạy sử dụng tại Trường ảnh quảng cáo và JPG83 vì đó là điều phổ biến giữa các nhà cung cấp nội dung số.

  • Lưu hình ảnh Tiff dưới dạng JPG95 - .9989
  • Lưu hình ảnh Tiff dưới dạng JPG83 - .9929
  • Lưu lại hình ảnh JPG95 dưới dạng JPG95 10 lần - .9998
  • Lưu lại hình ảnh JPG83 dưới dạng JPG83 10 lần - .9993
  • Lưu lại JPG95 dưới dạng JPG83 sau đó lưu lại dưới dạng JPG95 - .9929
  • Lưu lại JPG95 dưới dạng JPG83 rồi JP83 sang JP92 rồi JPG92 sang JPG86 - .9914

Vì vậy, lượng tương tự về cấu trúc bị mất khi lưu lại ở cùng một lần nén 10 lần là 1/10 số đó bị mất khi lưu nó với chất lượng từ tiff. Tuy nhiên, việc giảm chất lượng từ việc thay đổi nén JPG dù chỉ một lần cũng giống như mất chất lượng khi lưu hình ảnh đó từ Tiff sang JPG.

Tôi sẽ chạy thử nghiệm này một vài cách và cập nhật.

Phương pháp luận : Trong ImageJ:

  1. Chuyển đổi Tiff RGB sang thang độ xám 8 bit
  2. Lưu JPG95 và JPG83 từ Tiff gốc
  3. Tiến hành các hoạt động tiếp tục lưu lại theo quy định
  4. Tải hình ảnh so sánh và sử dụng Plugin SSIM Index

LƯU Ý: nhiều người lần đầu tiên nhìn vào các giá trị SSIM đọc chúng dưới dạng phần trăm và cho rằng sự khác biệt là nhỏ. Điều này không thực sự đúng. Các giá trị SSIM nên được so sánh tương đối với nhau thay vì được coi là phương sai từ 1.


@xiota, tôi đang sử dụng plugin SSIM cho ImageJ. Đây là một trong số ít các triển khai SSIM cho phép điều chỉnh các tham số (Tôi đặt độ rộng của bộ lọc là 8 để có nhiều khả năng phát hiện các thay đổi trong các khối JPEG 16px.) Tôi thích SSIM hơn vì nó nhạy hơn với sự khác biệt về năng lượng phân phối lại. Một hình ảnh khác biệt có thể gây hiểu nhầm nếu sự khác biệt bị loại bỏ hoặc sự khác biệt được tập trung trong một khu vực nhỏ.
PhotoSellectist

Và với câu hỏi thứ hai của bạn, điều đó nói rằng sự khác biệt từ JPG95 đến JPG83 đến JPG95 cũng giống như chuyển từ Tiff sang JPG83. Nếu bạn muốn Tiff-JPG95-JPG83-JPG95, đó là 0,9923
PhotoSellectist

Đã thêm một thử với bốn lần nén khác nhau. Mất mát vẫn còn lớn hơn nhưng rõ ràng là "sự hội tụ" được thấy qua nhiều thế hệ của cùng một nén cũng xuất hiện khi thử nhiều lần nén khác nhau. Vẫn muốn thử điều này trong một quy trình làm việc tập trung vào ứng dụng nhưng điều đó cần nhiều công sức hơn một chút.
PhotoSellectist

Một vấn đề khác là không có ánh xạ chuẩn của cài đặt "chất lượng" đến ngưỡng SSIM, cũng như không có cách nào để xác định cài đặt chất lượng nào sẽ cần thiết để tránh mất thông tin đáng kể. Nếu một người tải JPEG và lưu nó ở cài đặt đủ cao, có thể tránh mất chất lượng bổ sung nhưng tệp có thể sẽ lớn hơn. Nếu người ta không biết cài đặt nào được sử dụng khi tệp được tạo, có thể khó xác định cài đặt nào sẽ sử dụng khi lưu lại.
supercat

4

Không có gì giống như một số thử nghiệm. Tập lệnh bash sau (được viết trên Linux, có thể hoạt động trên OSX nếu bạn có ImageMagick ):

  • bắt đầu với một hình ảnh đầu tiên (được đặt tên step000.jpg)
  • lấy một tệp JPEG, thêm một chấm trắng (để chứng minh đây là một hình ảnh mới) và lưu nó dưới dạng (PNG lossless)
  • lấy PNG và nén lại dưới dạng JPEG (vì vậy chúng tôi không bao giờ nén JPEG-to-JPEG và không thể đưa ra giả thuyết rằng phần mềm chỉ sao chép các khối được mã hóa)
  • tạo một hình ảnh hiển thị các pixel khác nhau giữa hai JPEG
  • rửa và lặp lại, sử dụng JPG đầu ra của bước trước

Kết quả là:

  1. không có nhiều mất mát ở chất lượng JPG cao
  2. Các lỗi làm tròn cuối cùng đã giải quyết, sau một số thế hệ ngắn, mọi thứ không còn xuống cấp nữa.

Tất nhiên tất cả điều này giả định rằng JPEG được lưu bởi cùng một phần mềm với cùng một tham số mỗi lần.

#! /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

Hiện tại tôi sẽ không hiển thị kết quả, tôi thích để bạn thử nghiệm với hình ảnh của riêng bạn. Với đủ ý kiến, tôi sẽ thêm một mẫu.


1
Tôi tò mò về những điều phần mềm khác nhau. Tôi đã thử lưu 7x từ 7 phần mềm khác nhau. Sự khác biệt là khá lớn vì vậy tôi đã chia nhỏ nó để xem liệu mỗi ứng dụng có cùng một tổn thất hay không. 1 trong số các ứng dụng chịu trách nhiệm cho tất cả các biến thể. Khi tôi xóa cá trích đỏ, 6x lưu từ các chương trình 6x cũng giống như 6 lần lưu từ ImageJ
PhotoSellectist

Có khả năng một số phần mềm được mã hóa xấu. Cũng có thể việc trộn các thuật toán từ các ứng dụng khác nhau cũng sẽ ngăn chặn các lỗi làm tròn.
xenoid

@xiota, đó là một chương trình nhỏ kỳ lạ có tên FLEMinimizer. Tôi thậm chí không nhớ tại sao tôi lại có nó ở nơi đầu tiên. Những người khác là ImageJ, Matlab, Photoshop, FastStone Image Viewer, Ifranview và CameraRaw. Hầu như không có biến thể ở bất kỳ bước nào giữa sáu.
PhotoSellectist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.