Computer >> Máy Tính >  >> Lập trình >> Python

Phát hiện một màu cụ thể (ở đây là màu xanh lam) bằng OpenCV với Python?

Đối với nhiều người, xử lý ảnh có vẻ là một công việc đáng sợ và khó khăn nhưng nó không quá khó như nhiều người vẫn tưởng. Trong hướng dẫn này, chúng tôi sẽ thực hiện phát hiện màu cơ bản trong openCv với python.

Màu hoạt động như thế nào trên máy tính?

Chúng tôi biểu thị màu sắc trên máy tính theo không gian màu hoặc mô hình màu về cơ bản mô tả dải màu dưới dạng các bộ số.

Thay vì đi theo từng màu, chúng ta sẽ thảo luận về không gian màu phổ biến nhất mà chúng ta sử dụng. I.e. RGB (Đỏ, Xanh lục, Xanh lam) và HSV (Màu sắc, Độ bão hòa, Giá trị).

Về cơ bản, RGB mô tả màu sắc như một bộ ba thành phần. Mỗi thành phần có thể nhận một giá trị từ 0 đến 255, trong đó bộ giá trị (0, 0, 0) đại diện cho màu đen và (255, 255, 255) đại diện cho màu trắng. Ví dụ:nếu chúng tôi hiển thị một pixel màu xanh lam thuần túy trên màn hình, thì giá trị R sẽ là 0, giá trị G sẽ là 0 và giá trị B sẽ là 255.

Dưới đây là một số ví dụ khác về màu sắc trong RGB:

Màu sắc Giá trị RGB
Đỏ 255, 0, 0
Màu cam 255, 128, 0
Màu hồng 255, 153, 255

Với HSV, một pixel cũng được biểu thị bằng 3 tham số nhưng thay vào đó là Hue, Saturation và Value. Tuy nhiên, không giống như RGB, HSV không sử dụng màu chính để đại diện cho một pixel. Thay vào đó, nó sử dụng màu sắc, là màu hoặc bóng của pixel.

Độ bão hòa là cường độ của màu, trong đó độ bão hòa 0 đại diện cho 0 và độ bão hòa 255 là cường độ tối đa. Giá trị sẽ cho biết màu sáng hay tối.

Phát hiện màu phù hợp

Vì vậy, trước tiên chúng ta hãy tải xuống hình ảnh mà chúng tôi sẽ làm việc với,

Phát hiện một màu cụ thể (ở đây là màu xanh lam) bằng OpenCV với Python?

Bây giờ chúng ta đã có hình ảnh màu sắc, chúng ta có thể bắt đầu phần thú vị. Chỉ cần mở trình soạn thảo văn bản python hoặc IDE yêu thích của bạn và bắt đầu.

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

Trong dòng mã trên, hai dòng đầu tiên xử lý tất cả các lần nhập. Trong dòng thứ ba, tôi đang nhập mô-đun imutils, mô-đun này giúp thay đổi kích thước hình ảnh và tìm dải màu. Trong dòng 4, chúng tôi đã mở hình ảnh.

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

Bây giờ chúng tôi đã chuyển đổi hình ảnh sang hình ảnh hsv vì hsv giúp phân biệt cường độ với màu sắc.

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

Bây giờ chúng tôi xác định giới hạn trên và giới hạn dưới của màu xanh lam mà chúng tôi muốn phát hiện. Để tìm giới hạn này, chúng ta có thể sử dụng tập lệnh dò ​​tìm phạm vi trong thư viện imutils. Chúng tôi đặt các giá trị này vào một mảng NumPy.

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

Ở đây chúng tôi thực sự đang tạo một mặt nạ với màu xanh lam được chỉ định. Mặt nạ chỉ đại diện cho một phần cụ thể của hình ảnh. Trong trường hợp này, chúng tôi đang kiểm tra qua hình ảnh hsv và kiểm tra các màu nằm giữa dải dưới và dải trên. Các khu vực phù hợp sẽ là một hình ảnh được đặt thành biến mặt nạ.

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, chúng ta có thể hiển thị ảnh gốc và ảnh mặt nạ cạnh nhau để thấy sự khác biệt. Nếu bạn muốn hiểu ý nghĩa của 0xFF trong mã này, hãy đọc phần này. Sau đó, mã sẽ đợi người dùng nhấn vào nút ‘Esc’, nút này sẽ thoát khỏi nó và phá hủy tất cả các cửa sổ để dọn dẹp.

Chương trình cuối cùng

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()

Đầu ra

Phát hiện một màu cụ thể (ở đây là màu xanh lam) bằng OpenCV với Python?

Ở trên, chúng ta thấy có một vài đốm đen trong mặt nạ, đó là tiếng ồn.