اسکن مدارک با استفاده از OpenCV و Python

در این پست قصد داریم با استفاده از OpenCV و Python، برنامه اسکنی شبیه به آنچه که در گوش های امروزی وجود دارد بنویسیم. در پست پیشین (تبدیل Perspective با استفاده از مختصات اولیه و نهایی ۴ نقطه از تصویر)، برنامه ای برای تبدیل حالت پرسپکتیو نوشته شد و از آن در این برنامه استفاده خواهیم کرد. در اینجا مختصات نقاط اولیه نیز به طور خودکار و با استفاده از تشخیص لبه و Contour بدست می آیند.
اسکن یک فایل از سه مرحله ساده تشکیل شده است:

  • مرحله اول: تشخیص لبه ها
  • مرحله دوم: استفاده از لبه ها برای پیدا کردن Contour ها
  • مرحله سوم: اعمال تبدیل پرسپکتیو

مرحله اول: تشخیص لبه ها

 

   ابتدا پکیج های مورد نیاز را وارد می کنیم. numpy برای Numberical Processing و cv2 برای OpenCV هستند. تبدیل پرسپکتیو وارد می کنیم تا در مرحله آخر از آن استفاده نماییم.

   حال تصویر مورد نظر را بارگذادی می کنیم. لازم است تا لبه های تصویر مشخص شوند. برای این کار باید تصویر رنگی (BGR) را با استفاده از دستور cv2.cvtColor به خاکستری (GRAY) تبدیل کنیم.

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

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

   تصویر سمت راست، تصویر اصلی است و پس از اعمال دستور Canny، تصویر سمت چپ حاصل می شود. مرحله اول به پایان رسید.

مرحله دوم: استفاده از لبه ها برای پیدار کردن Contour ها

   همانطوری که در تصویر مرحله قبل مشخص است، لبه های زیادی پیدا شده است؛ ولی هدف ما فقط لبه های برگه اصلی است و نه لبه های دیگر. به عبارت دیگر باید به دنبال بزرگترین Contour بگردیم.

 

   توسط دستور cv2.finfContours، تمامی Contour های موجود در تصویر را پیدا می کنیم. سپس آنها را مرتب می کنیم.

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

   اکنون محیط Contour های مشخص شده را پیدا کرده و برحسب آنها یک چند گوشه را با استفاده از دستور cv2.approxPolyDP مشخص می کنیم. حال اگر تعداد المان های هر یک از چند گوشه ها برابر ۴ باشد، بدین معناست که یک ۴ گوش پیدا کردیم.

   در آخر با دستور drawContours، بزرگترین Contour را بر روی شکل مشخص می کنیم. شکل زیر نتیجه مرحله دوم را نشان می دهد.

   مرحله دوم نیز به پایان رسید و اکنون نوبت به اعمال تبدیل پرسپکتیو می رسد.

مرحله سوم: اعمال تبدیل پرسپکتیو

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

 

   تابع four_point_transform را فراخوانی می کنیم. با استفاده از بزرگترین Contour که در مرحله قبل پیدا کرده بودیم، مختصات نقاط اوله را در اختیار داریم.

   پس از آن باید تصویر اصلی از حالت BGR به GRAY تبدیل کنیم. در قسمت بعدی با اعمال Adaptive Threshold، تصویر خاکستری را به حالت سیاه-سفید تبدیل می کنیم. و در آخر آن را نمایش می دهیم. شکل زیر تصویر اصلی و اسکن شده است.

   تصویر سمت چپ، برگه اصلی و تصویر سمت راست، خروجی کد است. در لینک زیر می توانید کد را به همراه تصاویر دانلود نمایید.

 

mehdi sehati

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

مطالب مرتبط

Subscribe
Notify of
guest

0 نظرات
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x