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

ตรวจจับสีเฉพาะ (สีน้ำเงิน) ด้วย OpenCV และ Python

การประมวลผลภาพ (Image Processing) ดูยากแต่จริงๆ ไม่ยากเท่าที่คิด บทความนี้สาธิตการตรวจจับสีพื้นฐานด้วย OpenCV ใน Python

Color Space: RGB vs HSV

RGB (Red, Green, Blue)

  • แต่ละสีมีค่า 0-255
  • (0,0,0) = ดำ, (255,255,255) = ขาว
  • สีน้ำเงินบริสุทธิ์ = (0, 0, 255)
สี RGB
แดง255, 0, 0
ส้ม255, 128, 0
ชมพู255, 153, 255

HSV (Hue, Saturation, Value)

  • Hue (H): สี/เฉดสี (0-179 ใน OpenCV)
  • Saturation (S): ความ濃ของสี (0-255)
  • Value (V): ความสว่าง/มืด (0-255)

HSV แยก "สี" ออกจาก "ความสว่าง" → เหมาะสำหรับตรวจจับสีภายใต้แสงที่เปลี่ยนแปลง

ขั้นตอนการตรวจจับสีน้ำเงิน

1. ติดตั้งไลบรารี

pip install opencv-python numpy imutils

2. โค้ดเต็ม

import cv2
import numpy as np
import imutils

# อ่านภาพ
img = cv2.imread('color2.jpg')

# แปลง BGR -> HSV (OpenCV ใช้ BGR ไม่ใช่ RGB)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# กำหนดช่วงสีน้ำเงินใน HSV
# H: 110-130, S: 50-255, V: 50-255
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])

# สร้าง mask: พิกเซลในช่วง = 255 (ขาว), นอกช่วง = 0 (ดำ)
mask = cv2.inRange(hsv, lower_blue, upper_blue)

# แสดงผล
cv2.imshow('Original Image', img)
cv2.imshow('Blue Mask', mask)

# รอ ESC เพื่อออก
while True:
    k = cv2.waitKey(5) & 0xFF
    if k == 27:  # ESC key
        break

cv2.destroyAllWindows()

3. หาค่า HSV Range ด้วย imutils (range-detector)

python -m imutils.range_detector --filter HSV --image color2.jpg

เครื่องมือนี้จะให้คุณคลิกเลือกสีบนภาพ แล้วแสดงค่า HSV min/max อัตโนมัติ

อธิบายโค้ดสำคัญ

ฟังก์ชัน หน้าที่
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)แปลงภาพจาก BGR เป็น HSV
cv2.inRange(hsv, lower, upper)สร้าง binary mask ตามช่วงสี
cv2.imshow()แสดงภาพในหน้าต่าง
cv2.waitKey(5) & 0xFFรอ key press (0xFF สำหรับ 64-bit systems)
cv2.destroyAllWindows()ปิดหน้าต่างทั้งหมด

ผลลัพธ์

หน้าต่าง Original Image แสดงภาพต้นฉบับ
หน้าต่าง Blue Mask แสดงเฉพาะพื้นที่สีน้ำเงิน (สีขาว) ส่วนอื่นเป็นสีดำ

ปัญหาที่พบบ่อย: Noise

Mask อาจมีจุดดำเล็กน้อย (noise) สามารถแก้ไขด้วย Morphological Operations:

kernel = np.ones((5,5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)   # กำจัด noise เล็ก
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)  # เติมรูเล็ก

ขยายไปสีอื่น

เปลี่ยนค่า lower_blue และ upper_blue ตามสีที่ต้องการ:

  • แดง: HSV มี 2 ช่วง (0-10 และ 170-179) ต้องรวม mask 2 ช่วง
  • เขียว: H ประมาณ 40-80
  • เหลือง: H ประมาณ 20-40