استفاده از تبدیل Hough Circle برای شناسایی دایره های موجود در تصویر

به نام خدا و باسلام

در این مطلب قصد دارم  یک کد به منظور پیدا کردن دایره هایی که درون یک تصویر وجود دارد بنویسم. برای این کار از تبدیل Hough Circle استفاده می کنم. اما این تبدیل چگونه کار می کند؟ مختصات یک دایره به صورت زیر است:

(x-x_{center})^2 + (y - y_{center})^2 = r^2

   پس برای شناسایی هر دایره به سه پارامتر احتیاج داریم، مختصات مرکز و شعاع دایره. تبدیل Hough Circle نیز از یک محاسبه کننده سه بعدی برای این کار استفاده می کند. در جعبه افزار OpenCV، این تابع وجود دارد و یکی از پارامترهای مهم این تابع، تعیین روشی برای شناسایی دایره است؛ که بهترین روش، Hough Gradient Method است که براساس گرادیان لبه ها دایره ها شناسایی می کند. خب توضیح کافیه اجازه بدهید به کدنویسی بپردازیم.

   ابتدا پکیج های مورد نیاز را وارد می کنیم. پکیج cv2 برای جعبه افزار OpenCV و Numpy برای محاسبات عددی هستند. سپس تصویر مورد نظر را بارگذاری می کنیم. در اینجا از لوگوی شرکت گوگل استفاده کردم.

   چون تابع cv2.HoughCircles از لبه ها برای شناسایی دایره ها استفاده می کند، تصویر را از یک فیلتر بالاگذر (medinBlur) عبور می دهیم تا لبه ها صاف تر شوند. در آخر حتماً باید تصویر را از حالت رنگی به خاکستری تبدیل کنیم؛ چرا که تابع cv2.HoughCircles تنها بر روی تصاویر خاکستری عمل می کند.

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

  • پارامتر اول: تصویر خاکستری شده
  • پارامتر دوم: روش شناسایی دایره ها است که در اینجا cv2.HOUGH_GRADIENT را انتخاب کرده ایم
  • پارامتر سوم: مقسم رزولیشن است که توصیه می کنم همیشه مقدار ۱ را قرار دهید
  • پارامتر چهارم: کمترین فاصله بین مرکز دایره های شناسایی شده است
  • پارامتر پنجم (param1): حد بالای threshold برای شناسایی لبه ها است
  • پارامتر ششم (param2): مقدار threshold محاسبه گر که برای پیدا کردن مرکز دایره ها استفاده می شود. هر چه این مقدار کمتر باشد دایره های بیشتری به اشتباه (دایره های ناخواسته) پیدا می شوند
  • پارامترهای هفتم و هشتم: بیشترین و کمترین شعاع دایره

   مقدار دهی به این پارامترها کاملاً سلیقه ای است و بیشتر به نیاز کاربر از این تابع بر می گردد. من مقادیر بالا را دادم. با استفاده از دستور np.around مقادیر بدست آمده از تابع را رند می کنیم و سپس آنها را از حالت uint8 به حالت uint16 تبدیل می کنیم.

   خب در این مرحله می خواهیم دایره هایی که پیدا کردیم را به همراه مرکزشان بر روی تصویر اصلی مشخص کنیم. برای این کار از دستور cv2.circle استفاده خواهیم کرد. برای دایره ها از سه المان خروجی تابع cv2.HoughCircles استفاده خواهیم کرد و برای نمایش مرکز دایره فقط از دو المان اول تابع که مختصات مرکز هستند استفاده می کنیم. و در پایان نیز تصویر را نشان خواهیم داد. شکل زیر به ازای param1=50 و param2=30 خاصل شده است.

   و به ازای param1=30 و param2=50 نتیجه زیر که بهتر است بدست آمد.

   در پایان از لینک زیر می توانید کد و تصاویر را دانلود کنید.

mehdi sehati

در این سایت پروژه و آموزش های انواع ماژول ها و میکروکنترلر ها و نحوه ارتباط سخت افزار با نرم افزار (برنامه نویسی اندروید برای گوشی و برنامه نویسی سی شارپ برای کامپیوتر) و برنامه نویسی پایتون و رسبری پای و ماژول های وای فای قرار میگیرد همچنین دوستان برای توضیحات بیشتر و سفارش پروژه میتوانند به آی دی تلگرام بنده مراجعه کنند

مطالب مرتبط

Subscribe
Notify of
guest

2 نظرات
Inline Feedbacks
View all comments
علی
علی
3 years ago

به شدت اموزش مفیدی بود تشکراز شما

2
0
Would love your thoughts, please comment.x