پردازش تصویر - شمارش لوله ها

blog
۱۴۰۰-۰۴-۰۱
5 دقیقه

میدونستین در تولیدی‌های لوله و اتصالات، برای شمارش لوله‌ها در هر دسته، داخل هر لوله سنگ میذارن؟
چرا سنگ میذارن؟
چون لوله‌ها که کنار هم و روی هم قرار داده می‌شوند، خطای دید ایجاد می‌کنند، برای اینکه دچار خطا نشن، داخل لوله‌های شمرده شده، یک سنگ میذارن، که دوباره نشمارنشون!

 

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

لوله ها

این کار هم خیلی سخته هم خیلی زمان زیادی میبره… حدس زدید چی میخوام بگم؟ بله…! با هوش مصنوعی میتونیم این کار رو تا حد بسیار زیادی خودکار کنیم!

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

مثلاً در تصویر زیر به روش Laplacian لبه‌ها تشخیص داده شده:

لوله ها سیاه و سفید

ابزاری که برای این کار استفاده می‌کنیم، کتابخانه OpenCV و زبان Python هست و همه کدها قابل اجرا به روی Raspberry Pi Zero هستند.

به جای اینکه ایده کلی رو از 0 تا 100 پیاده سازی کنیم و درگیر محاسبات ریاضی بشیم، از توابع آماده OpenCV استفاده می‌کنیم.

 

روش اول، استفاده از HoughCircles

این تابع از روش Hough Gradient استفاده میکنه، برای تشخیص تعداد لوله ها مراحل زیر رو انجام میدیم:

اول تصویر رو از فایل میخونیم و با تابع cvtColor تصویر رو از RGB به GRAY تبدیل می‌کنیم، چون به اطلاعات رنگ‌ها برای تشخیص لبه‌ها نیازی نداریم.

بعد با استفاده از medianBlur تصویر رو کمی محو می‌کنیم تا نویز کمتر بشه.

حالا میریم سراغ صدا کردن تابع  HoughCircles:

پارامتر اول: تصویر (خاکستری)

پارامتر دوم: متد (HOUGH_GRADIENT)

پارامتر سوم: نسبت معکوس رزولوشن اکومولاتور (جزئی از واحد محاسبه گر متد) به تصویر اصلی

پارامتر چهارم: حداقل فاصله بین دایره ها، اگه این مقدار کم باشه، نتیجه احتمالا اشتباه میشه

پارامتر پنجم: مقداری که به Canny Edge Detector، برای تشخیص لبه ها ارسال میشه

پارامتر ششم: آستانه مرکز دایره ها، هرچه کمتر باشد، خطا بیشتر میشود

پارامتر هفتم: حداقل شعاع دایره

پارامتر هشتم: حداکثر شعاع دایره

 

در نهایت لیست نقاط مرکز دایره‌ها رو خواهیم داشت که به روی تصویر نمایش میدیم.

تشخیص لوله

این روش برای تصویر اولی که در این مقاله آورده شده، تشخیص درستی نمیده (ممکنه با دست‌کاری پارامترها به نتیجه برسیم، اما تا میتونیم باید با دست‌کاری های کمتر نتیجه بگیریم).
ایراد این روش اینه که پارامترهای کمی برای کنترل داره و بیشتر دنبال دایره‌های کامل میگرده و اگه ما شبه-دایره ها رو هم بخواهیم (مثل بیضی) استفاده از این روش کار رو سخت میکنه.
معمولاً بسته به اندازه تصویر و زاویه‌ای که با دوربین عکس‌برداری میشه، دایره‌ها حالت بیضی شکل پیدا می‌کنند یا گاهی قسمتی از لوله‌ها پشت لوله‌های دیگه پنهان میشن.

 

روش دوم، استفاده از SimpleBlobDetector_create

این تابع برای تشخیص محدوده هاست و از روش Thresholding چندین تصویر 0 و 1 از تصویر اصلی ایجاد میکنه تا تشخیص خودش رو انجام بده.

برای تشخیص تعداد لوله ها مراحل زیر رو انجام میدیم:

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

با True کردن filterByArea به تابع میگیم که مساحت محدوده ها رو در نظر بگیره و با تنظیم minArea مساحت رو به حداقل مقداری تنظیم میکنیم.

با True کردن filterByCircularity به تابع میگیم که میزان دایره ای شکل بودن محدوده رو در نظر بگیره، و با تنظیم minCircularity که یک عدد اعشاریع، میزان دایره ای شکل بودن محدوده رو تنظیم میکنیم.

با تنظیم minConvexity و minInertiaRatio میزان محدب بودن و میزان حداقل اینرسی (مقاومت به تغییرات) محدوده رو تنظیم می‌کنیم.

 

در ادامه این پارامترها رو پاس میدیم به تابع SimpleBlobDetector_create تا یک شیء تشخیص دهنده به ما برگردونه.
دستور detect رو بر روی تشخیص دهنده صدا می‌کنیم و به عنوان پارامتر تصویر رو بهش پاس میدیم و محدوده‌های تشخیص داده شده را دریافت می‌کنیم.
محدوده‌های تشخیص داده شده رو با استفاده از تابع drawKeypoints بر روی تصویر نقاشی می‌کنیم.

پردازش تصویر - شمارش لوله ها

این روش نسبت به روش قبلی، انعطاف بالاتری داره و اجازه میده تا اشکالی که کاملاً دایره شکل نیستند رو هم تشخیص بدیم.

تمامی این کدها بر روی Raspberry Pi تست شده و به خوبی اجرا میشه.

اطلاعات
7
0
لینک و اشتراک
profile

علی اشتهاری پور

متخصص الکترونیک

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

دیدگاه ها

profile
مجید پاشائی گفت :
۱۴۰۳-۰۳-۱۹ ۱۵:۲۴

سلام وقت بخیر من میخوام تعداد اجزای داخل یک کشو کمدی رو بشمر چطور میتونم انجامش بدم ؟

profile
Ashkan گفت :
۱۴۰۰-۰۴-۰۲ ۰۹:۰۵

سلام وقت بخیر
من میخواستم یه لیزر قرمز یا سبز رو به یه هدفی که شامل رنگ های مختلف هست بندازم ، برای مثال هدفم یه مربع در فاصله ۱۰_۱۵ متری هست که شامل رنگ های مختلفه و حالا با انداختن لیزر و با raspberry zero میخواستم تشخیص بدم که لیزر دقیقه کجای اون قسمت رنگی قرار داره
ممنون میشم اگر بتونید کمکی کنید

profile
علی اشتهاری پور گفت :
۱۴۰۰-۰۴-۰۳ ۰۰:۰۲

سلام
اگه درست متوجه شده باشم، میخواهین مکان نقطه‌ای لیزر رو روی مربع تشخیص بدین؟

profile
Ashkan گفت :
۱۴۰۰-۰۴-۰۵ ۱۳:۲۵

بله دقیقا

profile
علی اشتهاری پور گفت :
۱۴۰۰-۰۴-۰۶ ۱۱:۳۲

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

profile
امیر حسین گفت :
۱۴۰۰-۰۴-۰۱ ۱۴:۴۶

عالی حالا چطور میشه سایز هاشم جدا کنه؟!

profile
علی اشتهاری پور گفت :
۱۴۰۰-۰۴-۰۲ ۰۶:۱۴

درست متوجه سوالتون نشدم، یعنی بر اساس سایز دسته بندی کنه؟

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله