FA-TOOLS — Header Component
آموزش پردازش تصویر و بینایی ماشین با کتابخانه OpenCV در پایتون

آموزش OpenCV با پایتون — پردازش تصویر از صفر تا صد

خلاصه کاربردی این مقاله:
با خواندن این راهنما، یاد می‌گیرید چطور با پایتون و کتابخانه OpenCV، تصاویر را لود کنید، فیلترهای کاهش نویز روی آن‌ها اعمال کنید، لبه‌های اشیاء را تشخیص دهید و حتی یک سیستم تشخیص چهره ساده با وبکم بسازید. این مقاله تمام کدهای مورد نیاز شما را همراه با توضیحات خط‌به‌خط ارائه می‌دهد تا بتوانید فوراً وارد دنیای بینایی ماشین شوید.

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

۱. OpenCV چیست و چرا پایتون؟

آموزش OpenCV با پایتون — پردازش تصویر — تصویر 1

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

ترکیب پایتون و OpenCV به شما این امکان را می‌دهد که ایده‌های پردازش تصویر خود را با سرعت بسیار بالایی به نمونه‌های اولیه (Prototype) تبدیل کنید. از آنجایی که پایتون از کتابخانه‌های قدرتمندی مانند NumPy برای محاسبات عددی استفاده می‌کند، پردازش ماتریس‌های تصویر در آن بسیار بهینه و سریع انجام می‌شود. اگر می‌خواهید سرعت کدنویسی خود را افزایش دهید، می‌توانید از تکه‌کدهای پایتون برای کارهای تکراری و بهینه‌سازی پروژه‌های خود استفاده کنید.

۲. نصب و راه‌اندازی محیط کار

آموزش OpenCV با پایتون — پردازش تصویر — تصویر 2

برای شروع کار با OpenCV، ابتدا باید پایتون را روی سیستم خود نصب داشته باشید. فرآیند نصب کتابخانه OpenCV بسیار ساده است و تنها با چند دستور در ترمینال یا خط فرمان انجام می‌شود.

  1. خط فرمان (Terminal یا Command Prompt) خود را باز کنید.
  2. دستور زیر را برای نصب پکیج اصلی OpenCV اجرا کنید:
pip install opencv-python
  1. برای دسترسی به ابزارهای اضافی و مشارکت‌کننده‌ها (مانند برخی الگوریتم‌های پیشرفته‌تر)، پکیج زیر را نیز نصب کنید:
pip install opencv-contrib-python

پس از اتمام نصب، با نوشتن یک اسکریپت ساده و ایمپورت کردن cv2، از نصب صحیح آن مطمئن شوید.

۳. گام اول: خواندن، نمایش و ذخیره تصاویر

آموزش OpenCV با پایتون — پردازش تصویر — تصویر 3

سه کارکرد اصلی در پردازش تصویر شامل خواندن تصویر با cv2.imread، نمایش آن با cv2.imshow و ذخیره فایل جدید با cv2.imwrite است. این دستورات پایه‌ای‌ترین ابزارهای شما برای شروع هر پروژه بصری هستند.

در ادامه کدی را مشاهده می‌کنید که یک تصویر را از روی هارد دیسک شما می‌خواند، آن را در یک پنجره به شما نشان می‌دهد و سپس یک کپی از آن ذخیره می‌کند:

import cv2

# ۱. خواندن تصویر (مسیر فایل را جایگزین کنید)
image = cv2.imread('input.jpg')

# ۲. نمایش تصویر در یک پنجره
cv2.imshow('Original Image', image)

# منتظر ماندن برای فشردن یک کلید توسط کاربر (۰ یعنی توقف نامحدود)
cv2.waitKey(0)

# ۳. ذخیره تصویر با نام و فرمت جدید
cv2.imwrite('output_copy.png', image)

# بستن تمامی پنجره‌های باز شده توسط OpenCV
cv2.destroyAllWindows()

۴. مفاهیم پایه: سیستم مختصات و کانال‌های رنگی

آموزش OpenCV با پایتون — پردازش تصویر — تصویر 4

برخلاف اکثر ابزارهای گرافیکی که از سیستم رنگی RGB (قرمز، سبز، آبی) استفاده می‌کنند، OpenCV به صورت پیش‌فرض تصاویر را به صورت BGR (آبی، سبز، قرمز) می‌خواند. این نکته بسیار حیاتی است؛ زیرا اگر تصویر خود را بدون تبدیل در کتابخانه‌های دیگری مثل Matplotlib نمایش دهید، رنگ‌ها جابه‌جا و غیرطبیعی به نظر می‌رسند.

سیستم مختصات تصاویر در OpenCV از گوشه بالا سمت چپ شروع می‌شود که نقطه (0, 0) است. محور X به سمت راست و محور Y به سمت پایین حرکت می‌کند. هر تصویر در حقیقت یک آرایه چندبعدی از اعداد (پیکسل‌ها) است که به راحتی با استفاده از کتابخانه NumPy قابل دسترسی و تغییر است.

# تبدیل سیستم رنگی از BGR به RGB برای نمایش صحیح در سایر کتابخانه‌ها
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# تبدیل تصویر به سیاه و سفید (Grayscale) که در پردازش تصویر بسیار پرکاربرد است
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

۵. تغییر سایز، برش و چرخش تصاویر

آموزش OpenCV با پایتون — پردازش تصویر — تصویر 5

یکی از نیازهای همیشگی در پردازش تصویر، آماده‌سازی تصاویر با ابعاد مشخص است. با استفاده از برش (Cropping) و تغییر اندازه (Resizing) می‌توانید ابعاد تصویر را برای مدل‌های یادگیری ماشین یا نمایش در وب بهینه‌سازی کنید.

  • تغییر اندازه (Resize): با مشخص کردن طول و عرض جدید انجام می‌شود.
  • برش (Crop): به سادگی و با استفاده از اسلایس کردن آرایه‌های پایتون (Slicing) انجام می‌گیرد.
  • چرخش (Rotation): با استفاده از توابع پیش‌فرض چرخش یا ماتریس‌های انتقال قابل انجام است.
# تغییر اندازه تصویر به ابعاد ۳۰۰ در ۳۰۰ پیکسل
resized_img = cv2.resize(image, (300, 300))

# برش بخشی از تصویر (فرمت اسلایس: [y_start:y_end, x_start:x_end])
cropped_img = image[50:250, 100:300]

# چرخش ۹۰ درجه تصویر در جهت عقربه‌های ساعت
rotated_img = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)

۶. فیلترها و هموارسازی تصویر (Blurring)

تار کردن یا هموارسازی تصویر (Blurring) تکنیکی برای کاهش نویز و جزئیات اضافی است. با این کار، الگوریتم‌های پردازش بعدی می‌توانند روی اشکال و کلیات تصویر متمرکز شوند و خطاها کاهش یابند.

در جدول زیر انواع فیلترهای تارکننده محبوب در OpenCV و کاربرد اصلی هرکدام را مقایسه کرده‌ایم:

نوع فیلتر کاربرد اصلی
Gaussian Blur (محو شدگی گاوسی) کاهش نویزهای معمولی و نرم کردن تصویر قبل از اعمال لبه‌یاب‌ها.
Median Blur (فیلتر میانه) بسیار موثر برای حذف نویزهای نقطه‌ای یا اصطلاحاً «نمک و فلفلی».
Bilateral Filter (فیلتر دوجانبه) کاهش نویز به صورت هوشمند در حالی که لبه‌های تیز تصویر حفظ می‌شوند.

پیاده‌سازی این فیلترها با توابع داخلی OpenCV بسیار آسان است:

# اعمال فیلتر گاوسی با کرنل ۵ در ۵
gaussian = cv2.GaussianBlur(image, (5, 5), 0)

# اعمال فیلتر میانه با اندازه کرنل ۵
median = cv2.medianBlur(image, 5)

# اعمال فیلتر دوجانبه
bilateral = cv2.bilateralFilter(image, 9, 75, 75)

۷. لبه‌یابی و تشخیص مرزها (Edge Detection)

لبه‌یابی فرآیند شناسایی نقاطی از تصویر دیجیتال است که در آن‌ها درخشندگی یا رنگ به سرعت تغییر می‌کند. الگوریتم Canny یکی از معروف‌ترین و دقیق‌ترین روش‌های لبه‌یابی در OpenCV است.

برای گرفتن بهترین نتیجه از الگوریتم Canny، بهتر است ابتدا تصویر را به سیاه و سفید تبدیل کرده و با فیلتر گاوسی کمی آن را تار کنید تا نویزهای ریز لبه‌های کاذب ایجاد نکنند:

# تبدیل به سیاه و سفید و کاهش نویز
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# لبه‌یابی با الگوریتم Canny (آستانه پایین: ۵۰، آستانه بالا: ۱۵۰)
edges = cv2.Canny(blurred, 50, 150)

# نمایش نتیجه لبه‌یابی
cv2.imshow('Edges Detected', edges)
cv2.waitKey(0)

۸. آستانه‌گذاری و باینری کردن تصویر

آستانه‌گذاری (Thresholding) تکنیکی است که با آن می‌توان تصویر را به دو بخش کاملاً سیاه و کاملاً سفید (باینری) تبدیل کرد. این کار به تفکیک اشیاء پس‌زمینه از پیش‌زمینه کمک زیادی می‌کند.

دو نوع آستانه‌گذاری اصلی داریم: ساده (ثابت برای کل تصویر) و انطباقی یا Adaptive (محاسبه آستانه بر اساس هر پیکسل و همسایگی آن). نمونه کد زیر تفاوت این دو را نشان می‌دهد:

# آستانه‌گذاری ساده (پیکسل‌های بالای ۱۲۷ سفید و بقیه سیاه می‌شوند)
_, thresh_simple = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# آستانه‌گذاری انطباقی (مناسب برای شرایط نوری متغیر)
thresh_adaptive = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    cv2.THRESH_BINARY, 11, 2
)

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

۹. پروژه کاربردی: تشخیص چهره ساده با وبکم

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

توجه داشته باشید که ابتدا باید فایل haarcascade_frontalface_default.xml را دانلود کرده و در کنار فایل اسکریپت پایتون خود قرار دهید.

import cv2

# بارگذاری مدل تشخیص چهره
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# اتصال به وبکم (عدد 0 نشان‌دهنده وبکم پیش‌فرض است)
cap = cv2.VideoCapture(0)

while True:
    # خواندن فریم به فریم ویدیو
    ret, frame = cap.read()
    if not ret:
        break
        
    # تبدیل فریم به سیاه و سفید برای کارایی بهتر مدل
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # تشخیص چهره‌ها در تصویر
    faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5)
    
    # رسم مستطیل دور چهره‌های تشخیص داده شده
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)
        
    # نمایش خروجی زنده
    cv2.imshow('Face Detection Live', frame)
    
    # خروج از حلقه با فشردن کلید 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# آزادسازی منابع دوربین و بستن پنجره‌ها
cap.release()
cv2.destroyAllWindows()

۱۰. عیب‌یابی سریع و رفع خطاهای رایج

هنگام کار با OpenCV، ممکن است با خطاهایی روبرو شوید که فرآیند اجرای کدهای شما را متوقف کنند. در این بخش، چند مورد از شایع‌ترین خطاها و راه‌حل‌های سریع آن‌ها را بررسی می‌کنیم:

  • خطای cv2.error: OpenCV(4.x.x) ... assertion failed:
    این خطا معمولاً به این معنی است که تصویر در مسیر مشخص شده پیدا نشده است. ابتدا آدرس فایل تصویر را چک کنید و مطمئن شوید فرمت فایل (مانند png یا jpg) درست تایپ شده باشد. همچنین از وجود تصویر در پوشه فعال مطلع شوید.
  • قفل شدن یا هنگ کردن پنجره‌های نمایش تصویر:
    اگر از متد cv2.imshow استفاده کرده‌اید اما خط کد cv2.waitKey(0) را ننوشته باشید، پنجره نمایش قفل می‌شود. همواره بعد از نمایش تصویر از این متد و در پایان کار از cv2.destroyAllWindows() استفاده کنید.
  • اشتباه بودن رنگ‌های تصویر خروجی:
    به یاد داشته باشید که سیستم پیش‌فرض رنگی در OpenCV به صورت BGR است. اگر تصویر خود را با کتابخانه‌های دیگر لود کرده یا می‌خواهید صادر کنید، حتماً از تابع تبدیل فضا رنگی cv2.cvtColor(image, cv2.COLOR_BGR2RGB) استفاده کنید.

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

چرا تصاویر در خروجی برنامه‌های دیگر آبی به نظر می‌رسند؟

دلیل این اتفاق تفاوت در چینش کانال‌های رنگی است. OpenCV تصاویر را در فرمت BGR (آبی-سبز-قرمز) می‌خواند، در حالی که اکثر کتابخانه‌ها مثل Matplotlib از استاندارد RGB استفاده می‌کنند. برای حل این مشکل باید پیش از نمایش با ابزارهای دیگر، سیستم رنگی را تبدیل کنید.

آیا با OpenCV می‌توان روی ویدیوها هم پردازش انجام داد؟

بله، ویدیو در حقیقت مجموعه‌ای از تصاویر پشت سر هم (فریم‌ها) است. با استفاده از کلاس VideoCapture در OpenCV می‌توانید فریم‌ها را یکی‌یکی دریافت کرده و تمامی فیلترها و پردازش‌های گفته شده در این مقاله را روی تک‌تک فریم‌ها اعمال کنید.

تفاوت بین روش‌های ساده و انطباقی آستانه‌گذاری چیست؟

در روش ساده، یک حد آستانه ثابت (مثلاً ۱۲۷) برای کل تصویر انتخاب می‌شود. اما در روش انطباقی (Adaptive)، مقدار آستانه برای هر پیکسل بر اساس میانگین نوری محلی اطراف همان پیکسل محاسبه می‌شود که برای تصاویر با سایه روشن‌های شدید فوق‌العاده کاربردی است.

آیا یادگیری OpenCV برای ورود به حوزه یادگیری عمیق ضروری است؟

بله، تقریباً در تمام پروژه‌های بینایی ماشین و یادگیری عمیق، پیش از وارد کردن تصاویر به شبکه‌های عصبی (مانند CNN)، نیاز است که تصاویر پیش‌پردازش شوند. OpenCV استانداردترین ابزار دنیا برای این پیش‌پردازش‌ها (مثل تغییر اندازه، تغییر کنتراست و حذف نویز) است.

Table of Contents

آخرین نوشته‌ها