การประมวลผลภาพ (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