Top Ad unit 728 × 90

Latest news

recent

Từ RGB sang Đa mức xám (Grayscale)

Đơ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. 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ừ ảnh 24 bits RGB sang ảnh 8bits đa mức xám. Để thực hiện yêu cầu trên, thông thường ta sử dụng một trong những công thức sau đây, áp dụng cho từng điểm ảnh [x, y]:
Ix, y  = 0.3086 * Redx, y + 0.6094 * Greenx, y + 0.0820 * Bluex, y 
Ix, y = 0.299 * Redx, y + 0.587 * Greenx, y + 0.114 * Bluex, y

Chú ý rằng giá trị mỗi điểm ảnh Ix,y hay còn gọi là cường độ sáng (Luminance Intensity) trong ảnh đa mức xám tính được là tổng trọng số khác nhau của mỗi thành phần màu trong hệ màu RGB. Một trong những lý do của việc này là nếu chúng ta sử dụng cùng trọng số, ví dụ (R + G + B) / 3 thì màu đỏ, màu xanh nước biển hay màu xanh da trời sẽ có cùng mức xám sau khi chuyển đổi. Mặt khác theo khoa học đã chứng minh thì mắt người nhạy cảm hơn với thành phần màu xanh lá cây và màu đỏ so với xanh da trời.

Việc triển khai trong C/C++ của công thức trên khá đơn giản như sau với một ảnh có định dạng điểm ảnh liên tục (interleaved color) RGBRGB:

for ( i = 0; i < imgSize; i += 3 )
{    
    out[i] = (unsigned char)(0.299*in[i] + 0.587*in[i+1] + 0.114*in[i+2] + 0.5);
}

Vì việc thực hiện phép nhân trong miền số nguyên thì nhanh hơn rất nhiều trong miền số thực nên công thức trên được viết lại trong miền số nguyên như sau:

Ix, y = ( 2 * Redx, y + 5 * Greenx, y + 1 * Bluex, y ) / 8

 Cộng với việc thay thế các phép chia và nhân bằng toán tử shift tốc độ của quá trình tính toán sẽ được đẩy lên một cách hiệu quả. Dưới đây là mã nguồn cho quá trình nâng cấp này:

int iTmp;
for ( i = 0; i < imgSize; i += 3 )
{    
    iTmp = in[i] << 1;                   
    iTmp += in[i+1] << 2 + in[i+1];      
    iTmp += in[i+2];                     
    out[i] = (unsigned char)(iTmp>> 3); 
}

Và hãy cùng ngắm người đẹp lena trong kết quả


Để hiểu sâu hơn về tối ưu và phương pháp ánh xạ giữa các miền số học vui lòng xem thêm các bài viết trong mục kỹ thuật triển khai.

Lưu ý: trong thực hành, không phải lúc nào thứ tự của 3 bytes trong 1 điểm ảnh cũng là R - G - B, đôi khi thứ tự này có thể là B - G - R.

Binh Nguyen - Bioz
Từ RGB sang Đa mức xám (Grayscale) Reviewed by Bioz Nguyen on 1:21:00 PM Rating: 5
All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.