JPEG. Thuật toán nén

Xin chào lần nữa! Tôi tìm thấy bài viết này được viết lại vào tháng 2019 năm XNUMX. Đây là phần tiếp theo của series bài viết về WAVE và JPEG tại đây 1. Ấn phẩm này sẽ bao gồm thông tin về thuật toán mã hóa hình ảnh và toàn bộ định dạng.

Một chút lịch sử

Một muỗng canh bài viết Wikipedia:

JPEG (Nhóm chuyên gia chụp ảnh chung) là một trong những định dạng đồ họa raster phổ biến được sử dụng để lưu trữ ảnh và các hình ảnh tương tự.

Tiêu chuẩn này được Nhóm chuyên gia chụp ảnh chung phát triển vào năm 1991 để nén hình ảnh hiệu quả.

Làm thế nào để hình ảnh chuyển từ raw sang JPEG?

Một số người nghĩ rằng ảnh JPEG là dữ liệu thô được nén bằng phương pháp Huffman, nhưng điều này không đúng. Trước khi nén điều khiển, dữ liệu sẽ di chuyển một chặng đường dài.

Đầu tiên, mô hình màu được thay đổi từ RGB sang YCbCr. Thậm chí còn có một thuật toán đặc biệt cho việc này - đây. Y không được chạm vào vì nó chịu trách nhiệm về độ sáng và sự thay đổi của nó sẽ dễ nhận thấy.

Điều đầu tiên cần làm với hình ảnh là "làm mỏng" (lấy mẫu phụ). Nói một cách dễ hiểu: một mảng pixel 2x2 được lấy, sau đó lấy Cb và Cr - giá trị trung bình của từng thành phần YCbCr của 4 pixel này. Vì thế, chúng tôi đã giành được 6 byte, thay vì 4 Y, 4 Cb, 4 Cr, chúng ta có 4 Y và cùng Cb và Cr cho mỗi chúng (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Ở tỷ lệ 2x2, nén tổn hao với tỷ lệ nén 2:1 nghe có vẻ chắc chắn. Điều này áp dụng cho toàn bộ hình ảnh. Và như vậy - họ đã giảm được một nửa kích thước. Và chúng ta có thể sử dụng kỹ thuật này nhờ khả năng nhận biết màu sắc của mình. Một người sẽ dễ dàng nhận thấy sự khác biệt về độ sáng chứ không phải về màu sắc nếu nó được tính trung bình trên một khối pixel nhỏ. Việc làm mỏng cũng có thể được thực hiện theo đường thẳng, 4 pixel theo chiều ngang và chiều dọc. Tùy chọn đầu tiên được sử dụng thường xuyên hơn. Nếu chất lượng hình ảnh là quan trọng thì phép thập phân sẽ không được thực hiện.
Hình ảnh minh họa trực quan về việc làm mỏng (Habr không cho phép tôi chèn ảnh gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Phần chính của việc chuẩn bị

Dkp

Bây giờ đến phần khó nhất và cần thiết nhất. Toàn bộ hình ảnh được chia thành các khối 8x8 (tô được sử dụng nếu độ phân giải không phải là bội số của cạnh khối).

Bây giờ áp dụng cho từng khối DCT (Biến đổi Cosine rời rạc). Trong phần này, mọi thứ không cần thiết đều được loại bỏ khỏi hình ảnh. Sử dụng DCT, bạn cần hiểu liệu một khối nhất định (8×8) có mô tả bất kỳ phần đơn điệu nào của hình ảnh hay không: bầu trời, bức tường; hoặc nó chứa cấu trúc phức tạp (tóc, biểu tượng, v.v.). Điều hợp lý là 64 pixel có màu tương tự có thể được mô tả chỉ bằng 1, bởi vì kích thước khối đã được biết đến. Quá nhiều cho việc nén: 64 đến 1.

DCT biến khối thành quang phổ và khi số đọc thay đổi mạnh, hệ số trở nên dương và quá trình chuyển đổi càng sắc nét thì đầu ra sẽ càng cao. Ở nơi hệ số cao hơn, hình ảnh hiển thị sự chuyển đổi rõ ràng về màu sắc và độ sáng, ở nơi thấp hơn - những thay đổi yếu (mịn) về giá trị của các thành phần YCbCr trong khối.

Lượng tử hóa

Cài đặt nén đã được áp dụng ở đây. Mỗi hệ số trong mỗi ma trận 8x8 được chia cho một số nhất định. Nếu bạn không làm giảm chất lượng hình ảnh sau tất cả các sửa đổi của nó thì số chia sẽ là một. Nếu bộ nhớ mà bức ảnh này chiếm giữ quan trọng hơn đối với bạn thì số chia sẽ lớn hơn 1 và thương sẽ được làm tròn. Hóa ra sau khi làm tròn, bạn thường nhận được rất nhiều số không.

Lượng tử hóa được thực hiện để tạo ra khả năng nén lớn hơn. Sau đây là ví dụ về lượng tử hóa đồ thị y = sin(x):

JPEG. Thuật toán nén

Nén

Đầu tiên chúng ta duyệt ma trận theo mô hình zig-zag:

JPEG. Thuật toán nén

Chúng ta nhận được một mảng một chiều với các số. Chúng tôi thấy rằng có rất nhiều số không trong đó, chúng có thể được loại bỏ. Để làm điều này, thay vì một chuỗi gồm nhiều số 1, chúng ta nhập 1 số 3 và sau đó là một số chỉ số của chúng trong chuỗi. Bằng cách này bạn có thể đặt lại kích thước của toàn bộ mảng về XNUMX/XNUMX. Và sau đó chúng ta chỉ cần nén mảng này bằng phương pháp Huffman và ghi nó vào chính tệp đó.

P P P P P R R R R R R R R R R R R R R R R R R

Mọi nơi. Giống như PNG, JPEG được sử dụng trong máy ảnh, hệ điều hành (như logo công ty, biểu tượng ứng dụng, hình thu nhỏ) và trong tất cả các khu vực có thể cần lưu trữ hình ảnh một cách hiệu quả.

Đầu ra

Hiện tại, kiến ​​thức về JPEG hiện chỉ có giá trị cho mục đích giáo dục, bởi vì nó đã được tích hợp sẵn ở mọi nơi và được tối ưu hóa bởi nhiều nhóm người, nhưng tảng đá của khoa học vẫn còn ngon.

nguồn

Bài viết về YCbCr trên Wikipedia
Bài viết trên Wikipedia về JPEG
Đôi nét về PrEP từ bài viết Pikabu
Bài viết trên Wikipedia về PrEP

Nguồn: www.habr.com

Thêm một lời nhận xét