Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การตรวจจับสีเฉพาะ (สีน้ำเงินที่นี่) โดยใช้ OpenCV กับ Python หรือไม่


สำหรับคนจำนวนมาก การประมวลผลภาพอาจดูเหมือนเป็นงานที่น่ากลัวและน่ากลัว แต่ก็ไม่ได้ยากอย่างที่หลายคนคิด ในบทช่วยสอนนี้ เราจะทำการตรวจจับสีพื้นฐานใน openCv ด้วย python

สีทำงานอย่างไรบนคอมพิวเตอร์

เราแสดงสีบนคอมพิวเตอร์โดยใช้พื้นที่สีหรือแบบจำลองสี ซึ่งโดยทั่วไปแล้วจะอธิบายช่วงของสีเป็นตัวเลขสองส่วน

แทนที่จะใช้แต่ละสี เราจะพูดถึงสเปซสีทั่วไปส่วนใหญ่ที่เราใช้ .i.e. RGB (แดง เขียว น้ำเงิน) และ HSV (ฮิว ความอิ่มตัว ค่า)

RGB โดยทั่วไปจะอธิบายสีว่าเป็นทูเพิลจากสามองค์ประกอบ แต่ละองค์ประกอบสามารถรับค่าได้ระหว่าง 0 ถึง 255 โดยที่ tuple (0, 0, 0) แทนสีดำ และ (255, 255, 255) แทนสีขาว ตัวอย่างเช่น หากเราต้องแสดงพิกเซลสีน้ำเงินบนหน้าจอ ค่า R จะเป็น 0 ค่า G จะเป็น 0 และค่า B จะเป็น 255

ด้านล่างนี้คือตัวอย่างเพิ่มเติมของสีใน RGB:

สี ค่า RGB
สีแดง 255, 0, 0
สีส้ม 255, 128, 0
สีชมพู 255, 153, 255

เมื่อใช้ HSV พิกเซลจะแสดงด้วยพารามิเตอร์ 3 ตัว แต่จะใช้แทน Hue, Saturation และ Value แทน อย่างไรก็ตาม ไม่เหมือนกับ RGB ตรงที่ HSV ไม่ได้ใช้สีหลักเพื่อแสดงพิกเซล แต่จะใช้ฮิว ซึ่งเป็นสีหรือเฉดสีของพิกเซลแทน

ความอิ่มตัวคือความเข้มของสี โดยที่ความอิ่มตัวของสี 0 แทนค่า 0 และความอิ่มตัวของสี 255 คือความเข้มสูงสุด ค่าจะบอกได้ว่าสีนั้นสว่างหรือมืดเพียงใด

การตรวจจับสีที่ถูกต้อง

มาดาวน์โหลดรูปภาพที่เราจะใช้งานกันก่อน

การตรวจจับสีเฉพาะ (สีน้ำเงินที่นี่) โดยใช้ OpenCV กับ Python หรือไม่

เมื่อได้ภาพสีแล้ว ก็เริ่มส่วนที่สนุกได้เลย เพียงเปิดตัวแก้ไขข้อความหลามหรือ IDE ที่คุณชื่นชอบแล้วเริ่มกันเลย

import cv2
import numpy as np
import imutils
img = cv2.imread('color2.jpg')

ในบรรทัดโค้ดด้านบน สองบรรทัดแรกจัดการการนำเข้าทั้งหมด ในบรรทัดที่สาม ฉันกำลังนำเข้าโมดูล imutils ซึ่งช่วยในการปรับขนาดรูปภาพและค้นหาช่วงของสี ในบรรทัดที่ 4 เราเปิดรูปภาพแล้ว

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

ตอนนี้เราได้แปลงรูปภาพเป็นรูปภาพ hsv เพราะ hsv ช่วยแยกความเข้มจากสี

lower_range = np.array([110,50,50])
upper_range = np.array([130,255,255])

ตอนนี้เรากำหนดขีด จำกัด บนและล่างของสีน้ำเงินที่เราต้องการตรวจจับ เพื่อหาขีดจำกัดเหล่านี้ เราสามารถใช้สคริปต์ range-detector ในไลบรารี imutils เราใส่ค่าเหล่านี้ลงในอาร์เรย์ NumPy

mask = cv2.inRange(hsv, lower_range, upper_range)

ที่นี่เรากำลังสร้างมาสก์ด้วยสีน้ำเงินที่ระบุ มาสก์เป็นเพียงส่วนหนึ่งของภาพเท่านั้น ในกรณีนี้ เรากำลังตรวจสอบรูปภาพ hsv และตรวจสอบสีที่อยู่ระหว่างช่วงล่างและช่วงบน พื้นที่ที่ตรงกันจะตั้งค่ารูปภาพเป็นตัวแปรมาสก์

cv2.imshow('image', img)
cv2.imshow('mask', mask)

while(True):
   k = cv2.waitKey(5) & 0xFF
   if k == 27:
      break

cv2.destroyAllWindows()

สุดท้ายเราสามารถแสดงภาพต้นฉบับและภาพมาสก์เคียงข้างกันเพื่อดูความแตกต่าง หากคุณต้องการเข้าใจว่า 0xFF หมายถึงอะไรในโค้ด ให้อ่านสิ่งนี้ จากนั้นโค้ดจะรอให้ผู้ใช้กดปุ่ม 'Esc' ซึ่งจะออกจากการทำงานและทำลายหน้าต่างทั้งหมดเพื่อล้างข้อมูล

โปรแกรมสุดท้าย

import cv2
import numpy as np
import imutils

img = cv2.imread('color2.jpg')

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_range = np.array([110,50,50])
upper_range = np.array([130,255,255])

mask = cv2.inRange(hsv, lower_range, upper_range)

cv2.imshow('image', img)
cv2.imshow('mask', mask)

while(True):
   k = cv2.waitKey(5) & 0xFF
   if k == 27:
      break

cv2.destroyAllWindows()

ผลลัพธ์

การตรวจจับสีเฉพาะ (สีน้ำเงินที่นี่) โดยใช้ OpenCV กับ Python หรือไม่

ด้านบนนี้เราพบว่ามีจุดดำสองสามจุดในหน้ากากนั่นคือเสียงรบกวน