Bitmap
Một bitmap (BMP) về cơ bản là những gì bạn mô tả, một dãy số đại diện cho màu pixel. Ví dụ như một cái gì đó như
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Nén không mất dữ liệu
Bây giờ, hãy xác định một sơ đồ nén. Trong sơ đồ nén của chúng tôi, chúng tôi sẽ có một loạt các cặp số. Ví dụ
3, 1, 1, 0, 7, 1
Bây giờ, điều đầu tiên tôi muốn chỉ ra là lược đồ nén này biểu thị các pixel giống như mảng đầu tiên. Mảng đầu tiên có ba số 1 theo sau là một số 0 và sau đó là 7 số 1. Và đó là những gì chúng tôi đại diện ở đây. Định dạng này ngắn hơn, vì nó đại diện cho nhiều pixel với hai số. Định dạng bitmap phải sử dụng một số cho mỗi pixel.
Rõ ràng đây là một hình ảnh được đơn giản hóa một chút của hình ảnh (ví dụ: nó chỉ là một hàng) và sơ đồ nén. Nhưng hy vọng điều này cho phép bạn xem sơ đồ nén thay đổi định dạng của hình ảnh như thế nào. Đây là cách GIF liên quan đến BMP. GIF sử dụng sơ đồ nén có tên Lempel-Ziv-Welch thay vì sơ đồ đơn giản này.
Những gì chúng tôi đã mô tả ở đây là một sơ đồ nén không mất mát. Một vấn đề với sơ đồ nén không mất dữ liệu là đối với một số đầu vào, dạng được mã hóa có thể dài hơn bản gốc. Ví dụ cho
1, 0, 1, 0, 1
Mã hóa là
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Vâng, đó là vô dụng. Chúng tôi thực hiện đầu vào dài gấp đôi.
Một nén không mất mát khác
Bây giờ, hãy xem xét một sơ đồ nén khác nhau. Trong phần này, chúng tôi sẽ biểu diễn hình ảnh dưới dạng các vòng tròn phủ. Đối với mỗi vòng tròn, chúng tôi sẽ xác định một trung tâm, bán kính và màu sắc.
Bitmap đầu tiên của chúng tôi sẽ trở thành
5, 5, 1, 3, 0, 0
Đây là cùng độ dài với phương pháp nén đầu tiên của chúng tôi.
Và thứ hai của chúng tôi có thể là một trong hai
2, 2, 1, 2, 1, 0, 2, 0, 1
Đây là ba vòng tròn tập trung ở phần tử ở giữa (mà trong máy tính là số 2, vì máy tính bắt đầu đếm bằng 0). Một vòng tròn có bán kính 2 và màu 1. Sau đó, chúng ta thêm một vòng tròn màu 0 và bán kính 1. Cuối cùng, chúng ta có một vòng tròn màu 1 và bán kính 0. Trong các bước, điều này sẽ là
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
Hoặc là
2, 2, 1, 1, 0, 0, 3, 0, 0
Đây là cùng một vòng tròn ban đầu nhưng được bao phủ bởi hai vòng tròn điểm. Trong các bước, nó sẽ là
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Cả hai đều ngắn hơn phiên bản được mã hóa đầu tiên nhưng vẫn dài hơn phiên bản gốc.
Bạn có thể tự hỏi tại sao tôi đang nói về vòng tròn và không phải là phạm vi. Lý do chính là các vòng tròn gần với những gì hình ảnh hai chiều thực sự sử dụng.
Nén tổn thất
Chúng tôi cũng có khái niệm về các chương trình nén mất mát. Các sơ đồ nén không mất dữ liệu này có thể được chuyển trở lại thành mảng bitmap gốc. Đề án nén tổn thất có thể không thể đảo ngược.
Hãy xem xét một phiên bản mất mát của phương pháp vòng tròn của chúng tôi. Trong đó, chúng tôi sẽ sử dụng một quy tắc đơn giản. Chúng tôi sẽ không lưu trữ bất kỳ vòng tròn nào có bán kính nhỏ hơn 1. Vì vậy, trong hai lần mã hóa cuối cùng của chúng tôi, thay vào đó chúng tôi sẽ có
2, 2, 1, 2, 1, 0
và
2, 2, 1
mà chuyển đổi thành pixel một lần nữa là
1, 0, 0, 0, 1
và
1, 1, 1, 1, 1
Phiên bản đầu tiên chỉ dài hơn một yếu tố so với bản gốc. Phiên bản thứ hai ngắn hơn. Cả hai đều hợp lệ, vì vậy thuật toán được tự do phát triển cả hai và chọn cái ngắn hơn.
Chúng tôi mô tả hình ảnh với các quy tắc hạn chế hơn là có chất lượng thấp hơn.
Sự thể hiện hình ảnh này dưới dạng các bộ sưu tập các hình tròn được phủ chồng lên nhau tương tự như cách thức hoạt động của nhóm Các chuyên gia nhiếp ảnh chung hoặc định dạng JPEG . Hình dạng của nó là hình elip chứ không phải hình tròn, nhưng ý tưởng là tương tự nhau. Thay vì phương pháp đơn giản của chúng tôi, nó sử dụng biến đổi cosine rời rạc để mã hóa hình ảnh.
Không giống như GIF, JPEG thực sự là một cách khác để thể hiện hình ảnh. GIF vẫn là pixel. Chúng chỉ được lưu trữ theo một cách khác. JPEG là hình dạng. Để xem JPEG, sau đó chúng tôi chuyển đổi hình dạng thành pixel vì đó là cách màn hình hoạt động. Về lý thuyết, chúng ta có thể phát triển một màn hình không hoạt động theo cách này. Thay vì pixel, nó có thể tạo ra các hình dạng để phù hợp hơn với định dạng JPEG. Tất nhiên, màn hình đó sẽ không thể hiển thị ảnh bitmap. Để hiển thị BMP hoặc GIF, chúng tôi phải chuyển đổi sang JPEG.
Nếu bạn chuyển đổi một GIF tiêu chuẩn, giả sử 300x300 pixel, chuyển đổi nó thành JPEG và giảm chất lượng xuống, các hình dạng cơ sở mà nó sử dụng sẽ hiển thị. Nhiều JPEG tránh các tạo tác này bằng cách bắt đầu với hình ảnh có độ phân giải cao hơn nhiều.
JPEG có tỷ lệ tốt vì chúng là hình dạng chứ không phải pixel. Vì vậy, nếu bạn bắt đầu với một hình ảnh 8000x8000, hãy chuyển đổi nó thành JPEG và hiển thị nó dưới dạng hình ảnh 300x300, phần lớn chi tiết bị mất sẽ bị mất. Nếu bạn đã chuyển đổi bitmap 8000x8000 thành bitmap 300x300 trước rồi sang JPEG, kết quả thường sẽ có chất lượng thấp hơn.
MPEG
Chúng tôi đã nói về hình ảnh tĩnh. Các Moving Picture Experts Group hoặc MPEG định dạng sử dụng cùng một loại nén như JPEG, nhưng nó cũng làm cái gì khác. Mặc dù cách làm video đơn giản là gửi một chuỗi các hình ảnh tĩnh, MPEG thực sự gửi một khung hình, theo sau là một số khung hình liệt kê các thay đổi và hoàn thiện với một khung kết thúc. Bởi vì hầu hết các khung hình tương tự như khung hình trước đó, danh sách các thay đổi thường nhỏ hơn hình ảnh thứ hai.
Chuỗi thường không dài, nói năm khung. Nhưng nó giúp làm cho luồng nhỏ hơn so với nếu không.
Đơn giản hóa
Tôi đã bỏ qua rất nhiều. Hình ảnh của tôi chỉ có hai màu (1 bit), không phải là 256 của hình ảnh 8 bit và chắc chắn không phải là 4.294.967.296 của hình ảnh 32 bit. Ngay cả với hình ảnh 8 bit, lưu ý rằng bạn thường có thể chọn các bảng màu khác nhau cho hình ảnh. Vì vậy, hai bitmap 8 bit có cùng trình tự có thể đại diện cho hình ảnh trông khác nhau (cùng hình dạng nhưng màu sắc khác nhau).
Hình ảnh của tôi là hàng đơn, không phải hai chiều. Hầu hết các hình ảnh sẽ có kích thước hàng cụ thể được lưu trữ, làm cho các mảng hai chiều.
Tôi đã không cố gắng để đại diện cho các mã hóa thực tế ở tất cả. Chúng phức tạp hơn nhiều so với những cái đơn giản mà tôi đã sử dụng. Tôi đã làm điều này bởi vì tôi muốn có thể mô tả các bảng mã trong bài viết này. Tôi không tin rằng tôi có thể giải thích Lempel-Ziv ít hơn nhiều cho việc sàng lọc Lempel-Ziv-Welch phức tạp hơn trong một câu trả lời. Và tôi không hiểu Fourier biến đổi đủ tốt để giải thích chúng ở bất kỳ độ dài nào.
Đây là rất nhiều phiên bản đơn giản hóa của xử lý hình ảnh thực tế. Tuy nhiên, tôi cảm thấy rằng với mục đích giáo huấn, nó dễ hiểu hơn thực tế phức tạp hơn trong khi vẫn đạt được những điểm cốt yếu.