Đơn vị cơ bản của một bức ảnh là điểm ảnh (pixel), mỗi điểm ảnh có thể được biểu diễn bằng n bytes dưới các hệ màu khác nhau và tùy theo định dạng mà ta có bố cục, cách sắp xếp các thành phần trong điểm ảnh sẽ khác nhau. Việc chuyển đổi giữa các hệ màu thông thường được thực hiện thông qua các phép biến đổi ma trận. Trong bài viết này tôi sẽ giới thiệu phương thức chuyển đổi từ điểm ảnh 24 bits RGB sang điểm ảnh YCbCr.
Để thực hiện chuyển từ RGB sang YCbCr có nhiều công thức theo chuẩn khác nhau, theo chuẩn ITU-R BT.601 sẽ như sau:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Với chiều ngược lại được thực hiện :
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
Hai công thức này được trình bày trong cuốn sách "Video Demystified" của Keith Jack (ISBN 1-878707-09-4). Trong cả hai công thức trên giá trị RGB đều trong khoảng từ [0 - 255], Y nằm trong khoảng [16 - 235], U / V thuộc giá trị [16 - 240]. Thật ra đây không phải là công thức duy nhất cho quá trình chuyển đổi, nó có nhiều người anh em khác tùy, theo mục đích sử dụng và thiết bị cũng như công nghệ hiển thị hình ảnh mà có hiệu quả tối ưu khác nhau, hay nói cách khác có nhiều chuẩn quy định cho sự chuyển đổi qua lại giữa hai hệ màu. Ví dụ nếu theo ITU-R BT.709 ta sẽ có công thức:
Hoặc trong tình huống nếu muốn sử dụng vùng giá trị tối đa cho 8 bit màu [0 - 255] với YCbCr ta có thể tiếp cận công thức:
Trong bài viết này tôi không định đẩy bạn dính vào sự rối rắm liên quan tới các bộ quy định và chuẩn mực mà chỉ muốn giúp trình bày một cái phổ biến và từ đó bạn đọc dễ dàng mở rộng hoặc thay đổi về sau trong ứng dụng cụ thể.
Hoặc trong tình huống nếu muốn sử dụng vùng giá trị tối đa cho 8 bit màu [0 - 255] với YCbCr ta có thể tiếp cận công thức:
Trong bài viết này tôi không định đẩy bạn dính vào sự rối rắm liên quan tới các bộ quy định và chuẩn mực mà chỉ muốn giúp trình bày một cái phổ biến và từ đó bạn đọc dễ dàng mở rộng hoặc thay đổi về sau trong ứng dụng cụ thể.
Ở trên tôi đã trình bày việc chuyển đổi giữa các thành phần của hai hệ màu, tuy nhiên nếu chỉ có bấy nhiêu hầu như chẳng hữu ích gì. Vì khi ta nói tới hệ màu, ta phải nói tới điểm ảnh và cấu trúc tạo nên một ảnh, khi đó nó mới có tính ứng dụng thực tiễn. Khi ta nói tới YUV ta hiểu đơn giản tổng quan về một hệ màu có 3 thành phần, nhưng phân phối các thành phần đó vào điểm ảnh ra sao, đặt trong cấu trúc chung một ảnh như thế nào thì đó lại là vấn đề cần phải nói thêm rất nhiều. Dưới đây tôi trình bày 3 loại khác nhau của ảnh YUV đó là YUV422I, YUV420SP và YUV420P. Do có rất nhiều tài liệu, cũng như cái sự ba cha bảy mệ của YUV nên xin vui lòng đừng thắc mắc tại sao bạn đọc ở đâu đó có chút khác biệt về tên hay khái niệm, chỉ cần hãy đặt niềm tin ở Bioz và IEEV.
Trước khi đi vào chi tiết tôi sẽ nói với các bạn 2 từ khóa rất quan trọng, hầu hết các kiểu cấu tạo ảnh YUV đều được phân vào 1 trong hai nhóm ứng với các từ khóa này. Đầu tiên là Packed, đó là khái niệm được dùng khi các thành phần của hệ màu được trộn vào nhau, nằm lẫn vào nhau trong bộ nhớ để hình thành nên các điểm ảnh. Khái niệm thứ hai là Planar, nó được sử dụng khi các thành phần màu của điểm ảnh được chia ra, đặt trong các vùng nhớ riêng biệt mà ta có thể dễ dàng lấy ra từng thành phần màu trong toàn bộ ảnh. Mọi thứ có vẻ hơi mù mờ, nhưng không sao, khi đi vào chi tiết 3 loại ảnh phía dưới vui lòng liên hệ với những gì bạn đã đọc ở đây, vấn đề sẻ trở nên sáng tỏ.
1. YUV422I: thuộc loại Packed, mỗi điểm ảnh có 16 bit, cứ 2 thành phần Y sẽ có 1 thành phần U và V. Từng cặp 2 điểm ảnh một sẽ đi chung với nhau. Hình dưới minh họa cho phân phối cụ thể của định dạng này với một ảnh 6 x 4.
2. YUV 420P: thuộc loại Planar, mỗi điểm ảnh có 12 bit, cứ 4 thành phần Y sẽ có 1 thành phần U và một thành phần V. Hình dưới minh họa cho phân phối cụ thể của định dạng này với một ảnh 6 x 4:
3. YUV 420SP: giống như loại YUV 420P, ngoại trừ U và V không nằm tách bạch mà đan vào nhau theo thứ tự như sau
U1V1U2V2U3V3
U4V4U5V5U6V6
Ví dụ ứng dụng:
Nhằm sử dụng công thức chuyển đổi ở trên, kết hợp với kiến thức về định dạng ảnh YUV đã trình bày, tôi sẽ gởi đến các bạn một hàm viết bằng C được trích trong thư viện VnSLib của S3LAB, nhằm giải quyết yêu cầu chuyển đổi một ảnh RGB với định dạng điểm ảnh tuần tự: R1G1B1 R2G2B2 R3G3B3 ... sang ảnh YUV 420P:
-- BIOZ --