Cách hoạt động của định dạng JPEG

Hình ảnh JPEG có mặt khắp nơi trong cuộc sống số của chúng ta, nhưng đằng sau lớp vỏ nhận thức này là các thuật toán loại bỏ các chi tiết mà mắt người không thể nhận biết được. Kết quả là chất lượng hình ảnh cao nhất ở kích thước tệp nhỏ nhất - nhưng chính xác thì tất cả hoạt động như thế nào? Hãy xem chính xác những gì mắt chúng ta không nhìn thấy!

Cách hoạt động của định dạng JPEG

Thật dễ dàng để có được khả năng gửi ảnh cho bạn bè và không phải lo lắng về thiết bị, trình duyệt hoặc hệ điều hành họ đang sử dụng - nhưng không phải lúc nào cũng như vậy. Vào đầu những năm 1980, máy tính có thể lưu trữ và hiển thị hình ảnh kỹ thuật số, nhưng có rất nhiều ý tưởng trái ngược nhau về cách tốt nhất để thực hiện điều này. Bạn không thể chỉ gửi hình ảnh từ máy tính này sang máy tính khác và hy vọng nó sẽ hoạt động.

Để giải quyết vấn đề này, một ủy ban gồm các chuyên gia từ khắp nơi trên thế giới đã được tập hợp vào năm 1986 với tên gọi "Nhóm chuyên gia nhiếp ảnh chung» (Nhóm chuyên gia chụp ảnh chung, JPEG), được thành lập như một nỗ lực chung giữa Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) và Ủy ban Kỹ thuật Điện Quốc tế (IEC), hai tổ chức tiêu chuẩn quốc tế có trụ sở tại Geneva, Thụy Sĩ.

Một nhóm người tên là JPEG đã tạo ra tiêu chuẩn nén ảnh kỹ thuật số JPEG vào năm 1992. Bất cứ ai đã từng sử dụng Internet chắc hẳn đã từng gặp phải hình ảnh được mã hóa JPEG. Đây là cách phổ biến nhất để mã hóa, gửi và lưu trữ hình ảnh. Từ các trang web, email đến mạng xã hội, JPEG được sử dụng hàng tỷ lần mỗi ngày—hầu như mỗi khi chúng ta xem một hình ảnh trực tuyến hoặc gửi nó. Nếu không có JPEG, trang web sẽ ít màu sắc hơn, chậm hơn và có thể có ít hình ảnh mèo hơn!

Bài viết này nói về cách giải mã hình ảnh JPEG. Nói cách khác, cần những gì để chuyển đổi dữ liệu nén được lưu trữ trên máy tính thành hình ảnh xuất hiện trên màn hình. Điều này đáng để biết, không chỉ vì điều quan trọng là phải hiểu công nghệ chúng ta sử dụng hàng ngày mà còn vì bằng cách mở khóa các mức nén, chúng ta tìm hiểu thêm về nhận thức và tầm nhìn cũng như những chi tiết mà mắt chúng ta nhạy cảm nhất.

Ngoài ra, chơi với hình ảnh theo cách này rất thú vị.

Cách hoạt động của định dạng JPEG

Nhìn vào bên trong JPEG

Trên máy tính, mọi thứ được lưu trữ dưới dạng một chuỗi số nhị phân. Thông thường, các bit này, số 0 và số 1, được nhóm thành nhóm 8 để tạo thành byte. Khi bạn mở hình ảnh JPEG trên máy tính, một thứ gì đó (trình duyệt, hệ điều hành, thứ gì đó khác) phải giải mã byte, khôi phục hình ảnh gốc dưới dạng danh sách các màu có thể hiển thị.

Nếu bạn tải về ngọt ngào này bức ảnh của một con mèo và mở nó bằng trình soạn thảo văn bản, bạn sẽ thấy một loạt ký tự không mạch lạc.

Cách hoạt động của định dạng JPEG
Ở đây tôi đang sử dụng Notepad++ để kiểm tra nội dung của tệp, vì các trình soạn thảo văn bản thông thường như Notepad trên Windows sẽ làm hỏng tệp nhị phân sau khi lưu và nó sẽ không còn đáp ứng định dạng JPEG nữa.

Việc mở một hình ảnh trong trình xử lý văn bản sẽ khiến máy tính bối rối, giống như bạn khiến não bộ bối rối khi dụi mắt và bắt đầu nhìn thấy những đốm màu!

Những điểm bạn nhìn thấy được gọi là phốt pho, và không phải là kết quả của sự kích thích ánh sáng hay ảo giác do tâm trí tạo ra. Chúng xảy ra vì não của bạn cho rằng bất kỳ tín hiệu điện nào trong dây thần kinh thị giác đều truyền tải thông tin về ánh sáng. Bộ não cần đưa ra những giả định này vì không có cách nào để biết liệu tín hiệu là âm thanh, hình ảnh hay thứ gì khác. Tất cả các dây thần kinh trong cơ thể đều truyền các xung điện giống hệt nhau. Bằng cách tạo áp lực lên mắt, bạn gửi các tín hiệu không phải hình ảnh mà kích hoạt các cơ quan thụ cảm của mắt, tín hiệu mà não bạn diễn giải - trong trường hợp này là không chính xác - là một thứ gì đó trực quan. Bạn thực sự có thể thấy áp lực!

Thật buồn cười khi nghĩ về việc máy tính giống với bộ não như thế nào, nhưng đó cũng là một phép so sánh hữu ích để minh họa ý nghĩa của dữ liệu - dù được truyền qua cơ thể bằng dây thần kinh hay được lưu trữ trên máy tính - phụ thuộc vào cách giải thích của nó. Tất cả dữ liệu nhị phân được tạo thành từ 0 và 1, các thành phần cơ bản có thể truyền tải bất kỳ loại thông tin nào. Máy tính của bạn thường tìm ra cách diễn giải chúng bằng cách sử dụng các manh mối như phần mở rộng tệp. Bây giờ chúng tôi buộc nó phải hiểu chúng dưới dạng văn bản, vì đó là điều mà trình soạn thảo văn bản mong đợi.

Để hiểu cách giải mã JPEG, chúng ta cần xem chính các tín hiệu gốc - dữ liệu nhị phân. Điều này có thể được thực hiện bằng cách sử dụng trình soạn thảo thập lục phân hoặc trực tiếp trên trang web bài viết gốc! Có một hình ảnh, bên cạnh đó trong trường văn bản là tất cả các byte của nó (ngoại trừ tiêu đề), được trình bày ở dạng thập phân. Bạn có thể thay đổi chúng và tập lệnh sẽ mã hóa lại và tạo ra hình ảnh mới một cách nhanh chóng.

Cách hoạt động của định dạng JPEG

Bạn có thể học được nhiều điều chỉ bằng cách chơi với trình soạn thảo này. Ví dụ: bạn có thể cho biết các pixel được lưu trữ theo thứ tự nào không?

Điều kỳ lạ ở ví dụ này là việc thay đổi một số số không ảnh hưởng gì đến ảnh cả, nhưng chẳng hạn, nếu bạn thay số 17 bằng 0 ở dòng đầu tiên thì bức ảnh sẽ bị hỏng hoàn toàn!

Cách hoạt động của định dạng JPEG

Những thay đổi khác, chẳng hạn như thay thế số 7 trên dòng 1988 bằng số 254, thay đổi màu sắc, nhưng chỉ thay đổi các pixel tiếp theo.

Cách hoạt động của định dạng JPEG

Có lẽ điều kỳ lạ nhất là một số con số không chỉ thay đổi màu sắc mà còn cả hình dạng của hình ảnh. Thay đổi 70 ở dòng 12 thành 2 và nhìn vào hàng trên cùng của hình ảnh để hiểu ý tôi.

Cách hoạt động của định dạng JPEG

Và cho dù bạn sử dụng hình ảnh JPEG nào, bạn sẽ luôn tìm thấy những mẫu cờ bí ẩn này khi chỉnh sửa byte.

Khi chơi với trình chỉnh sửa, thật khó để hiểu cách tạo lại ảnh từ các byte này, vì nén JPEG bao gồm ba công nghệ khác nhau, được áp dụng tuần tự theo các cấp độ. Chúng ta sẽ nghiên cứu từng vấn đề riêng biệt để khám phá hành vi bí ẩn mà chúng ta đang thấy.

Ba mức độ nén JPEG:

  1. Lấy mẫu màu.
  2. Biến đổi và lấy mẫu cosin rời rạc.
  3. Chạy mã hóa độ dài, đồng bằng и Huffman

Để bạn hình dung về mức độ nén, hãy lưu ý rằng hình ảnh trên thể hiện 79 số, tương đương khoảng 819 KB. Nếu chúng tôi lưu trữ nó mà không nén, mỗi pixel sẽ yêu cầu ba số - cho các thành phần màu đỏ, xanh lục và xanh lam. Con số này sẽ lên tới 79 số, hoặc xấp xỉ. 917KB. Do nén JPEG, tệp cuối cùng đã giảm hơn 700 lần!

Trên thực tế, hình ảnh này có thể được nén nhiều hơn nữa. Dưới đây là hai hình ảnh cạnh nhau - ảnh bên phải đã được nén xuống 16 KB, tức là nhỏ hơn 57 lần so với phiên bản không nén!

Cách hoạt động của định dạng JPEG

Nếu để ý kỹ, bạn sẽ thấy những hình ảnh này không hề giống nhau. Cả hai đều là hình ảnh có nén JPEG, nhưng hình ảnh bên phải có dung lượng nhỏ hơn nhiều. Nó cũng trông tệ hơn một chút (hãy nhìn vào các ô vuông màu nền). Đó là lý do tại sao JPEG còn được gọi là nén mất dữ liệu; Trong quá trình nén, hình ảnh thay đổi và mất đi một số chi tiết.

1. Lấy mẫu màu

Đây là hình ảnh chỉ áp dụng mức nén đầu tiên.

Cách hoạt động của định dạng JPEG
(Phiên bản tương tác - trong nguyên bản bài viết). Xóa một số sẽ phá hủy tất cả các màu. Tuy nhiên, nếu loại bỏ chính xác sáu con số thì hầu như không có tác dụng gì đối với hình ảnh.

Bây giờ các con số đã dễ giải mã hơn một chút. Đây gần như là một danh sách màu đơn giản, trong đó mỗi byte thay đổi chính xác một pixel, nhưng đồng thời nó đã có kích thước bằng một nửa hình ảnh không nén (sẽ chiếm khoảng 300 KB ở kích thước giảm này). Bạn có thể đoán tại sao không?

Bạn có thể thấy rằng những con số này không đại diện cho các thành phần màu đỏ, xanh lục và xanh lam tiêu chuẩn, vì nếu thay thế tất cả các số bằng số 0, chúng ta sẽ có được hình ảnh màu xanh lục (chứ không phải màu trắng).

Cách hoạt động của định dạng JPEG

Điều này là do các byte này tượng trưng cho Y (độ sáng),

Cách hoạt động của định dạng JPEG

Cb (độ xanh tương đối),

Cách hoạt động của định dạng JPEG

và hình ảnh Cr (đỏ tương đối).

Cách hoạt động của định dạng JPEG

Tại sao không sử dụng RGB? Rốt cuộc, đây là cách hầu hết các màn hình hiện đại hoạt động. Màn hình của bạn có thể hiển thị bất kỳ màu nào, bao gồm đỏ, lục và lam, với cường độ khác nhau cho từng pixel. Màu trắng có được bằng cách bật cả ba ở độ sáng tối đa và màu đen bằng cách tắt chúng.

Cách hoạt động của định dạng JPEG

Điều này cũng rất giống với cách hoạt động của mắt con người. Cơ quan cảm nhận màu sắc trong mắt chúng ta được gọi là "hình nón“, và được chia thành ba loại, mỗi loại nhạy hơn với các màu đỏ, lục hoặc lam [Hình nón loại S nhạy với màu xanh tím (S từ tiếng Anh - phổ sóng ngắn), M -type - trong các phần màu xanh lục-vàng (M từ tiếng Anh Trung bình - sóng trung bình) và loại L - trong các phần màu vàng-đỏ (L từ tiếng Anh - sóng dài) của quang phổ. Sự hiện diện của ba loại tế bào hình nón này (và các tế bào hình que, nhạy cảm với phần màu xanh ngọc lục bảo của quang phổ) mang lại cho con người khả năng nhận biết màu sắc. / khoảng. dịch.]. Gậy, một loại tế bào cảm quang khác trong mắt chúng ta, có khả năng phát hiện những thay đổi về độ sáng, nhưng nhạy hơn nhiều với màu sắc. Mắt chúng ta có khoảng 120 triệu tế bào que và chỉ có 6 triệu tế bào hình nón.

Đây là lý do tại sao mắt chúng ta có khả năng phát hiện những thay đổi về độ sáng tốt hơn nhiều so với những thay đổi về màu sắc. Nếu bạn tách màu khỏi độ sáng, bạn có thể loại bỏ một chút màu và không ai nhận thấy điều gì. Lấy mẫu con Chroma là quá trình thể hiện các thành phần màu của hình ảnh ở độ phân giải thấp hơn các thành phần độ chói. Trong ví dụ trên, mỗi pixel có chính xác một thành phần Y và mỗi nhóm bốn pixel riêng lẻ có chính xác một thành phần Cb và một thành phần Cr. Do đó, hình ảnh chứa thông tin màu ít hơn bốn lần so với ảnh gốc.

Không gian màu YCbCr không chỉ được sử dụng trong JPEG. Ban đầu nó được phát minh vào năm 1938 cho các chương trình truyền hình. Không phải ai cũng có TV màu, vì vậy việc tách màu và độ sáng cho phép mọi người nhận được tín hiệu giống nhau và TV không có màu chỉ sử dụng thành phần độ sáng.

Vì vậy, việc xóa một số khỏi trình chỉnh sửa sẽ làm hỏng hoàn toàn tất cả các màu. Các thành phần được lưu trữ dưới dạng YYYY Cb Cr (thực tế không nhất thiết phải theo thứ tự đó - thứ tự lưu trữ được chỉ định trong tiêu đề tệp). Việc loại bỏ số đầu tiên sẽ khiến giá trị đầu tiên của Cb được coi là Y, Cr là Cb và nói chung bạn sẽ có hiệu ứng domino làm chuyển đổi tất cả các màu của hình ảnh.

Đặc tả JPEG không bắt buộc bạn phải sử dụng YCbCr. Nhưng hầu hết các tệp đều sử dụng nó vì nó tạo ra hình ảnh được giảm tần số lấy mẫu tốt hơn RGB. Nhưng bạn không cần phải tin lời tôi. Hãy tự mình xem trong bảng bên dưới mẫu con của từng thành phần riêng lẻ sẽ trông như thế nào trong cả RGB và YCbCr.

Cách hoạt động của định dạng JPEG
(Phiên bản tương tác - trong nguyên bản bài viết).

Việc loại bỏ màu xanh lam không đáng chú ý như màu đỏ hoặc xanh lục. Đó là vì có sáu triệu tế bào hình nón trong mắt bạn, khoảng 64% nhạy cảm với màu đỏ, 32% với màu xanh lá cây và 2% với màu xanh lam.

Việc lấy mẫu xuống của thành phần Y (phía dưới bên trái) được nhìn thấy rõ nhất. Ngay cả một thay đổi nhỏ cũng có thể nhận thấy được.

Việc chuyển đổi hình ảnh từ RGB sang YCbCr không làm giảm kích thước tệp nhưng nó giúp bạn dễ dàng tìm thấy các chi tiết ít nhìn thấy hơn có thể loại bỏ. Nén tổn thất xảy ra ở giai đoạn thứ hai. Nó dựa trên ý tưởng trình bày dữ liệu ở dạng nén hơn.

2. Biến đổi và lấy mẫu cosin rời rạc

Mức độ nén này phần lớn là ý nghĩa của JPEG. Sau khi chuyển đổi màu thành YCbCr, các thành phần được nén riêng lẻ, do đó chúng ta có thể chỉ tập trung vào thành phần Y. Và đây là hình dạng của các byte thành phần Y sau khi áp dụng lớp này.

Cách hoạt động của định dạng JPEG
(Phiên bản tương tác - trong nguyên bản bài viết). Trong phiên bản tương tác, việc nhấp vào một pixel sẽ cuộn trình chỉnh sửa đến dòng đại diện cho nó. Hãy thử xóa các số ở cuối hoặc thêm một vài số 0 vào một số nhất định.

Thoạt nhìn, có vẻ như khả năng nén rất tệ. Có 100 pixel trong một hình ảnh và phải mất 000 con số để biểu thị độ sáng của chúng (thành phần Y)—điều đó còn tệ hơn cả việc không nén gì cả!

Tuy nhiên, hãy lưu ý rằng hầu hết những con số này đều bằng 26. Hơn nữa, tất cả các số 000 ở cuối dòng có thể bị xóa mà không làm thay đổi hình ảnh. Còn lại khoảng 4 số và con số này ít hơn gần XNUMX lần!

Cấp độ này chứa đựng bí mật của các mẫu cờ. Không giống như các hiệu ứng khác mà chúng tôi đã thấy, sự xuất hiện của các mẫu này không phải là trục trặc. Chúng là những khối xây dựng của toàn bộ hình ảnh. Mỗi dòng của trình soạn thảo chứa chính xác 64 số, hệ số biến đổi cosine rời rạc (DCT) tương ứng với cường độ của 64 mẫu duy nhất.

Những mẫu này được hình thành dựa trên biểu đồ cosine. Đây là một số trong số chúng trông như thế nào:

Cách hoạt động của định dạng JPEG
8 trên 64 tỷ lệ cược

Dưới đây là hình ảnh hiển thị tất cả 64 mẫu.

Cách hoạt động của định dạng JPEG
(Phiên bản tương tác - trong nguyên bản bài viết).

Những mẫu này có tầm quan trọng đặc biệt vì chúng tạo thành nền tảng của hình ảnh 8x8. Nếu bạn không quen với đại số tuyến tính, điều này có nghĩa là bất kỳ hình ảnh 8x8 nào cũng có thể được tạo từ 64 mẫu này. DCT là quá trình chia hình ảnh thành các khối 8x8 và chuyển đổi từng khối thành tổ hợp của 64 hệ số này.

Có vẻ như thật kỳ diệu khi bất kỳ hình ảnh nào cũng có thể bao gồm 64 mẫu cụ thể. Tuy nhiên, điều này cũng giống như khi nói rằng bất kỳ địa điểm nào trên Trái đất đều có thể được mô tả bằng hai con số - vĩ độ và kinh độ [biểu thị bán cầu / xấp xỉ. dịch.]. Chúng ta thường nghĩ bề mặt Trái đất là hai chiều nên chúng ta chỉ cần hai con số. Một hình ảnh 8x8 có 64 chiều nên chúng ta cần 64 số.

Vẫn chưa rõ điều này giúp chúng tôi như thế nào về mặt nén. Nếu chúng ta cần 64 số để thể hiện một hình ảnh 8x8, tại sao điều này lại tốt hơn việc chỉ lưu trữ 64 thành phần độ sáng? Chúng tôi làm điều này vì lý do tương tự như việc chúng tôi đã biến ba số RGB thành ba số YCbCr: nó cho phép chúng tôi loại bỏ các chi tiết tinh vi.

Thật khó để biết chính xác chi tiết nào bị loại bỏ ở giai đoạn này vì JPEG áp dụng DCT cho các khối 8x8. Tuy nhiên, không ai cấm chúng ta áp dụng nó vào toàn bộ bức tranh. Đây là giao diện của DCT đối với thành phần Y được áp dụng cho toàn bộ bức tranh:

Cách hoạt động của định dạng JPEG

Hơn 60 con số có thể được loại bỏ từ cuối mà hầu như không có thay đổi đáng chú ý nào đối với bức ảnh.

Cách hoạt động của định dạng JPEG

Tuy nhiên, lưu ý rằng nếu chúng ta loại bỏ năm số đầu tiên thì sự khác biệt sẽ rõ ràng.

Cách hoạt động của định dạng JPEG

Những con số ở đầu biểu thị những thay đổi tần số thấp trong hình ảnh mà mắt chúng ta thu nhận rõ nhất. Các số ở cuối biểu thị những thay đổi ở tần số cao khó nhận thấy hơn. Để “nhìn thấy những gì mắt không thể nhìn thấy”, chúng ta có thể tách biệt những chi tiết có tần số cao này bằng cách loại bỏ 5000 số đầu tiên.

Cách hoạt động của định dạng JPEG

Chúng tôi thấy tất cả các khu vực của hình ảnh nơi xảy ra sự thay đổi lớn nhất từ ​​​​pixel này sang pixel khác. Đôi mắt của con mèo, bộ râu của nó, chiếc chăn bông và bóng ở góc dưới bên trái nổi bật. Bạn có thể tiến xa hơn bằng cách loại bỏ 10 số đầu tiên:

Cách hoạt động của định dạng JPEG

20 000:

Cách hoạt động của định dạng JPEG

40 000:

Cách hoạt động của định dạng JPEG

60 000:

Cách hoạt động của định dạng JPEG

Những chi tiết tần số cao này sẽ bị JPEG loại bỏ trong giai đoạn nén. Không có sự mất mát khi chuyển đổi màu sắc sang hệ số DCT. Mất mát xảy ra ở bước lấy mẫu, nơi các giá trị tần số cao hoặc gần bằng 57 bị loại bỏ. Khi bạn giảm chất lượng lưu JPEG, chương trình sẽ tăng ngưỡng cho số lượng giá trị bị loại bỏ, điều này làm giảm kích thước tệp nhưng làm cho hình ảnh có nhiều pixel hơn. Đó là lý do tại sao hình ảnh ở phần đầu tiên, nhỏ hơn 8 lần, trông như thế này. Mỗi khối 8xXNUMX được biểu thị bằng hệ số DCT ít hơn nhiều so với phiên bản chất lượng cao hơn.

Bạn có thể tạo ra một hiệu ứng thú vị như truyền hình ảnh dần dần. Bạn có thể hiển thị một hình ảnh mờ ngày càng chi tiết hơn khi ngày càng có nhiều hệ số được tải xuống.

Đây, chỉ để cho vui thôi, là những gì bạn nhận được chỉ bằng cách sử dụng 24 số:

Cách hoạt động của định dạng JPEG

Hoặc chỉ 5000:

Cách hoạt động của định dạng JPEG

Rất mờ, nhưng bằng cách nào đó có thể nhận ra!

3. Chạy mã hóa độ dài, delta và Huffman

Cho đến nay, tất cả các giai đoạn nén đều bị mất mát. Ngược lại, giai đoạn cuối cùng diễn ra mà không bị lỗ. Nó không xóa thông tin nhưng làm giảm đáng kể kích thước tệp.

Làm thế nào bạn có thể nén một cái gì đó mà không bỏ đi thông tin? Hãy tưởng tượng chúng ta mô tả một hình chữ nhật màu đen đơn giản 700 x 437 như thế nào.

JPEG sử dụng 5000 số cho việc này nhưng có thể đạt được kết quả tốt hơn nhiều. Bạn có thể tưởng tượng một sơ đồ mã hóa có thể mô tả một hình ảnh như vậy với ít byte nhất có thể không?

Sơ đồ tối thiểu mà tôi có thể nghĩ ra sử dụng bốn: ba để biểu thị một màu và thứ tư để cho biết màu đó có bao nhiêu pixel. Ý tưởng biểu diễn các giá trị lặp lại theo cách cô đọng này được gọi là mã hóa độ dài chạy. Nó không mất dữ liệu vì chúng ta có thể khôi phục dữ liệu được mã hóa về dạng ban đầu.

Tệp JPEG có hình chữ nhật màu đen lớn hơn 4 byte - hãy nhớ rằng ở cấp DCT, tính năng nén được áp dụng cho các khối 8x8 pixel. Do đó, ở mức tối thiểu, chúng ta cần một hệ số DCT cho mỗi 64 pixel. Chúng tôi cần một số vì thay vì lưu trữ một hệ số DCT theo sau là 63 số XNUMX, mã hóa độ dài chạy cho phép chúng tôi lưu trữ một số và chỉ ra rằng "tất cả các số khác đều là số XNUMX".

Mã hóa Delta là một kỹ thuật trong đó mỗi byte chứa sự khác biệt so với một số giá trị, thay vì giá trị tuyệt đối. Do đó, việc chỉnh sửa một số byte nhất định sẽ thay đổi màu của tất cả các pixel khác. Ví dụ, thay vì lưu trữ

12 13 14 14 14 13 13 14

Chúng ta có thể bắt đầu với 12 và sau đó chỉ cần cho biết chúng ta cần cộng hoặc trừ bao nhiêu để có được số tiếp theo. Và trình tự này trong mã hóa delta có dạng:

12 1 1 0 0 -1 0 1

Dữ liệu được chuyển đổi không nhỏ hơn dữ liệu gốc nhưng dễ nén hơn. Áp dụng mã hóa delta trước khi mã hóa độ dài chạy có thể giúp ích rất nhiều trong khi vẫn nén không mất dữ liệu.

Mã hóa Delta là một trong số ít kỹ thuật được sử dụng bên ngoài khối 8x8. Trong số 64 hệ số DCT, một hệ số đơn giản là hàm sóng không đổi (màu đặc). Nó biểu thị độ sáng trung bình của từng khối đối với các thành phần độ sáng hoặc độ xanh trung bình đối với các thành phần Cb, v.v. Giá trị đầu tiên của mỗi khối DCT được gọi là giá trị DC và mỗi giá trị DC được mã hóa delta so với các giá trị trước đó. Do đó, việc thay đổi độ sáng của khối đầu tiên sẽ ảnh hưởng đến tất cả các khối.

Bí ẩn cuối cùng vẫn còn đó: làm thế nào mà việc thay đổi số ít lại phá hỏng hoàn toàn toàn bộ bức tranh? Cho đến nay, các mức nén vẫn chưa có những đặc tính như vậy. Câu trả lời nằm ở tiêu đề JPEG. 500 byte đầu tiên chứa siêu dữ liệu về hình ảnh - chiều rộng, chiều cao, v.v. và chúng tôi chưa làm việc với chúng.

Nếu không có tiêu đề thì gần như không thể (hoặc rất khó) giải mã JPEG. Có vẻ như tôi đang cố gắng mô tả bức tranh cho bạn và tôi đang bắt đầu phát minh ra các từ để truyền đạt ấn tượng của mình. Phần mô tả có lẽ sẽ khá cô đọng, vì tôi có thể nghĩ ra những từ có chính xác ý nghĩa mà tôi muốn truyền tải, nhưng đối với những người khác thì chúng sẽ không có ý nghĩa.

Nghe có vẻ ngu ngốc, nhưng đó chính xác là những gì xảy ra. Mỗi hình ảnh JPEG được nén bằng các mã dành riêng cho nó. Từ điển mã được lưu trữ trong tiêu đề. Kỹ thuật này được gọi là mã Huffman và từ vựng được gọi là bảng Huffman. Trong tiêu đề, bảng được đánh dấu bằng hai byte - 255 và sau đó là 196. Mỗi thành phần màu có thể có bảng riêng.

Những thay đổi đối với bảng sẽ ảnh hưởng hoàn toàn đến bất kỳ hình ảnh nào. Một ví dụ điển hình là thay đổi dòng thứ 15 thành 1.

Cách hoạt động của định dạng JPEG

Điều này xảy ra vì các bảng chỉ định cách đọc từng bit riêng lẻ. Cho đến nay chúng ta chỉ làm việc với số nhị phân ở dạng thập phân. Nhưng điều này che giấu chúng ta sự thật rằng nếu bạn muốn lưu trữ số 1 trong một byte, nó sẽ trông giống như 00000001, vì mỗi byte phải có chính xác XNUMX bit, ngay cả khi chỉ cần một trong số chúng.

Điều này có thể gây lãng phí không gian lớn nếu bạn có nhiều số nhỏ. Mã Huffman là một kỹ thuật cho phép chúng ta nới lỏng yêu cầu rằng mỗi số phải chiếm 8 bit. Điều này có nghĩa là nếu bạn thấy hai byte:

234 115

Sau đó, tùy thuộc vào bảng Huffman, đây có thể là ba số. Để trích xuất chúng, trước tiên bạn cần chia chúng thành các bit riêng lẻ:

11101010 01110011

Sau đó chúng ta nhìn vào bảng để tìm ra cách nhóm chúng lại. Ví dụ: đây có thể là sáu bit đầu tiên (111010) hoặc 58 ở dạng thập phân, tiếp theo là năm bit (10011) hoặc 19 và cuối cùng là bốn bit cuối cùng (0011) hoặc 3.

Vì vậy, rất khó để hiểu được byte ở giai đoạn nén này. Byte không đại diện cho những gì chúng có vẻ. Tôi sẽ không đi sâu vào chi tiết làm việc với bảng trong bài viết này, nhưng vật liệu về vấn đề này trực tuyến là đủ.

Một thủ thuật thú vị mà bạn có thể thực hiện với kiến ​​thức này là tách tiêu đề khỏi JPEG và lưu trữ riêng biệt. Trên thực tế, hóa ra chỉ có bạn mới có thể đọc được tệp. Facebook thực hiện điều này để làm cho các tệp thậm chí còn nhỏ hơn.

Những gì khác có thể làm là thay đổi bảng Huffman một chút. Đối với những người khác nó sẽ trông giống như một bức tranh bị hỏng. Và chỉ có bạn mới biết cách kỳ diệu để khắc phục nó.

Hãy tóm tắt lại: vậy cần những gì để giải mã JPEG? Cần thiết:

  1. Trích xuất (các) bảng Huffman từ tiêu đề và giải mã các bit.
  2. Trích xuất các hệ số biến đổi cosine rời rạc cho từng thành phần màu sắc và độ chói cho mỗi khối 8x8, thực hiện các phép biến đổi mã hóa delta và độ dài chạy nghịch đảo.
  3. Kết hợp các cosin dựa trên hệ số để thu được giá trị pixel cho mỗi khối 8x8.
  4. Chia tỷ lệ các thành phần màu nếu việc lấy mẫu con được thực hiện (thông tin này nằm trong tiêu đề).
  5. Chuyển đổi giá trị YCbCr thu được cho mỗi pixel thành RGB.
  6. Hiển thị hình ảnh trên màn hình!

Công việc nghiêm túc chỉ vì xem một bức ảnh với một con mèo! Tuy nhiên, điều tôi thích ở nó là nó cho thấy công nghệ JPEG lấy con người làm trung tâm như thế nào. Nó dựa trên đặc thù nhận thức của chúng tôi, cho phép chúng tôi đạt được khả năng nén tốt hơn nhiều so với các công nghệ thông thường. Và bây giờ chúng ta đã hiểu cách JPEG hoạt động, chúng ta có thể tưởng tượng cách những công nghệ này có thể được chuyển giao sang các lĩnh vực khác. Ví dụ: mã hóa delta trong video có thể giúp giảm đáng kể kích thước tệp vì thường có toàn bộ khu vực không thay đổi từ khung này sang khung khác (ví dụ: nền).

Mã được sử dụng trong bài viết, đang mở và chứa hướng dẫn về cách thay thế ảnh bằng ảnh của bạn.

Nguồn: www.habr.com

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