Phát hiện màu đen opencv Python

CHỈNH SỬA [2020/06]. Tôi đã cập nhật các mẫu mã để loại bỏ một số lỗi và mang lại khả năng tương thích cho python 3

Một sự cố lập trình gần đây ở trường đại học, yêu cầu chúng tôi phân tích ảnh chụp màn hình của ứng dụng Android và truy xuất càng nhiều dữ liệu từ ứng dụng đó càng tốt. Trong bài đăng này, tôi sẽ phác thảo quy trình chung mà chúng tôi đã thực hiện để thu thập màu nền từ một hình ảnh nhất định bằng thư viện OpenCV và Python

Học thuyết

OpenCV cho phép chúng tôi mở một hình ảnh và lưu trữ nó trong một mảng hoặc ma trận 3 chiều trong đó trục x và y chỉ định vị trí của pixel trong hình ảnh và trục z chỉ định kênh màu RGB. Mỗi pixel RGB chứa thành phần màu đỏ 8 bit, thành phần màu lục 8 bit và thành phần màu xanh lam 8 bit. Khi được kết hợp, chúng cho chúng ta màu của pixel được đề cập. Giá trị RGB là [255, 255, 255] có nghĩa là cường độ của từng thành phần màu trong pixel này là 255, là cường độ tối đa mà giá trị 8 bit có thể ở dạng thập phân. Giá trị RGB [255,255,255] chỉ định màu trắng mà mắt chúng ta sẽ nhìn thấy. Ở đầu kia của phổ RGB khi tất cả các thành phần RGB ở cường độ 0 i. e [0,0,0] màn hình sẽ hiển thị pixel đen

phương pháp tiếp cận

Cách tiếp cận đầu tiên

Mục tiêu của chúng tôi trong cách tiếp cận đầu tiên là xem liệu chúng tôi có thể tìm ra màu nào xuất hiện nhiều nhất trong ảnh mẫu không. Để đạt được điều này, chúng tôi bắt đầu bằng cách chia hình ảnh thành ba kênh màu và sau đó làm phẳng từng kênh màu đó thành một mảng 1 chiều. Bây giờ chúng ta còn lại ba mảng 1D [1 cho mỗi màu] có thể được lặp lại cùng một lúc. Kết quả được lưu dưới dạng Key. Các cặp giá trị trong đó khóa là RGB được lưu dưới dạng bộ và giá trị là tần số. Từ điển được sắp xếp theo giá trị và được in để đưa ra danh sách các màu từ ít phổ biến nhất đến thường xuyên nhất và tần suất tương ứng của chúng

Cách tiếp cận thứ hai

Lần lặp lại thứ hai của giải pháp này tập trung nhiều hơn vào những gì sẽ xảy ra với các mẫu trong thế giới thực không lý tưởng, ví dụ: nếu nền hình ảnh là một dải màu thay vì một hình ảnh đơn sắc. Từ cách tiếp cận đầu tiên, chúng ta có thể quan sát một số dữ liệu thú vị về các loại hình ảnh khác nhau để dẫn chúng ta đi đúng hướng. Nếu chúng ta lấy một hình nền có màu đơn, chẳng hạn như thanh tác vụ từ ứng dụng Dropbox của Android [hình 1] và chạy nó qua chương trình, chúng ta có thể thấy rằng một sắc thái chính xác của màu xanh xuất hiện ở khoảng 88% pixel trong hình ảnh. Nếu chúng tôi so sánh điều đó với những gì chúng tôi tìm thấy khi phân tích thanh hành động Facebook này [hình 2], có nền chuyển màu, chúng tôi thấy rằng không có màu nào trong thanh hành động Facebook xuất hiện nhiều hơn ~3% trong hình ảnh. Điều này cho chúng tôi biết chắc chắn rằng có sự khác biệt lớn về mặt thống kê giữa hai tình huống và cho phép chúng tôi tiếp tục giải pháp tiếp theo

Một cửa sổ Anaconda Navigator sẽ mở ra. Ở giữa trang, trong ô máy tính xách tay Jupyter, hãy nhấp vào [Khởi chạy]

Trình duyệt tệp Jupyter sẽ mở trong tab trình duyệt web

Ở phía trên bên phải, chọn [Mới] --> [Python 3]

Một sổ ghi chép mới sẽ mở dưới dạng một tab mới trong trình duyệt web của bạn

Bước 3. Nhập các thư viện cần thiết khác nhau

Chúng tôi bắt đầu bằng cách nhập một vài thư viện. Chúng tôi nhập khẩu

Thư viện OpenCV2 giúp chúng ta đọc và ghi hình ảnh. Chúng tôi nhập khẩu

Thư viện NumPy Python để thực hiện các thao tác khác nhau trên hình ảnh. Sau đó chúng tôi nhập khẩu

thư viện matplotlib để hiển thị hình ảnh

nhập matplotlib. pyplot dưới dạng plt

Ghi chú. Nếu bạn gặp lỗi cho biết "không tìm thấy cv2", ĐỪNG BẤT NGỜ. Đó là do bạn chưa cài đặt gói OpenCV2. bạn có thể cài đặt nó bằng lệnh bên dưới

Đối với windows nếu bạn đã cài đặt anaconda, bạn chỉ cần

làm

pip cài đặt opencv-python

hoặc

cài đặt conda -c

https. // điều kiện. ngôi sao. org/menpo opencv

Nếu bạn đang dùng linux, bạn có thể làm

pip cài đặt opencv-python

hoặc

conda cài đặt opencv

Bước 4. Đang tải hình ảnh

Bạn có thể lấy bất kỳ hình ảnh ngẫu nhiên nào từ internet. Bạn phải lưu nó vào máy tính để bàn của mình

Trước tiên, chúng tôi bắt đầu bằng cách tải hình ảnh vào một biến 'img'

Chúng tôi làm điều đó bằng cách sử dụng chức năng OpenCV2 imread[] bên trong đó chúng tôi đề cập đến vị trí của hình ảnh

hình ảnh =cv2. imread['C. /Người dùng/Daksha/Máy tính để bàn/màu sắc. JPG']

Bước5. Hiển thị hình ảnh

Bây giờ, chúng ta hãy hiển thị hình ảnh cụ thể đó bằng chức năng matplotlib

plt. hình[figsize=[20,8]]

plt. imshow[img]


Bước 6. Chuyển đổi định dạng BGR sang RGB

Trong hình ảnh trên, chúng ta có thể thấy rằng màu sắc KHÔNG khớp với hình ảnh. Đó là bởi vì

Theo mặc định, OpenCV tải hình ảnh ở định dạng màu BGR thay vì định dạng RGB

Vì vậy, để thuận tiện, chúng tôi phải chuyển đổi hình ảnh thành màu RGB. Chúng tôi sử dụng chức năng cvtColor[] của OpenCV2

grid_RGB = cv2. cvtColor[img,cv2. COLOR_BGR2RGB]

Bước7. Hiển thị hình ảnh đã thay đổi

Ở đây, chúng tôi chỉ hiển thị hình ảnh đã thay đổi của định dạng BGR sang định dạng RGB bằng cách sử dụng hàm imshow[] với grid_RGB làm tham số

plt. hình[figsize=[20,8]]

plt. imshow[grid_RGB]

Bước8. Chuyển đổi hình ảnh từ định dạng RGB sang định dạng HSV

Để phát hiện hình ảnh, OpenCV sử dụng định dạng màu HSV thay vì định dạng màu BGR hoặc RGB. HSV [màu sắc, độ bão hòa, giá trị] là các biểu diễn thay thế của mô hình màu RGB, được các nhà nghiên cứu đồ họa máy tính thiết kế vào những năm 1970 để phù hợp hơn với cách thị giác của con người cảm nhận các thuộc tính tạo màu. Biểu diễn HSV mô hình hóa cách các loại sơn có màu khác nhau trộn với nhau, với kích thước độ bão hòa giống như các sắc độ khác nhau của sơn có màu sắc rực rỡ và thứ nguyên giá trị giống như hỗn hợp của các loại sơn đó với lượng sơn đen hoặc trắng khác nhau

Hãy để chúng tôi chuyển đổi hình ảnh cụ thể từ định dạng RGB sang định dạng HSV

grid_HSV = cv2. cvtColor[grid_RGB,cv2. COLOR_RGB2HSV]

Bước9. Phát hiện màu của hình ảnh

Để phát hiện màu, chúng tôi cần đề cập đến phạm vi HSV của màu mà chúng tôi muốn phát hiện

VÌ VẬY HÃY ĐỂ CHÚNG TÔI PHÁT HIỆN MÀU VÀNG TỪ HÌNH ẢNH

Vì vậy, chúng ta nên đề cập đến dải màu thấp hơn và dải màu HSV cao hơn

thấp hơn = np. mảng[[25,150,50]]

trên = np. mảng[[35,255,255]]

Nó bao gồm một mảng NumPy chứa các giá trị HSV tương ứng

Bước10. Lựa chọn và hiển thị màu cụ thể trong hình ảnh

Tiếp theo, chúng tôi sẽ sử dụng chức năng OpenCV2 inRange[] để chỉ hiển thị cho chúng tôi màu đã chọn và bôi đen các màu còn lại

mặt nạ = cv2. inRange[grid_HSV,lower,upper

Tiếp theo, chúng tôi sẽ hiển thị mặt nạ này mà chúng tôi đã tạo bằng cách đơn giản là lặp lại hàm vẽ biểu đồ với mặt nạ là tham số

plt. hình[figsize=[20,8]]

plt. imshow[mặt nạ]

Bước11. Tháo mặt nạ và xem ảnh gốc

Nó đã phát hiện đúng màu vàng nhưng thực ra không phải màu vàng mà chỉ là mặt nạ. Vì vậy, để nhìn thấy màu vàng thực tế, chúng ta cần xóa mặt nạ này và xem hình ảnh gốc.  

Vì vậy, chúng tôi viết hàm toán tử AND theo bit của OpenCV sẽ loại bỏ mặt nạ và chỉ hiển thị màu cụ thể đó và bôi đen các màu còn lại

độ phân giải = cv2. bitwise_and[grid_RGB,grid_RGB,mask=mặt nạ]

Sau đó, chúng tôi hiển thị hình ảnh gốc bằng cách sử dụng chức năng vẽ đồ thị với tham số là độ phân giải

plt. hình[figsize=[20,8]]

plt. imshow[res]

Như bạn có thể thấy ở đây, nó có thể phát hiện chính xác màu vàng và làm đen các màu còn lại

Bước12. Thử nghiệm với các màu sắc khác nhau

Theo các bước cơ bản để phát hiện màu sắc của hình ảnh, chúng ta có thể tìm thành công các màu khác nhau có trong hình ảnh trên. Chúng tôi có thể đạt được điều này bằng cách thay đổi các giá trị HSV thấp hơn và cao hơn thành màu cụ thể và làm theo các bước theo thứ tự

Bước13. Thử nghiệm với nhiều hình ảnh khác nhau

Như chúng tôi đã học cách tìm các màu khác nhau có trong hình ảnh, Giờ đây, chúng tôi có thể phát hiện thành công màu sắc từ bất kỳ hình ảnh nào,

Tìm hiểu các hình ảnh khác nhau từ Internet và lưu nó vào máy tính để bàn của bạn

Sử dụng hình ảnh này, hãy làm theo các bước cơ bản để phát hiện màu sắc để phát hiện các màu khác nhau có trong hình ảnh

Chủ Đề