راهنمای جامع پردازش تصویر با پایتون

نویسنده:
محمد سلطان پور
تاریخ انتشار:
21 مرداد 1404
دیدگاه ها:
پردازش تصویر با پایتون

پردازش تصویر (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) یا استفاده از استریمینگ استفاده کنید.
  • همواره با ارزیابی کیفی و کمی نتایج را اندازه‌گیری کنید (مثلاً دقت تشخیص، نرخ اشتباه، نرخ فریم و غیره).

نتیجه‌گیری

پایتون و کتابخانه‌های قدرتمند آن، یادگیری و پیاده‌سازی پردازش تصویر را ساده و در عین حال توانمند ساخته‌اند. با سرمایه‌گذاری زمان برای یادگیری مفاهیم پایه و سپس تمرین عملی، می‌توانید پروژه‌های متنوع از ساده‌ترین تغییرات تصویری تا پیچیده‌ترین سامانه‌های بینایی ماشین را اجرا کنید.

پرسش‌های متداول

۱. پردازش تصویری با پایتون چیست و چه کاربردی دارد؟

پردازش تصویری با پایتون مجموعه‌ای از ابزارها و کتابخانه‌ها برای تحلیل، بهبود و استخراج اطلاعات از تصاویر است که در حوزه‌هایی مثل هوش مصنوعی، پزشکی، امنیت و صنعت کاربرد دارد.

۲. چه کتابخانه‌هایی برای پردازش تصویر با پایتون رایج هستند؟

کتابخانه‌های OpenCV، Pillow، scikit-image و TensorFlow/Keras از معروف‌ترین ابزارها هستند که برای کارهای مختلف پردازش تصویر استفاده می‌شوند.

۳. آیا می‌توان با پایتون تصاویر را ویرایش و فیلترگذاری کرد؟

بله، با کتابخانه‌هایی مثل OpenCV یا Pillow می‌توان انواع فیلترها را اعمال، اندازه تصاویر را تغییر، متن اضافه یا نویز را حذف کرد.

۴. یادگیری پردازش تصویر با پایتون به چه پیش‌نیازهایی نیاز دارد؟

آشنایی مقدماتی با برنامه‌نویسی پایتون، مفاهیم پایه ریاضی، جبر خطی و مختصری از پردازش سیگنال‌ها می‌تواند یادگیری را بسیار آسان‌تر کند.

۵. آیا می‌توان تشخیص چهره را با پایتون انجام داد؟

بله، با استفاده از OpenCV یا کتابخانه face_recognition می‌توان سیستم‌های تشخیص چهره با دقت بالا طراحی و پیاده‌سازی کرد.

۶. پایتون برای پردازش تصویر سنگین و بلادرنگ مناسب است؟

برای پردازش‌های سنگین می‌توان از پایتون همراه با کتابخانه‌های بهینه یا شتاب‌گیری GPU استفاده کرد، اما در موارد بلادرنگ بهتر است کد با زبان‌های سریع‌تر یا C++ در ترکیب با پایتون استفاده شود.

۷. چگونه می‌توان تصاویر را با پایتون به فرمت‌های مختلف ذخیره کرد؟

با تابع imwrite در OpenCV یا متد save در Pillow می‌توان تصاویر را در فرمت‌هایی مثل JPG، PNG و TIFF ذخیره کرد.

۸. مهم‌ترین تکنیک‌های پیش‌پردازش تصویر در پایتون کدام‌اند؟

تغییر اندازه، نرمال‌سازی، نویزگیری، افزایش کنتراست و تبدیل فضاهای رنگی از معروف‌ترین تکنیک‌ها هستند.

۹. آیا پردازش تصویر با پایتون در یادگیری ماشین کاربرد دارد؟

بله، بسیاری از مدل‌های یادگیری ماشین و یادگیری عمیق برای آموزش و پیش‌بینی نیاز به پردازش اولیه تصاویر دارند.

۱۰. چگونه می‌توان پروژه‌های پردازش تصویر را در پایتون تست و دیباگ کرد؟

استفاده از نمایش مرحله‌ای خروجی‌ها، نوشتن تست‌های واحد، و ذخیره نتایج موقت در فایل‌ها کمک می‌کند تا اشکال‌های احتمالی در کد شناسایی و رفع شوند.

مطالب مرتبط

رتبه‌بندی کیفیت محصول

رتبه‌بندی کیفیت محصول (Quality Grading) با پردازش تصویر

فناوری دوربین صنعتی باسلر

فناوری دوربین صنعتی: راهنمای جامع برای شناخت، انتخاب و استفاده

رزولوشن دوربین باسلر -مرکز خرید دوربین صنعتی

نوین ایلیا: جامع‌ترین مرکز فروش دوربین صنعتی در ایران

پردازش تصویر با پایتون

راهنمای جامع پردازش تصویر با پایتون

تشخیص ترک فلز

تشخیص ترک فلز با بینایی ماشین (با استفاده از دوربین‌های Basler)

شبکه عصبی پردازش تصویر: راهنمای جامع از مبانی تا کاربردهای پیشرفته (۲۰۲۵)

شبکه عصبی پردازش تصویر: راهنمای جامع از مبانی تا کاربردهای پیشرفته (۲۰۲۵)