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.
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 .
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.
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 .
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.
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)
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)
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)
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 bash
script 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 md5sum
kế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.
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):
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.
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):
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.
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:
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.