JPEG: Tận dụng giới hạn mắt người, tạo ra những tấm hình cực nhẹ cho kỷ nguyên internet

P.W
9/10/2025 15:56Phản hồi: 12
EditEdit
JPEG: Tận dụng giới hạn mắt người, tạo ra những tấm hình cực nhẹ cho kỷ nguyên internet
Dài quá ngại đọc:

  • Mắt người nhạy sáng hơn là nhạy màu, đó là kiến thức cơ bản để phát triển chuẩn nén hình ảnh JPEG
  • JPEG chuyển đổi giá trị RGB sang ánh sáng và giảm thiểu dữ liệu màu sắc trong những tấm hình
  • Sử dụng các bước tính toán giá trị thông tin từng điểm ảnh, giảm hoặc loại giá trị những chi tiết mắt người không phân biệt được, rồi sau đó nén lại chúng vài lần
  • Kết quả là những tấm hình lớn, nhưng dung lượng chưa đầy 1MB cho kỷ nguyên internet

JPEG giờ là một định dạng dữ liệu quá quen thuộc với anh em. Đây là một trong những kỳ công thầm lặng của kỹ thuật khoa học máy tínhkhoa học nhiếp ảnh hiện đại, một tiêu chuẩn nén hình ảnh được sinh ra từ sự kết hợp giữa toán học, tâm lý học và trực giác thẩm mỹ. JPEG không chỉ thu nhỏ dung lượng mỗi tấm hình, nó còn mã hóa sự hiểu biết về cách đôi mắt của con người nhìn.

Về cốt lõi, JPEG là một kỹ thuật nén mất dữ liệu (lossy), một giải pháp để cân bằng giữa kích thước tệp và độ trung thực hình ảnh có thể chấp nhận được trong mắt của chúng ta. Để đạt được điều này đòi hỏi một sự pha trộn hấp dẫn giữa tri giác con người, xử lý tín hiệu tinh tế và năng lực kỹ thuật khéo léo.

2024-01-26-image-6-j.webp

Thời điểm JPEG được chuẩn hóa đầu thập niên 1990, nó được phát triển vì con người cần tới nó. Định dạng hình ảnh bitmap (BMP) mà Microsoft phát triển tạo ra những tấm hình dung lượng rất lớn, gây khó khăn cho máy tính để lưu, tải và truyền dẫn chúng, trong những ngày đầu internet hiện diện. Nhưng ngay cả bây giờ, khi đường truyền internet đo bằng băng thông gigabit mỗi giây, thì JPEG vẫn được lựa chọn.

Điện toán, và tri giác con người


Tất cả các tương tác của chúng ta với công nghệ đều thông qua các giác quan vật lý của chúng ta. Các giác quan này tạo thành tuyến đầu của tương tác giữa người và máy tính. Điều kỳ diệu nằm ở cách các kỹ sư và nhà thiết kế đã học cách khai thác và tận dụng những đặc điểm khác thường của tri giác, những lối tắt sinh lý, để làm cho máy móc cảm thấy trực quan, thậm chí là giống con người.

Ví dụ, hãy xem xét thị giác. Đôi mắt chúng ta không phải một chiếc máy ảnh hoàn hảo. Bên trong chúng là các cảm biến sinh học lộn xộn với những giới hạn và điểm mù. Khác biệt từ 30 đến 60 khung hình mỗi giây thường đủ mượt mà để đánh lừa mắt của anh em. Thành ra mới có chuyện trước đây từng có người nói “mắt không nhìn được quá 60 FPS”, dù nó chẳng đúng chút nào cả.

Một chỉ số hữu ích khác liên quan đến thị lực là độ sáng, thường được đo bằng nits. Một "nit" là độ sáng của một cây nến chiếu sáng trên một bề mặt diện tích 1 mét vuông.

Bằng cách hiểu một số giới hạn vật lý của mắt người, chúng ta có thể sử dụng thông tin này để nén thông tin trong một bức ảnh một cách định lượng và mạnh mẽ, mà không làm suy giảm nhận thức về chất lượng hình ảnh.

2024-01-26-image-j-1100.webp

JPEG là một định dạng nén lossy. Điều này có nghĩa là thông tin nhất định sẽ bị loại bỏ (theo một cách có tính toán) để cải thiện tỷ lệ nén tệp dữ liệu, trong khi vẫn cố gắng làm xáo trộn tri giác thị giác ở mức tối thiểu.

Một số định dạng hình ảnh khác, như PNG, là lossless. Điều này có nghĩa là, với hình PNG, không có thông tin nào bị mất trong quá trình lưu trữ hình ảnh, điều này thường dẫn đến kích thước hình ảnh lớn hơn nhiều. Ví dụ, một hình ảnh kích thước 2592 x 1944 được lưu ở định dạng PNG sẽ chiếm khoảng 15 MB, trong khi cùng một hình ảnh được lưu ở JPEG sẽ chỉ là khoảng 0.75 MB, nhỏ hơn khoảng 20 lần và hầu như không thể nhận thấy khác biệt trong chi tiết và màu sắc bằng mắt thường.

Quảng cáo



RGB vs YCbCr


Câu hỏi được đặt ra, với JPEG, làm thế nào để loại bỏ dữ liệu một cách an toàn, đảm bảo chất lượng tấm hình hiển thị trên các thiết bị điện tử? Các nhà khoa học đã nghiên cứu ảo ảnh quang học trong một thời gian, và đã phát hiện ra rằng mắt người nhạy cảm với độ sáng hơn là màu sắc.

Ví dụ nhé, anh em nhìn hình dưới, anh em nghĩ màu của ô A hay ô B đậm hơn?

[​IMG]

Thật ra hai ô này cùng một màu đấy:

2024-01-22-image-2-p.webp

Quảng cáo


Từ máy ảnh ra tệp dữ liệu không nén lưu trong thẻ nhớ của anh em, mỗi pixel được mã hóa bằng ba giá trị: Đỏ, Xanh lục và Xanh lam (định dạng RGB). Nếu chúng ta sử dụng 8 bit (tức là 1 byte) để đại diện cho mỗi màu, chúng ta cần 24 bit cho mỗi pixel để mã hóa màu.

Thật ra định dạng màu RGB cũng được phát triển và ứng dụng dựa trên cách đôi mắt con người hoạt động. Gần như mọi màu sắc đều có thể chia thành ba giá trị màu đỏ, xanh lục và xanh lam. Mắt của chúng ta cũng thu nhận và giải mã những màu sắc ấy tốt hơn.

2024-01-21-image.gif

Để tận dụng thông tin rằng mắt người nhạy cảm hơn với độ sáng, chúng ta chuyển sang một mã hóa thay thế, được gọi là định dạng YCbCr:

  • Y (Luminance, hoặc "luma" hoặc "brightness"): Đại diện cho độ sáng.
  • Cb (Chroma Blue): Đại diện cho thành phần màu xanh.
  • Cr (Chroma Red): Đại diện cho thành phần màu đỏ.

Định dạng màu sắc này là một phép ánh xạ công thức từ định dạng RGB sang định dạng thay thế giúp thu thập rõ ràng thông tin về độ sáng và màu sắc. Lưu ý rằng bước này vẫn chưa có sự mất mát nào (chưa). Với sự tách biệt này, chúng ta có thể thực hiện bước nén JPEG đầu tiên: Chroma subsampling, hay lấy mẫu màu phụ.

Chroma subsampling


Đây là khúc loại bỏ thông tin hình ảnh một cách cẩn trọng. Ý tưởng ở đây là, loại bỏ thông tin bằng cách lấy mẫu màu của các điểm ảnh.

Để thực hiện lấy mẫu màu phụ, lấy một khối pixel (ví dụ 8x8) và trích xuất các thành phần màu (Cb và Cr). Sau đó, đối với mỗi thành phần màu, lấy một nhóm phụ 2x2 pixel, và chuyển đổi tất cả chúng thành một màu duy nhất. Ví dụ, có thể chọn pixel trên cùng bên trái và áp dụng màu đó cho 3 pixel còn lại trong khối 2x2.

2024-01-22-image.gif

Kết quả là, chúng ta bắt đầu với ba kênh (Y, Cb, và Cr), và kết thúc bằng việc giữ nguyên thông tin trong một kênh đầy đủ (Y) và loại bỏ một nửa thông tin trong hai kênh còn lại (Cb và Cr). Bằng cách đi từ 3 kênh xuống 1 + ½ + ½ = 2 kênh, chúng ta hiện đang ở mức 66% kích thước hình ảnh ban đầu.

Nếu muốn lấy mẫu mạnh tay hơn, ¼ lượng thông tin sẽ bị bỏ đi, tấm hình từ 3 kênh xuống 1 + ¼ + ¼ = 1.5 kênh, tức là 50% tấm hình gốc.

Biến thông tin màu sắc và ánh sáng thành dữ liệu


Bước kế tiếp, chúng ta muốn chuyển đổi dữ liệu hình ảnh từ miền không gian sang miền tần số bước sóng ánh sáng. Bằng cách xem xét một hàng các pixel và vẽ biểu đồ các giá trị của chúng, chúng ta có thể hình dung màu sắc của chúng dưới dạng tín hiệu số.

2024-01-22-image-4-p-1100 copy.jpg

  • Sự thay đổi nhanh chóng giữa các pixel được dán nhãn là tín hiệu tần số cao.
  • Sự thay đổi chậm chạp giữa các pixel được dán nhãn là tín hiệu tần số thấp.

Thị giác con người ít nhạy cảm hơn với các chi tiết tần số cao. Hơn nữa, hầu hết các bức ảnh thường có nhiều thành phần tần số thấp hơn là tần số cao. Chúng ta có thể tận dụng những kiến thức này để khéo léo loại bỏ các phần tần số cao của hình ảnh.

Biến đổi Cosine rời rạc - DCT


Để loại bỏ phần hình ảnh tần số cao của một bức hình, sẽ cần tới một bước gọi là DCT - Discrete Cosine Transform. Bước này chuyển đổi một tập hợp các giá trị pixel (trong miền không gian) thành "tổng các điểm mẫu từ sóng cosine".

Tại sao lại dùng DCT, sao lại là sóng cosine? Ba lý do được đưa ra:

  • Sóng cosine có vài tham số có thể sử dụng mã hóa thông tin
  • Biên độ sóng cosine có thể dùng làm trọng số cho một tần số cụ thể
  • Dịch chuyển của sóng cosine có thể dùng mã hóa độ sáng từng điểm ảnh

Với ba tham số kể trên, thông tin của mọi điểm ảnh sẽ được biên dịch trong miền cosine, với các giá trị toán học. So sánh với biến đổi Fourier, biến đổi Cosine cho phép nén dữ liệu gọn gàng hơn.

2024-01-22-image-5-p.webp

Nói lại kiến thức ở trên, hình ảnh thường có sự mất cân bằng lớn giữa thông tin tần số cao và tần số thấp, và con người nhạy cảm hơn với thông tin tần số thấp? DCT sẽ kết hợp thông tin về tần số thấp lại với nhau và dễ dàng tách chúng khỏi tần số cao (dữ liệu mà sau đó chúng ta có thể nén ở tỷ suất rất cao).

Ví dụ, để chuyển từ miền không gian của một khối pixel 8x8 sang một khối 8x8 tương ứng trong miền DCT, chúng ta sẽ muốn nắm bắt các hệ số DCT. Về cơ bản, chúng ta muốn biểu diễn tín hiệu 8x8 bằng một tập hợp 64 sóng cosin. Và DCT giúp tính toán mức độ đóng góp của mỗi sóng cosin vào toàn bộ khối.

Những điểm ảnh, màu sắc và độ sáng sẽ biến thành một dãy giá trị hệ số toán học như thế này:

2024-01-22-image-8-p-1100.webp

Với những con số này, hai bước kế tiếp là lượng tử hóa (quantization) và mã hóa (encoding) tấm hình JPEG sẽ diễn ra.

Lượng tử hóa - Quantization


Lượng tử hóa là một thuật ngữ phức tạp liên quan đến việc ánh xạ một tập hợp lớn các giá trị vào một tập hợp nhỏ hơn, thường bao gồm việc làm tròn và/hoặc chia tỷ lệ. Mỗi phần tử trong ma trận DCT 8x8 được chia cho giá trị tương ứng từ một bảng lượng tử hóa 8x8, sau đó làm tròn thành số nguyên gần nhất. Bước này khiến một loạt các giá trị tần số cao (ở góc dưới bên phải của bảng DCT trên đây) trở thành số không.

2024-01-22-image-9-p.webp

Đó chính là bước làm mất dữ liệu khi tạo ra bức hình JPEG.

Nhưng như đã nói, một vài thông tin dữ liệu điểm ảnh tần số cao hoàn toàn có thể loại bỏ mà mắt người khó có thể nhận ra khác biệt. Vả lại cũng không phải lúc nào xem hình trên mạng hay trên điện thoại, anh em cũng có hình RAW để đối chiếu, hoặc cần đối chiếu. Miễn màu sắc trông tự nhiên, là đôi mắt của chúng ta sẽ chấp nhận.

2024-01-22-image-10-p.webp

Các bảng lượng tử hóa thường mạnh tay hơn đối với các kênh màu (chroma) nhằm bảo tồn thành phần độ sáng (luma).

Mã hóa dữ liệu


Tới khúc này, chúng ta sẽ dùng hai kỹ thuật mã hóa: Mã hóa độ dài chạy (Run-length Encoding - RLE) và mã hóa Huffman. Khi đã có bảng DCT được lượng tử hóa từ bước trước, hầu hết các giá trị trong ma trận sẽ là số 0. Điều này cho phép sử dụng kỹ thuật mã hóa RLE, khai thác những giá trị 0 để mã hóa một cách hiệu quả.

Thuật toán JPEG tổ chức các chữ số trong DCT đã được lượng tử hóa theo kiểu zigzag để tối đa hóa số lượng số không liên tiếp ở cuối chuỗi. Ví dụ, một chuỗi dài các số không có thể được viết gọn lại. Thay vì lưu trữ 64 giá trị cho khối 8x8, RLE có thể chỉ cần lưu trữ 17 giá trị.

2024-01-22-image-11-p.webp

Tức là:

  • Thay vì chuỗi trong hình trên tạo ra chuỗi dữ liệu -24, -2, 0, -2, -1, -3, 1, -2, 0, -1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  • Thì với RLE, chuỗi dữ liệu chỉ còn là: { -24, -2, 0, -2, -1, -3, 1, -2, 0, -1, 0, 0, 1, 0, 1, (0, 49) }

Bước kế tiếp phức tạp hơn để nén thêm một lần dữ liệu nữa dựa trên dữ liệu chúng ta có. Cụ thể, nó chuyển đổi mỗi chuỗi thành một bộ ba (triplet) gồm:

  • Số lượng số không đứng trước một giá trị,
  • Số bit cần để mã hóa giá trị c,
  • Giá trị hệ số.

Đó chính là mã hóa Huffman. Nó tận dụng việc các bộ ba giá trị nhất định xuất hiện thường xuyên hơn. Các bộ ba giá trị phổ biến này được tối ưu hóa để sử dụng ít bit dữ liệu hơn. Mã hóa Huffman kết hợp với mã hóa RLE, giúp nén ma trận DCT đã được lượng tử hóa một cách khá hiệu quả. Bước này không mất dữ liệu, vì nó có thể tái tạo chính xác DCT đã được lượng tử hóa.

Cuối cùng là giải nén để hiển thị tấm hình


Bước này khá đơn giản và bao gồm các bước đảo ngược của quá trình nén.

Giải nén bao gồm: diễn giải lại mã hóa Huffman/độ dài chạy để tạo ra ma trận hệ số DCT đã được lượng tử hóa, nhân với ma trận lượng tử hóa để trở lại ma trận DCT "bình thường", tính toán biến đổi cosine rời rạc 2D nghịch đảo, và sau đó cộng 128 vào mỗi mục trong ma trận. Kết quả cuối cùng sẽ là một hình ảnh rất giống, nhưng có một số khác biệt tinh tế vì đây là giải pháp nén mất dữ liệu.

2024-01-22-image-12-p.webp

Vì sao JPEG thành công?


Thành công và sự tuyệt vời của JPEG nằm ở việc chấp nhận sự không hoàn hảo, và sử dụng nó một cách chiến lược. Thay vì bảo tồn mọi pixel, JPEG quyết định điều gì thực sự quan trọng đối với mắt người và loại bỏ phần còn lại.

Thành công của JPEG dựa trên ba kiến thức quan trọng nhất:

  • Không phải tất cả dữ liệu đều được đối xử bình đẳng, nén mất mát dữ liệu có thể là một tính năng, chứ không phải là một lỗi.
  • Hệ thống thị giác con người đầy rẫy các lối tắt. Bằng cách tìm hiểu hệ thống thị giác (ví dụ: luma so với chroma), chúng ta có thể xác định cách thức và nơi để nén.
  • Sự dư thừa là lãng phí. Bằng cách phát hiện các mẫu lặp lại (những chuỗi số không dài) và mã hóa chúng một cách tinh tế, JPEG ép megabyte thành kilobyte mà không làm hỏng độ rõ ràng của hình ảnh.

Các nguyên tắc tương tự được áp dụng ở những nơi khác, như trong cách MP3 thu nhỏ dung lượng các bài hát, hoặc cách H.264, H.265 và AV1 mã hóa hình ảnh chuyển động.
12 bình luận

Xu hướng

Yêu quá
Thấy đuôi file có JPG với JPEG... là 1 phải ko ae?
@Qii Đều là 1
Bác làm 1 bài về WEBP đi, cái định dạng này mới đỉnh, vừa nhẹ, vừa có thể lưu thông tin nền trong suốt giống PNG. Nó đúng là đỉnh cao của hình ảnh internet hiện đại.
@Dr.Son Trong video thì avi < h264 < H265. Google có WebM nhưng không ngon bằng H265 nên không phát triển nữa.
Audio thì mp3 < aac
Google đã xem và tiếp tục push WebP
ngày nay, jpg (mp3....) chúng ta chỉ cảm nhận được giá trị của chúng mỗi khi cá mập cắn cable...
và lúc chúng ta suy nghĩ có nên nâng cấp dung lượng đt/cloud hay không?
Bài viết hay quá anh, mà hình như bây giờ WeBp đang chiếm ưu thế hơn thì phải
Screenshot-20251010-153450-Google.jpg
@Kim L WEBP ưu việt hơn hẳn, ra đời sau rất lâu mà. Nhưng di sản JPG thì vẫn còn lâu mới biến mất. Nói chung là sẽ tồn tại song song.
Ám ảnh môn xử lý tín hiệu số.
Một định dạng khác hiện đại ngày nay là HEIF, HEIC, HEVC (video) nhưng mãi vẫn không phổ biến được mặc dù được hậu thuẫn bởi Apple. Ngay đến điện thoại Samsung chụp ra được HEIF nhưng hỗ trợ không đầy đủ, không up được lên nhiều app, web... Di sản của JPEG vẫn còn lớn lắm.

Xu hướng

Bài mới








  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2025 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: 70 Bà Huyện Thanh Quan, P. Xuân Hoà, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép cung cấp dịch vụ MXH số 134/GP-BVHTTDL, Ký ngày: 30/09/2025