Trong sản xuất và cuộc sống việc ứng dụng phát hiện màu sắc để phân biệt vật, tình trạng vật biến đổi màu, phát hiện dị vật, sản phẩm lỗi, sản phẩm ok ….
1.Truy cập trang https://www.w3schools.com/colors/colors_rgb.asp để tạo giá trị màu BGR hay RGB
và trang https://www.w3schools.com/colors/colors_picker.asp để lấy giá trị màu BGR hay RGB
2.Copy ảnh mẫu sau vào project:
3.Tiến hành viết code:
a, khai báo thư viện
1 2 3 4 5 6 |
<span style="color: #993300;"><strong># cài thư viện cần sử dụng</strong></span> <span style="color: #993300;"><strong>import numpy as np</strong></span> <span style="color: #993300;"><strong>import cv2</strong></span> <span style="color: #993300;"><strong># tải hình ảnh</strong></span> <span style="color: #993300;"><strong>image = cv2.imread("color-ball.jpeg")</strong></span> |
b, tính toán và khai báo các khoảng giới hạn màu:
bạn vào web lấy giá trị màu tương ứng
hoặc để chính xác ta sử dụng phần mềm lấy mầu chuyên dụng
sau khi tính toán ta có dải màu cho từng màu như sau:
1 2 3 4 5 6 7 8 9 10 11 |
<span style="color: #993300;"><strong>boundaries = [</strong></span> <span style="color: #993300;"><strong> ([198 - 30, 115 - 30, 16 - 16], [198 + 30, 115 + 30, 16 + 30]),# Lam đậm</strong></span> <span style="color: #993300;"><strong> ([138 - 30, 32 - 30, 148 - 30], [138 + 30, 32 + 30, 148 + 30]), # Tím</strong></span> <span style="color: #993300;"><strong> ([17 - 17, 33 - 30, 246 - 30], [17 + 30, 33 + 30, 255]), # Đỏ</strong></span> <span style="color: #993300;"><strong> ([54 - 30, 113 - 30, 253 - 30], [54 + 30, 113 + 30, 253 + 2]), # Cam</strong></span> <span style="color: #993300;"><strong> ([0, 186 - 30, 254 - 30], [2 + 30, 186 + 30, 255]), #Vàng</strong></span> <span style="color: #993300;"><strong> ([64 - 30, 153 - 30, 43 - 30], [64 + 30, 153 + 30, 43 + 30]), #Lục</strong></span> <span style="color: #993300;"><strong> ([0, 186 - 30, 179 - 30], [17 + 30, 186 + 30, 179 + 30]),#Vàng chanh</strong></span> <span style="color: #993300;"><strong> ([131 - 30, 6 - 6, 252 - 30], [131 + 30, 6 + 30, 252 + 3]), #Hồng</strong></span> <span style="color: #993300;"><strong> ([217 - 30, 163 - 30, 8 - 8], [217 + 30, 163 + 30, 8 + 30]) # lam nhạt</strong></span> <span style="color: #993300;"><strong>]</strong></span> |
Giải thích về các khoảng giới hạn cho từng màu như sau: đối với màu lam đậm ta có giá BGR = (198,115,16) thì dải màu của màu lam đậm có giá trị BGR nằm khoảng (198-30<B<198+30),(115-30<G<115+30),(16-16<R<16+30)
Ta có code xử lý sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
<strong><span style="color: #993300;"># Vòng lặp cho mỗi 1 dải giới hạn màu</span></strong> <strong><span style="color: #993300;">for (lower, upper) in boundaries:</span></strong> <strong><span style="color: #993300;"> #tạo mảng numpy từ dải giới hạn màu</span></strong> <strong><span style="color: #993300;"> lower = np.array(lower, dtype = "uint8")</span></strong> <strong><span style="color: #993300;"> upper = np.array(upper, dtype = "uint8")</span></strong> <strong><span style="color: #993300;"> # Tìm màu trong dải giới hạn, và áp dụng cho ảnh mặt lạ</span></strong> <strong><span style="color: #993300;"> mask = cv2.inRange(image, lower, upper)</span></strong> <strong><span style="color: #993300;"> #tạo ảnh mới bằng phép and bit màu giữa ảnh gốc và ảnh măt lạ</span></strong> <strong><span style="color: #993300;"> output = cv2.bitwise_and(image, image, mask = mask)</span></strong> <strong><span style="color: #993300;"> # hiển thị ảnh ghép giữa ảnh gốc và ảnh output</span></strong> <strong><span style="color: #993300;"> cv2.imshow("images", np.hstack([image, output]))</span></strong> <strong><span style="color: #993300;"> cv2.waitKey(0)</span></strong> |
kết quả :
Thêm phần code sau để xử lý ảnh hiện rõ hơn:
1 2 3 4 5 6 |
<span style="color: #993300;"><strong>#Dùng hàm xói mòn để cắt bớt các chi tiết thừa hoặc nhỏ</strong></span> <span style="color: #993300;"><strong>kernel = np.ones((1, 1), np.uint8)</strong></span> <span style="color: #993300;"><strong>mask = cv2.erode(mask, kernel, iterations=2)</strong></span> <span style="color: #993300;"><strong># Dùng hàm giãn nở để lấp đầy các khoảng trống của hình, làm nổi bật hình ảnh</strong></span> <span style="color: #993300;"><strong>kernel = np.ones((4, 4), np.uint8)</strong></span> <span style="color: #993300;"><strong>mask = cv2.dilate(mask, kernel, iterations=2)</strong></span> |
kết quả:
và đây là toàn bộ code chương trình:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<strong><span style="color: #993300;"># cài thư viện cần sử dụng</span></strong> <strong><span style="color: #993300;">import numpy as np</span></strong> <strong><span style="color: #993300;">import cv2</span></strong> <strong><span style="color: #993300;">import imutils</span></strong> <strong><span style="color: #993300;"># tải hình ảnh</span></strong> <strong><span style="color: #993300;">image = cv2.imread("color-ball.jpeg")</span></strong> <strong><span style="color: #993300;"># khai báo danh sách giới hạn màu</span></strong> <strong><span style="color: #993300;">boundaries = [</span></strong> <strong><span style="color: #993300;"> ([198 - 30, 115 - 30, 16 - 16], [198 + 30, 115 + 30, 16 + 30]),# Lam đậm</span></strong> <strong><span style="color: #993300;"> ([138 - 30, 32 - 30, 148 - 30], [138 + 30, 32 + 30, 148 + 30]), # Tím</span></strong> <strong><span style="color: #993300;"> ([17 - 17, 33 - 30, 246 - 30], [17 + 30, 33 + 30, 255]), # Đỏ</span></strong> <strong><span style="color: #993300;"> ([54 - 30, 113 - 30, 253 - 30], [54 + 30, 113 + 30, 253 + 2]), # Cam</span></strong> <strong><span style="color: #993300;"> ([0, 186 - 30, 254 - 30], [2 + 30, 186 + 30, 255]), #Vàng</span></strong> <strong><span style="color: #993300;"> ([64 - 30, 153 - 30, 43 - 30], [64 + 30, 153 + 30, 43 + 30]), #Lục</span></strong> <strong><span style="color: #993300;"> ([0, 186 - 30, 179 - 30], [17 + 30, 186 + 30, 179 + 30]),#Vàng chanh</span></strong> <strong><span style="color: #993300;"> ([131 - 30, 6 - 6, 252 - 30], [131 + 30, 6 + 30, 252 + 3]), #Hồng</span></strong> <strong><span style="color: #993300;"> ([217 - 30, 163 - 30, 8 - 8], [217 + 30, 163 + 30, 8 + 30]) # lam nhạt</span></strong> <strong><span style="color: #993300;">]</span></strong> <strong><span style="color: #993300;"># Vòng lặp cho mỗi 1 dải giới hạn màu</span></strong> <strong><span style="color: #993300;">for (lower, upper) in boundaries:</span></strong> <strong><span style="color: #993300;"> #tạo mảng numpy từ dải giới hạn màu</span></strong> <strong><span style="color: #993300;"> lower = np.array(lower, dtype = "uint8")</span></strong> <strong><span style="color: #993300;"> upper = np.array(upper, dtype = "uint8")</span></strong> <strong><span style="color: #993300;"> # Tìm màu trong dải giới hạn, và áp dụng cho ảnh mặt lạ</span></strong> <strong><span style="color: #993300;"> mask = cv2.inRange(image, lower, upper)</span></strong> <strong><span style="color: #993300;"> #Dùng hàm xói mòn để cắt bớt các chi tiết thừa hoặc nhỏ</span></strong> <strong><span style="color: #993300;"> kernel = np.ones((1, 1), np.uint8)</span></strong> <strong><span style="color: #993300;"> mask = cv2.erode(mask, kernel, iterations=2)</span></strong> <strong><span style="color: #993300;"> # Dùng hàm giãn nở để lấp đầy các khoảng trống của hình, làm nối bật hình</span></strong> <strong><span style="color: #993300;"> kernel = np.ones((4, 4), np.uint8)</span></strong> <strong><span style="color: #993300;"> mask = cv2.dilate(mask, kernel, iterations=2)</span></strong> <strong><span style="color: #993300;"> #tạo ảnh mới bằng phép and bit màu giữa ảnh gốc và ảnh măt lạ</span></strong> <strong><span style="color: #993300;"> output = cv2.bitwise_and(image, image, mask = mask)</span></strong> <strong><span style="color: #993300;"> # hiển thị ảnh ghép giữa ảnh gốc và ảnh output</span></strong> <strong><span style="color: #993300;"> cv2.imshow("images", np.hstack([image, output]))</span></strong> <strong><span style="color: #993300;"> cv2.waitKey(0)</span></strong> |
Nhận xét, việc chọn lựa và tính toán dải màu là tương đối, ưu tiên chọn vị trí màu gần viền của vật, hay có diện tích màu giống nhau lớn nhất của vật.
Bài tập áp dụng phát hiện màu của hạt cà phê, quả dâu tây, cà chua .. chín phục vụ cho bài toán phát hiện quả chất lượng khi thu hoạch.