راهنمای جامع پردازش تصویر با پایتون
پردازش تصویر (Image Processing) یکی از شاخههای مهم بینایی ماشین و هوش مصنوعی است که به آنالیز، بهبود و استخراج اطلاعات از تصاویر و ویدئوها میپردازد. پایتون با داشتن کتابخانههای قدرتمند و متنباز مانند OpenCV،…
پردازش تصویر (Image Processing) یکی از شاخههای مهم بینایی ماشین و هوش مصنوعی است که به آنالیز، بهبود و استخراج اطلاعات از تصاویر و ویدئوها میپردازد. پایتون با داشتن کتابخانههای قدرتمند و متنباز مانند OpenCV، Pillow، Scikit-Image و NumPy، یک ابزار ایدهآل برای انجام پردازشهای تصویری از سطح مقدماتی تا پیشرفته است.
در این پست اصول پردازش تصویر با پایتون را از صفر تا اجرای پروژههای واقعی بررسی میکنیم.
فصل اول: مفاهیم پایه پردازش تصویر
پردازش تصویر چیست؟
به مجموعهای از عملیات دیجیتالی گفته میشود که برای بهبود، تغییر یا استخراج داده از تصاویر انجام میگیرد. این عملیات میتواند:
- بهبود کیفیت تصویر (Image Enhancement)
- شناسایی و آشکارسازی اشیاء (Object Detection)
- فشردهسازی تصویر
- تغییر اندازه و برش
- تشخیص الگوها و ویژگیها را شامل شود.
تصاویر دیجیتال
هر تصویر دیجیتال از پیکسلها تشکیل شده است. هر پیکسل میتواند مقادیر رنگی متفاوتی داشته باشد که اغلب در فضاهای رنگی مانند RGB یا Grayscale تعریف میشوند.
عمق بیت (Bit Depth)
این مفهوم به تعداد بیتهایی اطلاق میشود که برای نمایش رنگ هر پیکسل استفاده میشود. عمق بیت بالاتر به معنی کیفیت بیشتر و دامنه رنگی وسیعتر است.
دامنه پیکسل، مقدار پیکسل و بازنماییهای داده
- پیکسل: واحد پایه تصویری که رنگ یا شدت روشنایی آن تعیین میشود.
- مقدار پیکسل: عددی که مقدار رنگی هر کانال را مشخص میکند (برای مثال 0-255 در تصاویر 8-بیت).
- بازنماییهای داده: تصاویر میتوانند به صورت 2D خاکستری (Grayscale)، یا 3 کاناله رنگی (RGB/BGR) باشند. در برخی کتابخانهها، کانالها به ترتیب BGR (OpenCV) یا RGB (Pillow) نمایش داده میشوند.
طیف رنگیها و فضاهای رنگی
- RGB/_BGR: ترکیبی از سه کانال قرمز، سبز و آبی که ترکیب نهایی رنگ را شکل میدهد.
- Grayscale: نمایش شدت روشنایی به صورت تک کاناله.
- HSV/HSL: جداسازی نور از رنگ برای کارهایی مانند جستوجوی رنگها یا اصلاح نور.
- Lab، YUV، CMYK و غیره: کاربردهای تخصصیتر در پردازش تصویر و چاپ.
نویز و ضد نویز
تصاویر ممکن است دارای نویز باشند که به دلیل انتشار نور، حسگر یا فاکتورهای دیگر است. فیلترهای نرمافزار مانند Gaussian Blur برای کاهش نویز، و فیلترهای هوشمندتر برای حفظ لبهها استفاده میشوند.
فشردهسازی و رزولوشن
- رزولوشن: تعداد پیکسلها در یک تصویر در هر واحد طول (معمولاً پیکسل بر اینچ). نشاندهنده سطح جزئیات است.
- نرخ بیت (Bitrate) و فشردهسازی: روشهایی برای کاهش اندازه فایل با از دست دادن یا حفظ کیفیت تصویر.
فصل دوم: کتابخانههای پایتونی برای پردازش تصویر
۱. OpenCV
OpenCV (Open Source Computer Vision) مشهورترین کتابخانه متنباز پردازش تصویر است که امکانات گستردهای در زمینههای:
- خواندن و نوشتن تصاویر و ویدئو
- تبدیل فضای رنگی
- فیلترگذاری و پردازش تصویری ساده تا پیشرفته
- تشخیص لبهها و اشیاء
- استخراج ویژگیها و دستهبندی
- پردازش ویدئو ویدئویی با فریمریت بالا
- تشخیص چهره و صورت با cascades و روشهای جدید و بسیاری ابزار دیگر را فراهم میکند.
نمونههای پایه:
import cv2
# بارگذاری تصویر
image = cv2.imread('image.jpg')
# تبدیل به خاکستری
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# نمایش تصویر
cv2.imshow('Gray Image', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
۲. Pillow (PIL Fork)
Pillow نسخه نگهداریشده و پیشرفتهتر از PIL است که برای کارهای ساده تا متوسط با تصاویر مناسب است:
- باز کردن، ذخیره، تبدیل فرمت
- تغییر اندازه، برش، چرخش، تغییر روشنایی/کنتراست
- کار با تصاویر دارای کانالهای مختلف و شفافیت (RGBA)
نمونه پایه:
from PIL import Image
image = Image.open('image.jpg')
image_resized = image.resize((300, 300))
image_resized.show()
۳. Scikit-Image
Scikit-Image کتابخانهای با APIهای ساده و استفاده از الگوریتمهای علمی و مهندسی برای تحلیل و پردازش تصاویر:
- فیلترها و فشردهسازی
- تبدیلهای مبتنی بر فضای رنگی
- یافتن لبهها و استخراج ویژگیها
- بازسازی، segmentatiom، و اندازهگیری خصوصیات
- تعامل خوب با NumPy
نمونه پایه:
from skimage import io, color
img = io.imread('image.jpg')
gray = color.rgb2gray(img)
io.imshow(gray)
io.show()
۴. NumPy و SciPy
- NumPy برای عملیات برداری با کارایی بالا و نمایش دادههای تصویری به صورت آرایههای چندبعدی
- SciPy برای فواصل، فیلترهای پیشرفته، و آنالیز سیگنال-تصویری
فصل سوم: عملیات پایه پردازش تصویر
تبدیل رنگها (Color Space Conversion)
تبدیل فضای رنگی برای تسهیل تحلیل یا بهبود تصاویر.
- OpenCV:
- cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # BGR به Grayscale
- cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # BGR به HSV
- Pillow:
- image.convert(‘L’) # grayscale
- image.convert(‘RGB’) # به RGB
مثال:
import cv2
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
تغییر اندازه و برش (Resize & Crop)
- Resize: تغییر ابعاد تصویر برای استانداردسازی ورودی مدلها یا کاهش هزینه محاسبه.
- Crop: بریدن بخش دلخواه از تصویر.
نمونه:
# Resize با OpenCV
resized = cv2.resize(image, (256, 256))
# Crop با NumPy
crop = image[100:400, 150:450] # برش از ردیف 100 تا 399 و ستون 150 تا 449
فیلترگذاری (Filtering)
- Gaussian Blur: کاهش نویز و هموارسازی تصویر
- Median Filter: حذف نویز Salt-and-Pepper
- Bilateral Filter: کاهش نویز با حفظ لبهها
- Sharpen/Unsharp Mask: افزایش وضوح
مثال:
blurred = cv2.GaussianBlur(image, (5, 5), 0)
median = cv2.medianBlur(image, 5)
sharpened = cv2.addWeighted(image, 1.5, blurred, -0.5, 0)
تغییر روشنایی و کنتراست
- اضافه/کم کردن نور با جمع کردن یک مقدار با هر پیکسل
- تبدیل به هیستوگرامی برای بهبود کنتراست
مثال:
bright = cv2.convertScaleAbs(image, alpha=1.2, beta=20) # alpha=اعضای بتا برای کنتراست، beta برای روشنایی
برشهای منطقی و ترکیبی (Masking)
استفاده از ماسک برای اعمال تغییرات فقط روی ناحیه خاص.
نمونه:
import numpy as np
mask = np.zeros(image.shape[:2], dtype=np.uint8)
mask[100:400, 150:450] = 255
masked = cv2.bitwise_and(image, image, mask=mask)
فصل چهارم: پردازش پیشرفته
تشخیص لبهها (Edge Detection)
الگوریتم Canny میتواند لبههای شیء را با پاسخدهی به تغییرات شدت نور پیدا کند.
edges = cv2.Canny(gray, 100, 200)
گزینههای دیگر:
- Sobel: مشتقات اولیه در جهتهای x و y
- Laplacian: تغییرات دوم
نمونه:
grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)
شناسایی اشیاء و چهرهها (Object & Face Detection)
OpenCV با Cascade Classifier و مدلهای Haar Cascades برای تشخیص چهره و اشیاء استفاده میشود.
نمونه:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
روشهای پیشرفتهتر شامل:
- الگوریتمهای مبتنی بر ماشین یادگیری
- شبکههای عمیق (DNN) برای تشخیص اشیاء
- استفاده از مدلهای سبک مانند SSD، YOLO، Faster R-CNN
پردازش مورفولوژیک (Morphological Operations)
برای تغییر شکل نواحی شیء با عملیات Erosion، Dilation، Opening و Closing است.
نمونه:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated = cv2.dilate(binary, kernel, iterations=1)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
تبدیل تصاویر به ویژگیها (Feature Extraction)
استخراج ویژگیهای محلی مانند Harris Corner Detector، ORB، SIFT (ممکن است در برخی نسخهها نیاز به مجوز داشته باشد).
نمونه ORB:
orb = cv2.ORB_create()
kp, des = orb.detectAndCompute(gray, None)
فصل پنجم: پروژههای واقعی
پروژه ۱: OCR (تشخیص متن)
تشخیص متن از تصاویر با استفاده از Tesseract OCR. برای استفاده از Tesseract، باید موتور Tesseract را نصب کرده و بسته pytesseract را در پایتون استفاده کنید.
import pytesseract
from PIL import Image
# اگر تِسرکِت نصب نیست، مسیر اجرایی را مشخص کنید
# pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract'
# بارگذاری تصویر
image = Image.open('document.jpg')
# پیشپردازش ساده: به grayscale و تبدیل به سیاه-سفید با threshold
gray_image = image.convert('L')
text = pytesseract.image_to_string(gray_image)
print(text)
برای نتایج بهتر:
- تصحیح نسبت ابعادی و مرزبندی مناسب
- بهبود کیفیت تصویر اولیه از طریق فیلترها و کاهش نویز
- استفاده از مدلهای زبان برای پایداری و درستی بیشتر متنها
پروژه ۲: سیستم شمارش اشیاء
سیستم شمارش اشیاء در یک ویدئو یا بازتاب از طریق تشخیص اشیاء، ردیابی و مقداردهی. روشهای ساده:
- فریم به فریم با استفاده از تشخیص اشیاء در هر فریم
- ردیابی اشیاء با Kalman Filter یا دوچرخههای ساده برای پیگیری
نمونه ایده:
- استفاده از background subtraction برای تشخیص حرکت در ویدئو
- شمارش هر شیء که از زمینه عبور میکند
نمونه کد ساده با OpenCV:
cap = cv2.VideoCapture('traffic.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read()
if not ret:
break
fgmask = fgbg.apply(frame)
# میتوانید برای تشخیص اشیاء از threshold استفاده کنید
thresh = cv2.threshold(fgmask, 244, 255, cv2.THRESH_BINARY)[1]
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
count = 0
for cnt in contours:
if cv2.contourArea(cnt) < 500:
continue
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
count += 1
cv2.putText(frame, f'Objects: {count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Tracking', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
بهبودها:
- استفاده از الگوریتمهای ردیابی مانند MedianFlow، CSRT یا KCF
- بهبود با مدلهای یادگیری عمیق برای تشخیص دقیقتر اشیاء
پروژه ۳: فیلترهای اینستاگرامی
طراحی فیلترهای تصویری با ترکیب تکنیکهای رنگی و ماتریسی برای ایجاد جلوههای هنری یا اصلاح رنگ.
نمونه:
- تغییر سردی/گرمی تصاویر با منحنی رنگ
- استفاده از LUT (Lookup Table) برای اعمال فیلترهای رنگی
- اعمال افکتهای مثل گرمی با ترکیب کانالها
مثال کد ساده:
def apply_sepia(img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
sepia_filter = np.array([[0.393, 0.769, 0.189],
[0.349, 0.686, 0.168],
[0.272, 0.534, 0.131]])
sepia = cv2.transform(img, sepia_filter)
sepia = np.clip(sepia, 0, 255)
return cv2.cvtColor(sepia.astype('uint8'), cv2.COLOR_RGB2BGR)
image = cv2.imread('portrait.jpg')
sepia_image = apply_sepia(image)
cv2.imshow('Sepia', sepia_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
فصل ششم: نکات و ترفندها
- حتماً تصاویر را قبل از پردازش نرمالسازی کنید. Normalize یا Standardize دادهها میتواند به بهبود عملکرد مدلها کمک کند.
- در پردازش ویدئو، به بهینهسازی سرعت و حافظه اهمیت دهید. از فریمهای نمونهبرداری، کاهش رزولوشن یا استفاده از پردازش با بافرهای مناسب بهره ببرید.
- از محیطهای مجازی (Virtualenv) برای نصب کتابخانهها استفاده کنید تا نسخههای کتابخانهها مستقل از سیستم باشند.
- برای کار با تصاویر بزرگ، از خواندن فقط بخشی از تصویر (patch-based processing) یا استفاده از استریمینگ استفاده کنید.
- همواره با ارزیابی کیفی و کمی نتایج را اندازهگیری کنید (مثلاً دقت تشخیص، نرخ اشتباه، نرخ فریم و غیره).
نتیجهگیری
پایتون و کتابخانههای قدرتمند آن، یادگیری و پیادهسازی پردازش تصویر را ساده و در عین حال توانمند ساختهاند. با سرمایهگذاری زمان برای یادگیری مفاهیم پایه و سپس تمرین عملی، میتوانید پروژههای متنوع از سادهترین تغییرات تصویری تا پیچیدهترین سامانههای بینایی ماشین را اجرا کنید.