ছবি প্রসেসিং (image processing) অনেকের কাছে ভয়ংকর এবং কঠিন লাগতে পারে, কিন্তু আসলে এতটুকু কঠিন নয়। এই টিউটোরিয়ালে OpenCV এবং পাইথন দিয়ে বেসিক কালার ডিটেকশন দেখাব।
কম্পিউটারে রঙ কীভাবে কাজ করে?
কম্পিউটারে রঙকে কালার-স্পেস বা কালার মডেল দিয়ে রিপ্রেজেন্ট করা হয়, যা মূলত সংখ্যার টাপল হিসেবে রঙের রেঞ্জ বর্ণনা করে।
সবচেয়ে সাধারণ দুটি কালার-স্পেস হলো RGB (Red, Green, Blue) এবং HSV (Hue, Saturation, Value)।
RGB কালার মডেল
RGB-তে রঙ তিনটি কম্পোনেন্টের টাপল হিসেবে রিপ্রেজেন্ট হয়। প্রতিটি কম্পোনেন্ট ০ থেকে ২৫৫ এর মান নিতে পারে। (0, 0, 0) হলো কালো এবং (255, 255, 255) হলো সাদা। শুদ্ধ নীল পিক্সেলের জন্য: R=0, G=0, B=255।
| রঙ | RGB মান |
|---|---|
| লাল | 255, 0, 0 |
| কমলা | 255, 128, 0 |
| গোলাপি | 255, 153, 255 |
HSV কালার মডেল
HSV-তে একটি পিক্সেল তিনটি প্যারামিটার দিয়ে রিপ্রেজেন্ট হয়: Hue (রঙ/শেড), Saturation (রঙের তীব্রতা), Value (জ্যোতি/অন্ধকার)। RGB-এর বিপরীতে HSV প্রাইমারি রঙ ব্যবহার করে না।
- Hue: রঙ বা শেড।
- Saturation: রঙের তীব্রতা (০ = নिस्तব্ধ, ২৫৫ = সর্বোচ্চ তীব্রতা)।
- Value: রঙ কতটুকু উজ্জ্বল বা ম্লান।
সঠিক রঙ সনাক্তকরণ
প্রথমে কাজের ছবিটি ডাউনলোড করুন।
পাইথন কোড
import cv2
import numpy as np
import imutils
img = cv2.imread('color2.jpg')
প্রথম দুটি লাইন ইম্পোর্ট হ্যান্ডেল করে। তৃতীয় লাইনে imutils মডিউল ইম্পোর্ট করা হয়েছে যা ইমেজ রিসাইজ এবং কালার রেঞ্জ খুঁজে বের করতে সাহায্য করে। চতুর্থ লাইনে ইমেজ খোলা হয়েছে।
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
ইমেজকে HSV-তে কনভার্ট করা হয়েছে কারণ HSV ইন্টেনসিটি এবং রঙ আলাদা করতে সাহায্য করে।
lower_range = np.array([110, 50, 50]) upper_range = np.array([130, 255, 255])
নীল রঙের নিম্ন এবং উর্ধ্ব সীমা ডিফাইন করা হয়েছে। এই লিমিটগুলো imutils লাইব্রেরির range-detector স্ক্রিপ্ট দিয়ে বের করা যায়। মানগুলো 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()
আউটপুট
মাস্ক ছবিতে কিছু কালো স্পট দেখা যাবে, সেগুলো নয়জ (noise)।