import cv2
import numpy as np
img = cv2.imread("conket.jpg")
cv2.imshow("img", img)
# he mau sac HSV
# dung HSV de ung dung phat hien mau sac cua vat the
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("img_hsv", img_hsv)
# nguong mau do
lower_red = np.array([0, 120, 70])
upper_red = np.array([10, 255, 255])
# lower < pixel < upper => chuyen sang mau trang 255
# ngoai nguong tren chuen sang mau den 0
mask = cv2.inRange(img_hsv, lower_red, upper_red)
cv2.imshow("mask", mask)
# phep AND bit
# tai diem pixel co mat na mask la 1 (255 mau trang) thi copy mau goc voi nhau
# tai diem pixel co mat na mask la 0 (0 mau den) thi van la mau den 0
result = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("result", result)
result_BGR = cv2.cvtColor(result, cv2.COLOR_HSV2BGR)
cv2.imshow("result_BGR", result_BGR)
cv2.waitKey(0)
cv2.destroyAllWindows()
Điểm cốt lõi dựa vào hàm inRange và hệ màu HSV
cv2.inRange(src, low, up) : những pixel nào nằm trong ngưỡng low và up thì chuyển thành giá trị 255 là màu trắng, ngược lại là màu đen giá trị 0.
chuyển ảnh thành hệ màu HSV, dựa vào tham số H (Hue) để tìm màu đỏ...(màu đỏ là màu khó nhất nên chỉ cần nói màu đỏ).
trong HSV màu đỏ vừa là vùng biên dưới (~10), vừa là biên trên (~350)
dùng inRange để giữ lại pixel màu đỏ trong biên
Làm sao để biết đối tượng cần tìm nằm trong dãy màu Hue nào?
sử dụng các phần mềm xử lý ảnh và import bức hình đối tượng vào
dùng công cụ như pick color để lấy các thông số HSV của đối tượng
ví dụ màu đỏ ta sẽ thấy màu đỏ có 2 biên như trên
có HSV rồi thì nhập vào array Low, Up
Ghi chú quan trọng
Vì HSV có giá trị không như tiêu chuẩn
H : từ 0 tới 179 (không phải từ 0 tới 360)
S : từ 0 tới 255 (không phải là từ 0 tới 100)
V : từ 0 tới 255 (không phải là từ 0 tới 100)
=> Giá trị HSV từ phần mềm xử lý ảnh :
H opencv = H / 2
S opencv = S * 2.55
V opencv = V * 2.55
Bảng tra cứu dải màu HSV (xấp xỉ)
Màu sắc Lower (H, S, V) Upper (H, S, V)
Đỏ [0, 100, 100] [10, 255, 255]
Xanh lá [35, 100, 100] [85, 255, 255]
Xanh dương [100, 100, 100] [130, 255, 255]
Vàng [20, 100, 100] [30, 255, 255]