6. Thời gian và địa điểm thực hiện
2.7.1 Cơ sở thuật toán
Chọn giải màu cho đối tượng
import cv2
print ("Quanghuan")
image = cv2.imread("Opencvanh/g.jpg") cv2.imshow("image", image)
cv2.waitKey(0)
Hình 2. 19 Trackbars sau khi được tạo
Bước 2: Điều chỉnh các giá trị màu để chọn màu cần tìm.
Bước 3: Từ trackbars ta tìm được giá trị khoảng màu cần lọc, với lower=[0, 171, 172] và upper=[11, 255, 255].
Lọc màu ảnh
Với giải thật này chúng ta sẽ xử dụng không gian màu HSV:
Hình 2. 21 Ảnh không gian màu HSV [8]
HSV[37] hay còn gọi là không gian màu HSB là một không gian màu dựa trên 3 thông số chính của không gian màu:
-H viết tắt của HUE là vùng màu.
-S viết tắt của SATURATION có nghĩa là độ bão hòa màu.
-V viết tắt của VALUE có nghĩa là giá trị hay độ sáng của màu sắc.
Sau khi chuyển từ hệ màu RGB sang HSV thì filter giá trị màu bằng hàm cv2.inRange(), kết quả là ảnh nhị phân gọi là mask, sau đó ta áp dụng vào ảnh gốc ta sẽ được ảnh chỉ chứ màu giới hạn.
Để lọc khoảng màu ta dùng câu lệnh:
Bước 1: Chuyển ảnh sang không gian màu HSV ta sử dụng lệnh hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
Bước 2: Để lọc màu từ ảnh ta sử dụng lệnh: white_mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(frame, frame, mask = white_mask) cv2.imshow('inrange', result)
Xám hóa và nhị phân ảnh
Để xám hóa và nhị phân ảnh ta sử dụng các lệnh: gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY) cv2.imshow('gray', gray)
ret, thresh = cv2.threshold(gray ,1 ,255, cv2.THRESH_BINARY) cv2.imshow('thresh', thresh)
Các phương pháp xử lý đối tượng trong ảnh
Chuyển qua ảnh xám:
Đơn vị cơ bản của một bức ảnh là điểm ảnh (pixel)[38], mỗi điểm ảnh có thể được biểu diễn bằng n bytes dưới các hệ màu khác nhau. Việc chuyển đổi giữa các hệ màu thông thường được thực hiện thông qua các phép biến đổi ma trận. Xét đến phương thức chuyển đổi từ ảnh 24 bit RGB sang ảnh 8 bit đa mức xám, để thực hiện yêu cầu trên, thông thường ta sử dụng cách chuyển đổi từ ảnh 24 bit RGB sang ảnh 8bit GrayScale.
GrayScale[39]: là một hệ thống màu có mô hình màu đơn giản nhất với 256 cấp độ xám biến thiên từ màu đen đến màu trắng. Sản phẩm được xuất ra sẽ có màu trắng đen. Được sử dụng cả trong công nghiệp in lẫn dùng trong việc thể hiện ảnh lên các thiết bị số.
Ảnh xám (Gray image) hay còn gọi là ảnh đơn sắc (Monochromatic), mỗi giá trị điểm ảnh (Pixel) trong ma trận điểm ảnh mang giá trị từ 0 đến 255.
Trong không gian màu RGB, để có một ảnh xám cần có phải có giá trị kênh màu Red(x, y) = Green(x, y) = Blue(x, y). (Với x, y lần lượt là tọa độ của điểm ảnh). Công thức tính cường độ sáng tại một điểm ảnh từ ảnh RGB:
I(x, y) = 0.3086 * Red(x, y) + 0.6094 * Green(x, y) + 0.0820 * Blue(x, y) Ix,y=0.299*Red(x,y)+0.587*Green(x,y)+0.114*Blue(x,y)
Phân tích:
- I (x, y): Là cường độ sáng tại điểm ảnh (x, y) của ảnh xám.
-Red (x, y): Là giá trị của kênh màu Red (Đỏ) tại điểm ảnh (x, y) của ảnh màu (RGB).
-Green (x, y): Là giá trị của kênh màu Green (Xanh lá cây) tại điểm ảnh (x, y) của ảnh màu (RGB). Blue(x, y): Là giá trị của kênh màu .
Theo [20] ta có công thức khác tính cường độ sáng tại một điểm ảnh từ ảnh RGB: I(x, y) = (2 * Red(x, y) + 5 * Green(x, y) + 1 * Blue(x, y)) / 8
Chú ý:
Các phép toán trong số nguyên (Int) nhanh hơn rất nhiều trong số thực (Float). Trong OpenCV[20], hệ thống màu có thứ tự các kênh màu là Blue-Green-Red. Các thông số dùng để tính toán cường độ sáng cho ảnh xám như: 0.3086, 0.6094, 0.0820… Được coi là những con số đẹp do người ta nghiên cứu ra. Các con số này có thể thay đổi. Chúng ta hoàn toàn có thể chọn một giá trị một kênh màu hoặc chia trung bình cộng của 3 kênh màu để tìm cường độ sáng tại một điểm ảnh (Pixel).
Lưu ý rằng giá trị mỗi điểm ảnh I(x, y) hay còn gọi là cường độ sáng (Luminance Intensity) trong ảnh đa mức xám tính được là tổng trọng số khác nhau của mỗi thành phần màu trong hệ màu RGB. Một trong những lý do của việc này là nếu chúng ta sử dụng cùng trọng số, ví dụ (R + G + B) / 3 thì màu đỏ, màu xanh nước biển hay màu xanh da trời sẽ có cùng mức xám sau khi chuyển đổi. Mặt khác khoa học đã chứng minh thì mắt người nhạy cảm hơn với thành phần màu xanh lá cây và màu đỏ so với xanh da trời.
Phân ngưỡng (Threshold).
Khi xử lý trực tiếp ảnh từ không gian màu (RGB, HIS…) hoặc ảnh xám (gray) đôi khi chúng ta phải tiếp nhận một số lượng lớn thông tin từ ảnh. Điều này có thể gây khó khăn cho việc xây dựng thuật toán và làm giảm tốc đọ xử lý. Vì thế có lớp thuật toán phân ngưỡng để chuyển ảnh đầu vào (ảnh màu hoặc ảnh xám) về không gian ảnh nhị phân: chỉ gồm hai giá trị 0 hoặc 1, hoặc 0 và 255 tùy theo quy định của cấu trúc ảnh. Theo đó, giá trị 0 sẽ là giá trị ứng với những điểm đen trên ảnh và giá trị 1 (hoặc 255) sẽ là giá trị ứng với những điểm trắng. Nhằm làm đơn giản hóa quá trình tính xử lý.
Phân ngưỡng với ngưỡng cố định[17]: nếu pixel có giá trị lớn hơn giá trị ngưỡng thì nó được gán 1 giá trị (thường là 1), ngược lại nhỏ hơn giá trị ngưỡng thì nó được gán 1 giá trị khác (thường là 0).
Hàm sử dụng là threshold, tham số đầu tiên là 1 ảnh xám, tham số thứ 2 là giá trị ngưỡng, tham số thứ 3 maxval là giá trị được gán nếu giá pixel lớn hơn giá trị ngưỡng, tham số thứ 4 là loại phân ngưỡng. Tùy theo các loại phân ngưỡng mà
THRESH_BINARY
Nếu giá trị pixel lớn hơn ngưỡng thì gán bằng maxval, ngược lại bằng gán bằng 0. THRESH_BINARY_INV
Nếu giá trị pixel lớn hơn ngưỡng thì gán bằng 0, ngược lại bằng gán bằng maxval. THRESH_TRUNC
Nếu giá trị pixel lớn hơn ngưỡng thì gán giá trị bằng ngưỡng, ngược lại giữ nguyên giá trị.
THRESH_TOZERO
Nếu giá trị pixel lớn hơn ngưỡng thì giữ nguyên giá trị, ngược lại gán bằng 0. THRESH_TOZERO_INV
Nếu giá trị pixel lớn hơn ngưỡng thì gán giá trị bằng 0, ngược lại giữ nguyên Ưu điểm của thuật toán đơn giản dễ lập trình.
Nhược điểm là khó chọn ngưỡng thích nghi với nhiều loại ảnh trong các điều kiện ánh sáng khác nhau.
Adaptive Thresholding (phân ngưỡng thích nghi): phương pháp phân ngưỡng ở trên không phù hợp cho nhiều trường hợp, như là ánh sáng không đồng đều trên ảnh. Trong trường hợp đó chúng ta dùng hàm adaptive Threshold. Phương thức này tính giá trị trung bình của các n điểm xung quanh pixel đó rồi trừ cho C chứ không lấy ngưỡng cố định (n thường là số lẻ, còn C là số nguyên bất kỳ).
Ngoài các tham số giống như phân ngưỡng thường, adaptiveThreshold có thêm các tham số:
ADAPTIVE_THRESH_MEAN_C: giá trị của pixel phụ thuộc vào các pixel lân cận.
ADAPTIVE_THRESH_GAUSSIAN_C: giá trị của pixel cũng phụ thuộc vào các pixel lân cận, tuy nhiên được khử nhiễu.
Block Size: số pixel lân cận dùng để tính toán. C: hằng số trừ đi giá trị trung bình