فیلترگذاری تصویر در بینایی ماشین: راهنمایی برای مبتدیان
مقدمه در دنیای بهسرعت در حال پیشرفت تولید و اتوماسیون، بینایی ماشین به عنوان یکی از تکنولوژیهای بنیادین مطرح شده است که به ماشینها امکان “دیدن” و تفسیر دادههای بصری را میدهد. در قلب بینایی…
مقدمه
در دنیای بهسرعت در حال پیشرفت تولید و اتوماسیون، بینایی ماشین به عنوان یکی از تکنولوژیهای بنیادین مطرح شده است که به ماشینها امکان “دیدن” و تفسیر دادههای بصری را میدهد. در قلب بینایی ماشین، تکنیکی اساسی به نام فیلترگذاری تصویر قرار دارد که نقش مهمی در بهبود کیفیت تصویر، کاهش نویز و استخراج ویژگیهای مفید ایفا میکند.
چه در حال توسعه یک سیستم بینایی برای بازرسی کیفیت روی خط تولید باشید و چه تازه قصد دارید وارد دنیای پردازش تصویر شوید، آشنایی با فیلترگذاری تصویر ضروری است. این پست به معرفی مفاهیم اصلی فیلترگذاری تصویر، مرور انواع متداول فیلترها، و نشان دادن نحوه پیادهسازی آنها با استفاده از OpenCV در پایتون میپردازد، با تأکید ویژه بر کاربرد در کنترل کیفیت.
فیلترگذاری تصویر چیست؟
فیلترگذاری تصویر فرایندی است برای دستکاری یا بهبود تصاویر از طریق تغییر مقادیر پیکسلها بر اساس عملیات ریاضی. فیلترها معمولاً برای حذف نویز، برجستهسازی ویژگیها، تشخیص لبه، یا انجام عملیات تاری و شارپ کردن به کار میروند.
عملیات فیلترگذاری غالباً با استفاده از یک هسته (Kernel) یا ماسک انجام میشود؛ ماتریسی کوچک که روی تصویر “میخزد” و مقادیر پیکسلهای خروجی را بر اساس محاسبات محلی تعیین میکند.
اهمیت فیلترگذاری در بینایی ماشین
در سیستمهای بینایی ماشین، بهویژه آنهایی که برای کنترل کیفیت کاربرد دارند، وضوح تصویر و قابلیت تشخیص ویژگیها بسیار مهم است. دلایل اصلی ضرورت فیلترگذاری عبارتاند از:
- کاهش نویز: تصاویر خام اغلب شامل نویز الکتریکی یا محیطی هستند. فیلترها کمک میکنند این نویز سرکوب شود تا از تشخیصهای نادرست جلوگیری شود.
- تشخیص لبه: استخراج لبهها امکان شناسایی خراشها، شکستگیها یا عدم انطباق را فراهم میکند.
- تقویت ویژگی: برخی فیلترها با برجستهسازی بافتها یا اشکال خاص، در تشخیص اشیا مؤثرند.
- تاری و هموارسازی: آمادهسازی تصویر برای مرحلههای بعدی مانند بخشبندی یا آستانهگذاری.
دستهبندی فیلترها
فیلترهای تصویر را میتوان به دو دسته کلی تقسیم کرد:
۱. فیلترهای خطی
این فیلترها مقدار پیکسل خروجی را به صورت ترکیب خطی از پیکسلهای مجاور محاسبه میکنند.
الف. فیلتر میانگین (Averaging)
- هدف: تارکردن تصویر و کاهش نویز.
- مثال هسته: 19[111111111]\frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}
- تأثیر: هموارسازی تغییرات، مفید قبل از تشخیص لبه.
ب. فیلتر گاوسی (Gaussian)
- هدف: شبیه به فیلتر میانگین اما با وزندهی به پیکسلهای مرکزی.
- تأثیر: حفظ بهتر لبهها در حین کاهش نویز.
ج. فیلتر لاپلاسیان (Laplacian)
- هدف: تشخیص لبه با برجستهسازی نواحی تغییرات شدید شدت.
- تأثیر: اغلب پس از تاری گاوسی برای تقویت لبهها کاربرد دارد.
۲. فیلترهای غیرخطی
این فیلترها از عملیات غیرخطی استفاده میکنند و معمولاً در سرکوب نویز بدون تار کردن لبهها مؤثرترند.
الف. فیلتر میانه (Median)
- هدف: جایگزینی هر پیکسل با میانهی مقادیر همسایگانش.
- تأثیر: حذف نویز نمک-فلفل بهخوبی.
ب. فیلتر دوجانبه (Bilateral)
- هدف: هموارسازی همراه با حفظ لبهها.
- تأثیر: ایدئال برای حفظ بافت و جزئیات در سیستمهای بازرسی.
کاربرد در کنترل کیفیت
در محیطهای صنعتی، بینایی ماشین برای موارد زیر استفاده میشود:
- کشف عیوب سطحی (خراشها، ترکها)
- بررسی برچسب و تشخیص بارکد
- اندازهگیری ابعاد و بررسی تراز
در این فرآیندها، فیلترگذاری باعث افزایش دیدپذیری عیوب یا حذف نویزهای غیرمرتبط میشود تا بازرسی دقیقتر انجام گیرد.
سناریوی نمونه:
دوربینی روی نوار نقاله بطریهای شیشهای را ضبط میکند. برای تشخیص خراشهای سطحی، ابتدا تصویر را هموار میکنیم، سپس لبهها را استخراج و الگوهای غیرعادی را جدا میکنیم.
شروع با OpenCV
OpenCV کتابخانهای متنباز و قدرتمند برای پردازش تصویر است. در ادامه نحوه اعمال فیلترها با استفاده از OpenCV در پایتون را میآموزیم.
نصب
pip install opencv-python
مثالهای عملی با OpenCV
۱. بارگذاری و نمایش تصویر
import cv2
import matplotlib.pyplot as plt
# بارگذاری تصویر به صورت خاکستری
image = cv2.imread('sample_part.jpg', cv2.IMREAD_GRAYSCALE)
# نمایش با matplotlib
plt.imshow(image, cmap='gray')
plt.title('تصویر اصلی')
plt.axis('off')
plt.show()
۲. فیلتر میانگین (Mean Filter)
# فیلتر ۵×۵ میانگین
blurred = cv2.blur(image, (5, 5))
plt.imshow(blurred, cmap='gray')
plt.title('تصویر با فیلتر میانگین')
plt.axis('off')
plt.show()
۳. فیلتر گاوسی (Gaussian Filter)
# تاری گاوسی با هسته ۵×۵
gaussian = cv2.GaussianBlur(image, (5, 5), 0)
plt.imshow(gaussian, cmap='gray')
plt.title('تصویر با فیلتر گاوسی')
plt.axis('off')
plt.show()
۴. فیلتر میانه (Median Filter)
# فیلتر میانه با اندازه ۵
median = cv2.medianBlur(image, 5)
plt.imshow(median, cmap='gray')
plt.title('تصویر با فیلتر میانه')
plt.axis('off')
plt.show()
۵. فیلتر دوجانبه (Bilateral Filter)
# پارامترها: قطر هسته، sigmaColor، sigmaSpace
bilateral = cv2.bilateralFilter(image, 9, 75, 75)
plt.imshow(bilateral, cmap='gray')
plt.title('تصویر با فیلتر دوجانبه')
plt.axis('off')
plt.show()
۶. تشخیص لبه با لاپلاسیان (Laplacian)
# اعمال لاپلاسیان
laplacian = cv2.Laplacian(image, cv2.CV_64F)
plt.imshow(laplacian, cmap='gray')
plt.title('تشخیص لبه با لاپلاسیان')
plt.axis('off')
plt.show()
کاربرد هر فیلتر در کنترل کیفیت
نکات کلیدی و بهترین روشها
- اندازه هسته مهم است: هستههای بزرگتر تاری قویتری ایجاد میکنند اما ممکن است جزئیات مهم را نیز از بین ببرند.
- حفظ وضوح: مگر در صورت ضرورت، از کاهش رزولوشن خودداری کنید تا جزئیات ظریف حفظ شوند.
- توازن بین لبه و جزئیات: وقتی حفظ لبهها مهم است، از فیلترهای میانه یا دوجانبه استفاده کنید.
- ترکیب فیلترها: اغلب فیلتر گاوسی قبل از تشخیص لبه برای پایداری نتایج به کار میرود.
مطالعه موردی واقعی: تشخیص خراش بر روی قطعات فلزی
مسئله: کارخانهای نیاز دارد خراشهای سطحی روی صفحههای فلزی را بهصورت خودکار تشخیص دهد.
راهحل:
- ثبت تصویر: تصاویر با وضوح بالا و خاکستری بهصورت بلادرنگ ضبط میشوند.
- فیلتر میانه: نویز حذف شده ولی خطوط خراش حفظ میشود.
- لاپلاسیان: خراشها به عنوان تغییرات ناگهانی شدت برجسته میشوند.
- آستانهگذاری و بخشبندی: تبدیل به تصویر باینری و یافتن کانتور.
- تصمیمگیری: اگر طول کانتور از آستانه تعیینشده بیشتر باشد، قطعه حذف میشود.
قطعه کد نمونه:
# فیلتر میانه برای کاهش نویز
median = cv2.medianBlur(image, 5)
# تشخیص لبه با لاپلاسیان
edges = cv2.Laplacian(median, cv2.CV_64F)
edges = cv2.convertScaleAbs(edges)
# آستانهگذاری باینری
_, thresh = cv2.threshold(edges, 30, 255, cv2.THRESH_BINARY)
# یافتن کانتور (خراشها)
contours, _ = cv2.findContours(
thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
# بررسی هر کانتور
for cnt in contours:
if cv2.arcLength(cnt, True) > 100: # آستانه نمونه
print("عیب شناسایی شد!")
جمعبندی
فیلترگذاری تصویر در بینایی ماشین یکی از گامهای اساسی در سیستمهای بازرسی صنعتی است. از تاری ساده تا تشخیص لبهی پیشرفته، انتخاب صحیح فیلتر میتواند دقت بازرسی را بهطور چشمگیری افزایش دهد و از تشخیصهای نادرست جلوگیری کند.
با درک انواع فیلترها، مکانیسم عملکرد آنها و نحوه پیادهسازی در OpenCV، حتی مبتدیان میتوانند بهسرعت سیستمهای عملی و قابل اعتمادی برای کنترل کیفیت بسازند.
منابع بیشتر
- مستندات OpenCV: https://docs.opencv.org
- کتاب “Digital Image Processing” نوشته Gonzalez & Woods
- پروژههای پردازش تصویر در Kaggle
- دورههای Udemy و Coursera در حوزه بینایی ماشین
فیلترگذاری تصویر در بینایی ماشین نقش حیاتی در خودکارسازی بازرسی و افزایش کیفیت محصولات دارد. با تسلط بر این تکنیکها، میتوانید گامهای نخست را در ساخت سیستمهای بینایی دقیق و هوشمند بردارید.