অধ্যায়Phase 2 · কোর ইমেজ প্রসেসিং
2.2 12 মিনিট পড়া
Color Spaces (RGB, HSV, LAB, Gray)
কখন কোন color space।
🎬 গল্প দিয়ে শুরু
লাল আমকে মেশিন কীভাবে চিনবে? RGB-তে চেষ্টা করলে আলোর তারতম্যে fail করে। কিন্তু HSV-তে গেলে শুধু একটি channel দেখেই কাজ হয়ে যায়। Color space — CV-এর গোপন superpower।
কেন একাধিক Color Space?
RGB মানুষের কাছে স্বাভাবিক, কিন্তু কম্পিউটারের জন্য নয়। আলোর তীব্রতা ও রং RGB-তে এক সাথে মেশানো থাকে। আলাদা analysis-এর জন্য আমরা ছবিকে অন্য “ভাষায়” রূপান্তর করি।
| Space | Channels | কখন |
|---|---|---|
| BGR/RGB | Blue, Green, Red | Display, default storage |
| Grayscale | Intensity | Edge, threshold, feature detection |
| HSV | Hue, Saturation, Value | Color-based filtering (লাল/সবুজ object) |
| LAB | L (light), A, B | Color correction, illumination-independent |
| YCrCb | Y, Cr, Cb | Skin detection, video compression (JPEG) |
cvtColor — রূপান্তরের universal tool
python
import cv2
img = cv2.imread("mango.jpg") # BGR
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # matplotlib display
print(gray.shape, hsv.shape, lab.shape)Practical — HSV দিয়ে লাল আম খোঁজা
python
red_mango.py
import cv2, numpy as np
img = cv2.imread("basket.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# লাল hue দুই দিকে wrap করে (0-10 এবং 170-180)
lower1 = np.array([0, 120, 70]); upper1 = np.array([10, 255, 255])
lower2 = np.array([170, 120, 70]); upper2 = np.array([180, 255, 255])
mask1 = cv2.inRange(hsv, lower1, upper1)
mask2 = cv2.inRange(hsv, lower2, upper2)
mask = mask1 | mask2
red_only = cv2.bitwise_and(img, img, mask=mask)
cv2.imwrite("red_only.jpg", red_only)OpenCV-তে Hue range
OpenCV-তে H = 0–179 (অন্য software-এ 0–359)। S ও V = 0–255। মনে রাখুন!
LAB — illumination-resilient color
LAB-এর L channel মানে শুধু brightness, A ও B মানে color। আলো বদলালেও A,B প্রায় একই থাকে — তাই product color matching বা CLAHE enhancement-এ ব্যবহার হয়।
python
import cv2
img = cv2.imread("low_light.jpg")
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
L, A, B = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
L2 = clahe.apply(L)
out = cv2.cvtColor(cv2.merge([L2, A, B]), cv2.COLOR_LAB2BGR)
cv2.imwrite("enhanced.jpg", out) প্র্যাকটিস টাস্ক
- একটি traffic photo থেকে শুধু হলুদ গাড়ি extract করুন (HSV)।
- একটি কম-আলোর selfie LAB+CLAHE দিয়ে উন্নত করুন।
- YCrCb space-এ Cr channel দিয়ে skin region খোঁজার চেষ্টা করুন।
সারসংক্ষেপ
- Color space = ছবির আলাদা গাণিতিক ভাষা।
- HSV = color filtering-এর জন্য সেরা; OpenCV H = 0–179।
- LAB = illumination-independent; CLAHE-এর সঙ্গে combo magical।
- Grayscale = সব edge/feature detection-এর ভিত্তি।