Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Phát hiện màu cụ thể (màu xanh dương) dùng OpenCV với Python?


Đối với nhiều người, xử lý ảnh có vẻ đáng sợ và khó khăn nhưng thực tế không khó như nhiều người nghĩ. Trong hướng dẫn này, ta sẽ làm phát hiện màu cơ bản trong OpenCV với Python.

Màu làm việc trên máy tính như thế nào?

Chúng ta biểu diễn màu trên máy tính bằng không gian màu (color-space) hoặc mô hình màu, về cơ bản mô tả dải màu dưới dạng các tuple số.

Thay vì đi sâu vào từng màu, ta thảo luận hai color-space phổ biến nhất: RGB (Red, Green, Blue) và HSV (Hue, Saturation, Value).

RGB mô tả màu như tuple ba thành phần. Mỗi thành phần nhận giá trị 0-255, trong đó (0, 0, 0) là đen và (255, 255, 255) là trắng. Ví dụ, để hiển thị pixel xanh dương thuần túy, R=0, G=0, B=255.

Một vài ví dụ màu trong RGB:

Màu Giá trị RGB
Đỏ 255, 0, 0
Cam 255, 128, 0
Hồng 255, 153, 255

Với HSV, pixel cũng dùng 3 tham số nhưng là Hue, Saturation và Value. Khác với RGB, HSV không dùng màu gốc để biểu diễn pixel. Thay vào đó, dùng hue (sắc độ) - màu hoặc sắc thái của pixel.

Saturation (độ bão hòa) là cường độ màu, saturation 0 là không màu, 255 là cường độ tối đa. Value cho biết màu sáng hay tối đến mức nào.

Phát hiện đúng màu

Trước tiên, tải ảnh sẽ làm việc:

Phát hiện màu cụ thể (màu xanh dương) dùng OpenCV với Python?

Bây giờ bắt đầu phần thú vị. Mở trình soạn thảo/IDE Python yêu thích và bắt đầu.

import cv2 import numpy as np import imutils img = cv2.imread('color2.jpg')

Hai dòng đầu import thư viện. Dòng 3 import imutils giúp resize ảnh và tìm dải màu. Dòng 4 mở ảnh.

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

Chuyển ảnh sang HSV vì HSV giúp tách biệt cường độ khỏi màu.

lower_range = np.array([110,50,50]) upper_range = np.array([130,255,255])

Định nghĩa giới hạn dưới và trên của màu xanh dương muốn phát hiện. Để tìm giới hạn này, dùng script range-detector trong thư viện imutils. Đưa giá trị vào mảng NumPy.

mask = cv2.inRange(hsv, lower_range, upper_range)

Tạo mask với màu xanh dương chỉ định. Mask đơn giản đại diện cho một phần cụ thể của ảnh. Ở đây, ta kiểm tra qua ảnh HSV, tìm màu nằm giữa lower-range và upper-range. Khu vực khớp sẽ được gán cho biến mask.

cv2.imshow('image', img) cv2.imshow('mask', mask) while(True):    k = cv2.waitKey(5) & 0xFF    if k == 27:       break cv2.destroyAllWindows()

Cuối cùng, hiển thị ảnh gốc và mask cạnh nhau để thấy sự khác biệt. Nếu muốn hiểu 0xFF trong code hãy đọc thêm. Code chờ user nhấn 'Esc' để thoát và dọn dẹp cửa sổ.

Chương trình hoàn chỉnh

import cv2 import numpy as np import imutils img = cv2.imread('color2.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower_range = np.array([110,50,50]) upper_range = np.array([130,255,255]) mask = cv2.inRange(hsv, lower_range, upper_range) cv2.imshow('image', img) cv2.imshow('mask', mask) while(True):    k = cv2.waitKey(5) & 0xFF    if k == 27:       break cv2.destroyAllWindows()

Kết quả

Phát hiện màu cụ thể (màu xanh dương) dùng OpenCV với Python?

Ở trên, thấy vài đen đen trong mask, đó là nhiễu (noise).