"Chất lượng 75" tự nó không nói lên điều gì: cùng một mức có thể cho kết quả hoàn hảo với ảnh này và lộ khối vuông với ảnh khác. Cách chọn mức nén đáng tin là so kết quả với ảnh gốc, bằng mắt và bằng số đo. Bài này giải thích hai con số mà hầu hết công cụ báo, PSNR và SSIM, bằng số đo trên một ảnh thử, và chỉ ra chỗ mỗi số đánh lừa bạn. Mọi giá trị được tính bằng chính đoạn mã của công cụ so sánh ảnh.
Ảnh thử
Ảnh thử là hình tập Mandelbrot 800 × 600 do FFmpeg vẽ: màu rất rực, chi tiết mịn ở mép và dải màu trơn ở chỗ khác, một trường hợp khó có chủ ý. Ở dạng PNG (không mất dữ liệu) ảnh nặng 311 KB. Ảnh được lưu thành JPEG bằng Pillow ở nhiều mức chất lượng, một lần với thiết lập mặc định và một lần tắt lấy mẫu màu thưa, và thành WebP chất lượng 75.
PSNR và SSIM đo gì
PSNR (tỉ số tín hiệu đỉnh trên nhiễu) là sai số bình phương trung bình giữa hai ảnh, biểu diễn theo thang logarit: 10 · log₁₀(255² / MSE), đơn vị decibel. Hai ảnh xám phẳng giá trị 100 và 110 lệch nhau 10 ở mọi điểm, nên MSE là 100 và PSNR là 28,13 dB. Hai ảnh giống hệt cho giá trị vô cực. Số này đơn giản, chính xác, nhưng không biết sai số nằm ở đâu.
SSIM (độ tương đồng cấu trúc, Wang và cộng sự, 2004) so hai ảnh trong các ô nhỏ, ở đây là ô 8 × 8 điểm ảnh, dịch mỗi lần 4 điểm, trên độ sáng. Mỗi ô kết hợp ba yếu tố: độ sáng trung bình có khớp không, độ tương phản có khớp không và hoa văn có khớp không. Kết quả lấy trung bình trên toàn ảnh: 1 là giống hệt. Vì mắt nhạy với cấu trúc bị vỡ hơn là với một độ lệch đều, SSIM thường bám sát điều người xem nhận ra hơn PSNR.
Kết quả đo
| Phiên bản | Dung lượng | PSNR | SSIM |
|---|---|---|---|
| JPEG q95, mặc định (4:2:0) | 92 KB | 26,32 dB | 0,9976 |
| JPEG q85, mặc định | 53 KB | 26,13 dB | 0,9945 |
| JPEG q75, mặc định | 40 KB | 25,81 dB | 0,9907 |
| JPEG q50, mặc định | 27 KB | 24,92 dB | 0,9826 |
| JPEG q25, mặc định | 19 KB | 24,00 dB | 0,9663 |
| JPEG q95, không lấy mẫu thưa (4:4:4) | 158 KB | 45,23 dB | 0,9977 |
| JPEG q75, không lấy mẫu thưa | 70 KB | 33,89 dB | 0,9910 |
| WebP q75 | 27 KB | 26,08 dB | 0,9915 |
Có hai điểm nổi bật.
PSNR gần như không đổi từ chất lượng 95 xuống 25 với thiết lập mặc định (26,3 xuống 24,0 dB), trong khi tệp nhỏ đi gần năm lần. SSIM giảm rõ hơn, từ 0,998 xuống 0,966, và khớp với điều bạn thấy bằng thanh trượt: ở q25 có khối vuông dọc mép hình, ở q95 thì không.
Lấy mẫu màu thưa chi phối PSNR. JPEG thường lưu màu ở nửa độ phân giải mỗi chiều (4:2:0), vì mắt phân biệt độ sáng tốt hơn màu sắc nhiều. Với ảnh cực kỳ rực màu này, riêng việc đó đã tốn khoảng 19 dB: q95 đạt 26,32 dB khi lấy mẫu thưa và 45,23 dB khi không. SSIM, đo trên độ sáng, gần như bằng nhau trong hai trường hợp (0,9976 so với 0,9977). Không số nào sai: mép màu thật sự mềm hơn, còn độ sáng thật sự được giữ nguyên. Với ảnh chụp thông thường ảnh hưởng nhỏ hơn nhiều, nhưng nó giải thích nhiều trường hợp "PSNR thấp mà nhìn vẫn ổn".
Dùng chế độ xem khác biệt
Con số chỉ tóm tắt; ảnh khác biệt cho thấy chỗ nào. Nó tô đen điểm ảnh giống nhau và tô xám chỗ khác nhau, khuếch đại bốn lần. Với JPEG q75, khác biệt bám theo mọi mép sắc của hình (gợn và khối), còn vùng phẳng vẫn đen. Với ảnh chụp bạn sẽ thấy điều tương tự quanh tóc, chữ và lá cây. Nếu khác biệt nằm ở chỗ không ai nhìn, mức nén vẫn ổn dù con số nói gì.
Cách chọn chất lượng thực tế
- Xuất ba phiên bản bằng bộ công cụ ảnh, ví dụ chất lượng 85, 75 và 60.
- Mở ảnh gốc và từng phiên bản trong công cụ so sánh ảnh. Phóng to 2× vào khuôn mặt, chữ và dải màu trơn, những chỗ nén hỏng đầu tiên.
- Giữ phiên bản nhỏ nhất mà bạn không thấy khác biệt bằng thanh trượt ở mức 100%. Tạm coi SSIM từ 0,98 trở lên thường an toàn; dưới 0,95 thì xem kỹ.
- Xem mức giảm dung lượng công cụ hiển thị. Với ảnh thử, JPEG q75 mặc định nhỏ hơn bản PNG 87%; xuống q50 tiết kiệm thêm 13 KB nhưng phải trả bằng khác biệt thấy được.
Những lỗi hay gặp
- Chỉ nhìn PSNR. Nó có thể đứng yên khi khối vuông xuất hiện, và giảm vì thay đổi màu không ai thấy.
- So ở kích thước khác. Ảnh thu nhỏ che mất lỗi nén. Hãy so ở 100% hoặc phóng to, ở kích thước người xem sẽ thấy.
- So với "ảnh gốc" đã bị nén. Hãy đo với bản tốt nhất bạn có, lý tưởng là PNG hoặc tệp từ máy ảnh.
- Nén đi nén lại. Mỗi lần lưu JPEG thêm sai số; hãy sửa từ bản gốc và xuất một lần.
- Quên định dạng. Ở đây WebP q75 nhỏ hơn JPEG q50 mà SSIM tốt hơn (0,9915 so với 0,9826). Nếu nơi nhận hỗ trợ, đó thường là lựa chọn tốt hơn.
Tóm lại
SSIM cho biết cấu trúc có còn nguyên không, PSNR cho biết giá trị có còn nguyên không, và ảnh khác biệt cho biết chỗ nào không còn. Dùng cả ba, quyết định ở kích thước ảnh sẽ được xem, và để dung lượng tệp làm tiêu chí cuối.