Thị giác máy tính với OpenCV-Python Bài 4, Phần 1: Thay đổi không gian màu

Thị giác máy tính với OpenCV-Python Bài 4, Phần 1: Thay đổi không gian màu

Thị giác máy tính với OpenCV-Python Bài 4, Phần 1: Thay đổi không gian màu

09:18 - 15/12/2021

Trong phần này, chúng ta sẽ học cách chuyển đổi hình ảnh từ không gian màu này sang không gian màu khác, chẳng hạn như BGR ↔ Xám và BGR ↔ HSV qua các hàm cv2.cvtColor(), cv2.inRange() và một số hàm quan trọng khác trong OpenCV.

Thị giác máy tính với OpenCV-Python Bài 7 Phần 3: Nhận diện khuôn mặt
Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video
Thị giác máy tính với OpenCV-Python Bài 7 Phần 1: Phát hiện người đi bộ trong hình ảnh
Thị giác máy tính với OpenCV-Python Bài 6 Phần 2: Phép trừ nền
Thị giác máy tính với OpenCV-Python Bài 6 Phần 1: Bắt bám đối tượng với Meanshift và Camshift

Thay đổi không gian màu

Có hơn 150 phương pháp chuyển đổi không gian màu được hỗ trợ trong OpenCV. Nhưng chúng ta sẽ chỉ xem xét hai kiểu được sử dụng rộng rãi nhất, đó là: BGR ↔ Xám và BGR ↔ HSV.

Để chuyển đổi màu sắc, chúng ta sử dụng hàm cv2.cvtColor(input_image, flag) trong đó cờ “flag” xác định loại chuyển đổi.

Đối với BGR → Xám, chúng ta sử dụng cờ cv2.COLOR_BGR2GRAY. Tương tự cho BGR → HSV, chúng ta sử dụng cờ cv2.COLOR_BGR2HSV. Để nhận các cờ khác, chỉ cần chạy các lệnh sau:

  1. import cv2
  2. flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
  3. print(flags)

Ghi chú:

Đối với HSV, phạm vi Hue là [0, 179], phạm vi bão hòa là [0, 255] và phạm vi giá trị là [0, 255]. Mỗi phần mềm lại sử dụng những phạm vi khác nhau. Vì vậy, nếu đang so sánh các giá trị với OpenCV, chúng ta cần chuẩn hóa các phạm vi này.

Theo dõi đối tượng

Bây giờ chúng ta đã biết cách chuyển đổi ảnh BGR sang HSV, chúng ta có thể sử dụng nó để trích xuất một đối tượng có màu. Trong HSV, việc biểu diễn một màu dễ dàng hơn so với không gian màu BGR. Trong sau đây, chúng ta sẽ cố gắng trích xuất một đối tượng có màu xanh lam theo các bước sau:

- Tải lên bức ảnh chứa đối tượng.

- Chuyển đổi từ BGR sang không gian màu HSV.

- Chọn ngưỡng hình ảnh HSV cho một dải màu xanh lam.

- Tách ra phần đối tượng màu xanh lam, sau đó có thể làm bất cứ điều gì trên hình ảnh đó.

Dưới đây là đoạn code minh họa:

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread(‘tom.png’)
  4. # Convert BGR to HSV
  5. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  6. # define range of blue color in HSV
  7. lower_blue = np.array([110,50,50])
  8. upper_blue = np.array([130,255,255])
  9. # Threshold the HSV image to get only blue colors
  10. mask = cv2.inRange(hsv, lower_blue, upper_blue)
  11. # Bitwise-AND mask and original image
  12. res = cv2.bitwise_and(frame,frame, mask= mask)
  13. cv2.imshow('frame',frame)
  14. cv2.imshow('mask',mask)
  15. cv2.imshow('res',res)
  16. cv2.waitKey(0)
  17. cv2.destroyAllWindows()

Xem kết quả ở hình dưới đây:

 

 

Ghi chú:

Có một số nhiễu trong hình ảnh thu được. Chúng ta sẽ tìm hiểu cách loại bỏ chúng trong các phần sau.

Đây là phương pháp đơn giản nhất trong theo dõi đối tượng. Một khi bạn học các chức năng của đường viền, bạn có thể tìm tâm của đối tượng này và sử dụng nó để theo dõi đối tượng.

Làm thế nào để tìm các giá trị HSV để theo dõi?

Cách đơn giản nhất là sử dụng hàm cv2.cvtColor(). Thay vì truyền một hình ảnh, chúng ta chỉ cần truyền các giá trị BGR mong muốn. Ví dụ: để tìm giá trị HSV của Blue và Green, hãy thử các lệnh sau:

  1. import cv2
  2. import numpy as np
  3. blue = np.uint8([[[255, 0, 0]]])
  4. green = np.uint8([[[0, 255, 0]]])
  5. hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
  6. hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
  7. print (hsv_blue) //   [[[120  255  255]]]
  8. print (hsv_green) //   [[[60  255  255]]]

Sau đó chúng ta sẽ lấy [H-10, 100, 100] và [H+10, 255, 255] lần lượt là giới hạn dưới và giới hạn trên. Ngoài phương pháp này, có thể sử dụng bất kỳ công cụ chỉnh sửa hình ảnh nào để tìm các giá trị này.

 Ở phần tiếp theo chúng ta sẽ học cách thực hiện các phép biến đổi ảnh.

 

(Sưu tầm)
VIỆN IMC
Tòa nhà IMC Tower, Số 176 Trường Chinh, Phường Khương
Thượng, Quận Đống Đa, Thành phố Hà Nội, Việt Nam
Tel/Fax : (+84) 24 3566 6232 / 24 3566 6234
Email: contact@imc.org.vn   Website: https://imc.org.vn