สำหรับคนจำนวนมาก การประมวลผลภาพอาจดูเหมือนเป็นงานที่น่ากลัวและน่ากลัว แต่ก็ไม่ได้ยากอย่างที่หลายคนคิด ในบทช่วยสอนนี้ เราจะทำการตรวจจับสีพื้นฐานใน 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 คือความเข้มสูงสุด ค่าจะบอกได้ว่าสีนั้นสว่างหรือมืดเพียงใด
การตรวจจับสีที่ถูกต้อง
มาดาวน์โหลดรูปภาพที่เราจะใช้งานกันก่อน
เมื่อได้ภาพสีแล้ว ก็เริ่มส่วนที่สนุกได้เลย เพียงเปิดตัวแก้ไขข้อความหลามหรือ 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()
ผลลัพธ์
ด้านบนนี้เราพบว่ามีจุดดำสองสามจุดในหน้ากากนั่นคือเสียงรบกวน