Skip to main content

Không gian màu - Color space

Bài viết này cung cấp kiến thức cơ bản về một số không gian màu được sử dụng để biểu diễn ảnh như RGB, HSV,... và cách thức chuyển đổi giữa các không gian màu này.

1. Không gian màu Red-Green-Blue (RGB)

Không gian màu RGB tạo ra tất cả các màu bằng cách pha trộn 3 màu cơ bản là đỏ (red), xanh lá (green), và xanh dương (blue). Đây là một không gian màu được sử dụng rất phổ biến trong máy tính.

Nguồn gốc: Chắc hẳn mọi người sẽ có thắc mắc rằng từ đâu có ý tưởng pha trộn màu sắc và tại sao 3 kênh màu đỏ, xanh lá và xanh dương được chọn làm các kênh màu cơ bản.

Hình ở trên thể hiện một thí nghiệm vật lý về tán sắc ánh sáng. Khi chiếu một tia sáng trắng qua lăng kính, ánh sáng sẽ bị phân tách thành các màu tương ứng với từng bước sóng thành phần. Hiện tượng tán sắc này tương tự như cầu vồng, xảy ra khi trời mưa (giọt mưa đóng vai trò lăng kính) nhưng vẫn có ánh sáng mặt trời chiếu qua (đóng vai trò ánh sáng trắng).

Các dải màu qua lăng kính ở thí nghiệm vật lý trên được ghi lại và vẽ trên một bảng màu quay vòng. Nghĩa là, bắt đầu bằng màu đỏ, vàng, xanh lá, lam, xanh dương, tím và quay trở lại đỏ. Dải màu này được gọi là quang phổ ánh sáng, minh họa bằng hình sau:

Cách thức pha trộn màu: Tùy tỉ lệ pha trộn khác nhau ta sẽ có các màu khác nhau. Trong máy tính, tỉ lệ pha trộn được quy định bằng khoảng giá trị từ 0 đến 255, tương ứng từ thấp nhất đến cao. Ví dụ:

  • Để tạo màu vàng, nhìn trên bảng quang phổ ta thấy màu vàng là điểm ngay chính giữa hai màu đỏ và xanh lá. Suy ra, ta sẽ pha trộn với tỉ lệ 255 đỏ, 255 xanh lá và 0 xanh dương. Như vậy, màu vàng được biểu diễn bằng RGB(255,255,0)\text{RGB}(255, 255, 0).
  • Để tạo màu lam, nhìn trên bảng quan phổ ta thấy màu lam nằm ngay chính giữa hai màu xanh lá và xanh dương. Suy ra, ta sẽ pha trộn với tỉ lệ 0 đỏ, 255 xanh lá, 255 xanh dương. Như vậy, màu vàng được biểu diễn bằng RGB(0,255,255)\text{RGB}(0, 255, 255).

Một cách tổng quát, ta hoàn toàn có thể tạo được các màu khác trong thế giới bằng cách phối hợp đồng thời cả ba màu này.

Tại sao phải là ba kênh màu Đỏ, Xanh lá và Xanh dương: Thực tế ta có thể chọn 3 màu khác chứ không nhất thiết phải chọn ba màu này. Tuy nhiên, các màu đỏ, xanh lá và xanh dương nằm ở các bước sóng mà mắt người có thể nhìn thấy được và ở các vị trí đầu, giữa và cuối cách đều nhau trên dải quang phổ. Điều này giúp cho việc trộn các màu sắc được dễ dàng hơn.

Các kênh màu đỏ, xanh lá và xanh dương cũng đồng thời đại diện cho các tông màu nóng, sáng và lạnh. Nếu như mỗi kênh màu này có thể phối hợp với các tỉ lệ từ 02550-255, thì ta sẽ có tất cả 2563=16.777.216256^3=16.777.216 màu! Quá đủ để chúng ta dùng để vẽ và biểu diễn hình ảnh rồi phải không.

Một số màu sắc đặc biệt khác có thể biểu diễn bằng ba màu cơ bản trên như: đen RGB(0,0,0)\text{RGB}(0,0,0), trắng RGB(255,255,255)\text{RGB}(255,255,255), hồng RGB(255,75,200)\text{RGB}(255,75,200).

2. Không gian màu Hue-Saturation-Value (HSV)

Không gian màu HSV tạo ra tất cả các màu bằng cách phối hợp các thông tin về màu sắc (hue), độ bão hòa màu (saturation) và ánh sáng (value).

Nguồn gốc: việc biểu diễn màu sắc bằng 3 màu sắc cơ bản đỏ, xanh lá và xanh dương mặc dù vẫn có thể tạo ra rất nhiều màu sắc khác nhau nhưng xét về yếu tố cảm nhận trực quan của con người thì rất khó để phối màu. Cụ thể,

  • Ta muốn tạo màu vàng với sắc độ nhạt hơn, ta sẽ tăng giảm các màu R, G, B như thế nào?
  • Ta muốn tạo màu vàng với ánh sáng tối hơn, ta sẽ tăng giảm các màu R, G, B như thế nào?

Hình ảnh sau minh họa cùng một màu trên bức tường nhưng có hai độ sáng khác tại hai thời điểm chụp khác nhau.

Về không gian màu HSV gồm 3 kênh màu:

  • H (Hue): biểu diễn loại màu sắc trong vòng tròn quang phổ với đơn vị đo là góc có giá trị thuộc khoảng [0,179][0,179].
  • S (Saturation): biểu diễn mức độ bão hòa màu với mức độ thuộc khoảng [0,255][0,255].
  • V (hay B) (Value hay Bright): biểu diễn độ sáng của màu với dải giá trị thuộc khoảng [0,255][0,255].

Các kênh màu thuộc hệ kênh màu HSVHSV có đặc điểm khác với RGBRGB vì có thêm vùng màu và độ bão hòa nên mô tả màu sắc một cách tự nhiên hơn. Quan sát hình ta có thể thấy được hệ kênh màu HSV như một hình nón khi giá trị của độ sáng bằng 0 thì điểm ảnh là màu đen, còn độ bão hòa màu bằng 0 thì điểm ảnh sẽ màu trắng.

3. Tình huống sử dụng

Không gian màu RGB thường được sử dụng trong việc biểu diễn ảnh trên máy tính. Các giá trị màu trên máy tính thường được lưu bằng bộ ba giá trị R, G, B tại mỗi điểm ảnh.

Trong khi đó, không gian màu HSV thường được ứng dụng nhiều vào chỉnh sửa hình ảnh do gần gũi với cách cảm nhận màu sắc của con người. Cụ thể là, khi trao đổi về việc chọn lựa màu sắc, đầu tiên ta sẽ chọn loại màu sắc cơ bản, sau đó thay đổi mức độ bão hòa (hay cường động màu từ nhạt đến đậm). Cuối cùng là điều chỉnh ánh sáng của màu từ tối đến sáng.

4. Chuyển đổi không gian màu với thư viện OpenCV

Không gian màu HSV và RGB có thể dễ dàng chuyển đổi qua lại với nhau nhờ sự hỗ trợ của thư viện OpenCV.

4.1 Thư viện OpenCV

Thư viện OpenCV (Open Computer Vision) là thư viện phổ biến trong lĩnh vực thị giác máy tính. Vì thư viện OpenCV được viết bằng C/C++ và hỗ trợ với nhiều interface khác nhau (Python, Java và C++) nên việc sử dụng rất thuận tiện trên nhiều nền tảng khác nhau.

Cài đặt thư viện: ta sử dụng lệnh sau trên môi trường Linux, Mac hoặc Anaconda trên Windows (đảm bảo rằng lệnh pip có thể chạy được).

pip install opencv-python

4.2 Thay đổi kênh màu

Thao tác chuyển đổi hệ kênh màu trong thư viện OpenCV:

#Khai báo thư viện
import cv2
#Nhập vào dữ liệu là 1 bức ảnh
bgr_img=cv2.imread(r"Đường\dẫn\đến\ảnh.png")
#đổi sang kênh màu HSV
hsv_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2HSV)

Lưu ý: Trong thư viện OpenCV, mặc định khi load ảnh từ file hoặc video sẽ lưu bằng không gian màu Blue-Green-Red(BGR) chứ không phải Red-Green-Blue (RGB) như mình thường nghĩ. Do đó tham số chuyển đổi không gian màu trong ví dụ trên phải là cv2.COLOR_BGR2HSV chứ không phải cv2.COLOR_RGB2HSV.

Các tham số:

  • cvtColor: hàm chuyển đổi kênh màu.
  • bgr_img: kiểu dữ liệu numpy.array lưu ảnh đầu vào ở không gian màu BGR.
  • hsv_img: kiểu numpy.array lưu kết quả trả về.
  • COLOR_BGR2HSV: Đổi từ kênh màu BGR sang HSV. Ngoài macro này ta còn có một số giá trị khác tương ứng với việc chuyển đổi giữa các kênh khác như: COLOR_BGR2RGB, COLOR_BGR2GRAY,...

Tổng kết

Qua bài viết này bạn có thể hiểu hơn về nguồn gốc của hai không gian màu được sử dụng phổ biến nhất hiện nay là RGB và HSV. Hơn thế nữa, các bạn có thể hiểu được khi nào thì sử dụng hệ RGB, khi nào sử dụng hệ HSV. Cuối cùng, các bạn có thể biết cách chuyển đổi qua lại giữa các kênh màu sử dụng thư viện OpenCV.

Tác giả: Phạm Văn Nghĩa