# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > پردازش تصویر (Image Processing) >  الگوریتم های مختلف برای شناسایی محل پلاک خودرو

## skyzare

با سلام .... 

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

فعلا از یه تصویر ساده میخوام شروع کنم مثلا یه تصویر مثل زیر : 






من خودم اولین الگوریتم رو که از داخل یه مقاله خوندم میگم حالا هر اندازه که توی نوشتن برنامه کمک کنید ممنون میشم ....

اولین الگوریتم : 

براي  تشخیص مکان پلاك درون تصویر، نیاز به یافتن یک ویژگی ثابت د ر کلیه پلا  كها بوده که به عنوان الگو در نظرگرفته شو د، این ویژگی را میتوان در پلا  كهاي ملی جدید، که مطابق با استانداردهاي جهانی تهیه شد ه اند، قسمت آبی کناري  در نظر گرفت. از آن جا که تا پایان امسال (سال 87 ) کلیه پلاكهاي خودروهاي  داخل کشور، پلاك ملی ایران خوا هند شد، بنابر این این ویژگی مطلوب به نظر  میرسد.

همچنین پلاك خودروه اي اروپایی نیز دار اي یک نوار آ بی ثابت  همانند پلاك ملی ایران میباشد که امکان بسط این روش را حداقل بر اي  خودروهاي کشوره اي اروپایی (عضو اتحادیه اروپا)، میدهد. 

نمونه هایی از این نوع پلاكها را نمایش میدهد.



باتوجه به وجود ویژگی مذکور جهت شناسایی مکان پلا ك، برخلاف رو شهاي قدیمی  که نیاز به انتقال تصویر به سطح خاکستري یاباینري بود ، از اطلاعات رنگی  استفاده شده و تشخیص و پردازش،درمحیطی رنگی و براساس ویژگی رنگی پلاك،  انجام میشود.


برای این منظور کافی است تصویر را به 8 رنگ مکعب اصلی RGB یا فضای رنگی دیگر مانند HSV یا LAB برده و به 

صورت دوره ای از بالا به پایین مورد پیمایش قرار گیرد . یه چیزی مثل شکل زیر : 









هنگامی که به رنگ آ بی ر سیده و در ادامه رنگ سبز وسفید و قرمز را در  عرض و تعداد پیکسل یکسان یافت و مجدد به رنگ و ز مینه آ بی با نسبت 11  برابر یکی از رنگه اي پرچم یا 11 برابر رنگ آبی ز مینه او لیه ر سید، آن  قسمت را به عنوان یک احتمال و نامزد مکان پلاك معرفی خواهد نمود 




معمولا  روش ارائه شده در این مقاله، تنها یک نامزد که همان مکان اصلی پلاك خودرو  است شناسایی کرده و به ندرت چندین نامزدمعرفی میشوند، اما براي اطمینان هر  مکانی که نامز د پلاك است ازتصویر جدا شده و مورد پردازش قرار میگیرد،  همانطور که در شکل زیر مشاهده میشود :





 اندازه پلا كها  ثابت است، بنابر این تنها با داشتن طول و یا عرض نوار آبی کناره پلاك،  میتوان طول و عرض کل پلاك را به دست آورد و پلاك را از درون تصویر استخراج و  قیچی نمو د.


مسلما  سیستم، هنگام جستجوي پلاك از بالا به پایین،به عرض پلاك و طو ل نوار آ بی  دست یافته وتنها باداشتن نسبت طول پلاك به عرض آن، انداز ه پلاك استخراج  خواهد شد. بنابر این سیستم پیشنهادي بر اي مکانیابی، در هیچ یک از مراحل،  نیاز به تغییر اندازه تصویرِ ورودي نخواهد داشت، هر تصویر با هر انداز هاي  قادر است به عنوان ورو دي در نظر گرفته شود و پس از تشخیص مکان پلاك با  استفاده از نسبتهاي طول به عر ض پلا ك، پلاك خودرو به استثناي نوار آب ی  کنار آن استخراج خواهد شد، پلاك استخراج شده پس از انجام مراحل مکانیابی  مشابه زیر میشود .

خوب این فعلا یکی از الگوریتم ها بود الگوریتم  های دیگه مثل تبدیل هاف ؛ لبه یابی ؛ جستجوی تصویر برای یافتن مکان های  مستطیلی و ...........هست ....

1-  خوب این الگوریتم خیلی واضح هست چی میگه  ؛ من توی پیمایش ستونی ماتریس  تتصویر مشکلی ندارم اما ما بقی اش رو نمدونم چه جوری بنویسم .... مثلا این  که چه جوری بفهمم الان من به رنگ ابی بعد سبز و بعد سفیدو بعد قرمز و بعد  ابی رسیدم ؟؟؟؟؟

2- خوب حالا مثلا مرحله قبلی رو فهمیدم بعد چه جوری مقدار y که در واقع طول نوار آبی رنگ هست رو پیدا کنم ؟

خوب اگه y رو پیدا کنم میتونیم با ضرب کردن در عدد 4.58 به طول پلاک بدون نوار ابی رنگ دست پدا کنیم ....

بعد هم میتونیم تصویر رو با این اصلاعات برش بزنیم .....

----------


## مصطفی ساتکی

این روش ذکر شده تو عمل برای localize کردن پلاک میزان خطای بالایی داره feature رو که انتخاب کردید robust نیست. در بعضی از تصاویر که در شرایط مختلف جوی گرفته میشه نمیشه به نوار آبی و مخصوصاً به اون پرچم اتکا کنیم.
در ضمن از در LPR از رنگ صرف نظر کنید بهترین راه استفاده از گرادیان می باشد و اکثر دوربین های machine vision مخصوصاً lpr به شما تصویر grayscale می دن و در ضمن به ناحیه پلاک هم عکس العمل خاصی رو نشون می دن .

جواب سوال اولتون در حالت کلی و جامع اینه که از hmm استفاده کنید
جواب سوال دوم کل آبی رو که پیمایش میشه در در سطح عمود و به شرطیکه پرچم هر در این ناحیه باشد

----------


## skyzare

با سلام ..... :لبخند: 

با تشکر از پاسختون .... :لبخند: 




> این روش ذکر شده تو عمل برای localize کردن پلاک میزان خطای بالایی داره  feature رو که انتخاب کردید robust نیست. در بعضی از تصاویر که در شرایط  مختلف جوی گرفته میشه نمیشه به نوار آبی و مخصوصاً به اون پرچم اتکا کنیم.


ببخشید اگه منظورتون این که این روی همه عکس ها جواب نمیده ....و این عکس هم یه جورایی خیلی نرمال هست !!!  :لبخند گشاده!:  خوب اره حق با شماست ...ولی من که نمیخوام کار پیشرفته بکنم  :ناراحت:   میخوانم در حد پروژه دانشجویی باشه ..





> در ضمن از در LPR از رنگ صرف نظر کنید بهترین راه استفاده از گرادیان می  باشد و اکثر دوربین های machine vision مخصوصاً lpr به شما تصویر grayscale  می دن و در ضمن به ناحیه پلاک هم عکس العمل خاصی رو نشون می دن .


منظورتون روش هایی که بر مبنای پیدا کردن لبه های تصویر هست ؟؟؟؟ 




> جواب سوال اولتون در حالت کلی و جامع اینه که از hmm استفاده کنید


ببخشید میشه یه خورده توضیح بدید این چیه ؟؟؟  :ناراحت:   :گریه: 

حالا انشالله بقیه اش رو هم بتونم مینویسم شما راهنمایی کنید کدامش بهتره ..... :لبخند:

----------


## skyzare

با سلام .... :لبخند: 

برگرفته از مقاله 

دومین الگوریتم ....

یکی دیگه از الگوریتم ها برای پیدا کردن محل پلا ک استفاده از لبه یابی و پیدا کردن اشکال مستطیل تصویر هست .

عملکرد خیلی خلاصه ...

ابتدا تصویر رو به گری تبدیل میکنیم ....با یکی از روش های لبه یابی لبه های تصویر رو پیدا میکنیم ....

حفره های درون تصویر رو پر میکنیم .... قاعدتا باید لبه های پلاک هم پیدا بشه و اون هم پر بشه !!! 

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

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

مثلا  این که نسبت طول به عرضش باید از یه حدی بیشتر باشه ....در یه پلاک  استاندارد ملی  نسبت طول به عرضش 5 برابر هست ...و مساحتش از یه حدی بیشتر باشه ....

حالا میتونیم مختصات ابجکتی که شرایط بالا رو داشته رو پیدا کنیم و اون رو از تصویر اصلی برش بزنیم ...

مثلا توی همین کد من اول اومدم مساحت تک تک ابجکت ها رو که برچسب زدم رو در ساختار g2 قرار دادم حالا با یه حلقه for همه اش رو تک تک با هم مقایسه کردم از طرفی شرط این که طول ابجکت از عر ض اون تقریبا 4 برابر بیشتر باشه رو هم گذاشتم  در نهایت بزرگترین ابجکت تصویر رو پلاک میگیره میدونم کلا این جوری خیلی خطا داره 

کاش نوشتنش هم مثل گفتنش بود !!!    


حالا من یه سوال دارم ....

این پیدا کردن لبه ها خیلی خرت و پرت  هم به عنوان لبه میگیره !!! از canny استفاده کردم ...ولی با همون سوبل هم  خرت و پرت زیادی پیدا میکنه باید چی کارش کنم تا اون ابجکت های الکی قبل  از برچسب زدن حذف بشن ؟چون تعداد ابجکت هایی که برچسب میزنه خیلی زیاده سرعت رو به شدت میاره پایین .. :ناراحت: 

با موروگرافی میشه کاری کرد ؟؟؟ تا حدودی اشنایی دارم ....این برنامه ای که نوشتم ...





این عکس اصلی هست :



 
 با کندی لبه گرفتم این جوری شد : 



بعد هم ابجکت ها رو پر کردم این جوری شد : 


این هم بعد از چداسازی محل پلاک 



بعد هم این کدی که نوشتم فقط روی همین تصویر جواب میده !!!     چی کار کنم میخوام حداقل روی 50 عکس تو همین مایه ها جواب بده ... :ناراحت: 

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

عکس اولیه :

این هم بعد از پر کردن ابجکت ها :

----------


## مصطفی ساتکی

> حفره های درون تصویر رو پر میکنیم .... قاعدتا باید لبه های پلاک هم پیدا بشه و اون هم پر بشه


چه تضمینی وجود داره که لبه های ایجاد شده برای پلاک یک لبه بسته باشه 



> این پیدا کردن لبه ها خیلی خرت و پرت  هم به عنوان لبه میگیره !!! از canny  استفاده کردم ...ولی با همون سوبل هم  خرت و پرت زیادی پیدا میکنه باید چی  کارش کنم تا اون ابجکت های الکی قبل  از برچسب زدن حذف بشن ؟چون تعداد  ابجکت هایی که برچسب میزنه خیلی زیاده سرعت رو به شدت میاره پایین


بستگی داره معمولا opening و closing پیشنهاد میشه

در ضمن شما هر وقت میخاید لبه گیری کنید باید از تکنیک های حذف نویز مثل median استفاده کنید. البته canny خودش در ابتدا این کار رو با gaussian انجام میده همون مقدار sigma که از شما به عنوان ورودی می گیره.

شما وقتی که median رو اعمال می کنید این همه آبجکت زائد که تو صفحه وجود داره و کلی از زمان پردازش صرف اونا میشه در ابتدا حذف میشه و بهدش کلیه حروف داخل پلاک بر می شن . یه کار جالبی می تونید انجام بدید هر contour(blob) در کل مساحتش mean رئ چک کنید بایستی مقدار زیر 100 داشته باشی با این rule کلیه contour های بدست آمده روشن حذف میشن تنها چیزی که می مونه contour های مربوط به پلاک هستش.
حالا بایستی بیشتر تعداد contour هایی که top و down شون تقریبا با هم برابر رو پیدا کنید و حداکثر فاصله بینشون به اندازه میزان متوسط خود contour ها باشه به این ترتیب به راحتی rectangle مربوط به پلاک ها بدست میاد

----------


## skyzare

با سلام .... :لبخند: 

با تشکر از پاسختون .... :لبخند: 




> چه تضمینی وجود داره که لبه های ایجاد شده برای پلاک یک لبه بسته باشه


اره دقیقا حق با شماست خودم هم بهش پی برده بودم که اصلا هیچ تضمینی نیست که حتما لبه پلاک بسته باشه برای همین هم من از canny استفاده کردم ولی باز هم مثل اینکه تضمینی براش نیست ....به نظرتون اگه حالا مثلا بیایم بعدش از موروگرافی و dilate استفاده کنیم البته از نوع line و با زوایای 0 و یه بار هم با زاویه 90 و با یه اندازه ای مثلا 10 ؛ به نظرتون خوبه ؟؟ منظورم این هست که مثلا امکان داره با این روش اگه احیانا لبه های پلاک بسته نبود بسته بشه ؟؟؟ میتونه مفید باشه ؟؟؟ و همچنین از تابع bridge استفاده کرد چون این تابع هم میاد پیکسل های جدا شده توسط فاصله تک پیکسلی رو بهم متصل میکنه مثلا این کار رو میتونیم n مرتبه تکرار کرد .... کلا به نظرتون این جوری فایده داره ؟؟؟ :ناراحت: 




> در ضمن شما هر وقت میخاید لبه گیری کنید باید از تکنیک های حذف نویز مثل  median استفاده کنید. البته canny خودش در ابتدا این کار رو با gaussian  انجام میده همون مقدار sigma که از شما به عنوان ورودی می گیره.


اره من از  فیلتر gaussian با اندازه 5 استفاده کردم ولی خیلی تغییر محسوسی ندیدم ...به نظر شما اگه از فیلتر های بالاگذر مثل لاپلاسین استفاده بشه فایده ای داره ؟؟؟که مثلا لبه ها بهتر نمایان بشن ؟؟

بعد اومدم یه کار دیگه کردم که البته شاید خیلی خوب نباشه از تابع bwareaopen استفاده کردم که مثلا اگه ابجکت مساحتش از یه حدی کمتر بود اون رو جذف کنه این ظاهرش خیلی خوب بود ولی خوب قابل اعتماد نیست  :ناراحت: 




> یه کار جالبی می تونید انجام بدید هر contour(blob) در کل مساحتش mean رئ  چک کنید بایستی مقدار زیر 100 داشته باشی با این rule کلیه contour های  بدست آمده روشن حذف میشن تنها چیزی که می مونه contour های مربوط به پلاک  هستش.
> حالا بایستی بیشتر تعداد contour هایی که top و down شون تقریبا با هم  برابر رو پیدا کنید و حداکثر فاصله بینشون به اندازه میزان متوسط خود  contour ها باشه به این ترتیب به راحتی rectangle مربوط به پلاک ها بدست  میاد


میشه یه لطفی کنید بفرمایید اون contour چیه ؟؟ اصلا متوجه منظورتون نشدم  :ناراحت: 

 در کل میخوام بدونم نظرتون راجع به این روش چیه ؟؟ به نظرتون بدرد این تصاویر من که یه نمونه اش رو نشون دادم میخوره ؟؟

----------


## golbafan

بهترین و سریع ترین روش در واقع روشیه که من برای تشخیص پلاک ابداع کردم
و ماژول قدرتمند خودمو ساختم که الان توسط شرکت های بزرگی در ایران و خارج از ایران داره استفاده میشه
در این روش نیازی به تشخیص محل پلاک نیست!!!
و حتی اگر پلاک رو با ماژیک روی کاغذ نوشته و بچسبونید روی شیشه ماشین، باز هم خونده میشه!!!
البته میتونید اونو محدود کنید که این کار رو نکنه
درثانی تغییرات شرایط ابو هوایی و کثیفی پلاک هم روی اون اثر نداره و همینطور تاریکی در حالی که با استفاده از فیلتر (کنی) مشکلات زیادی ایجاد میشه. که البته من در نسخه اول این راهو رفتم و در نسخه دوم (کنی) رو دور انداختم...
یک مزیت دیگه اینه که هرتعداد پلاک در تصویر موجود باشه، (فقط با یک بار پردازش) شناسایی میشه

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

سرعت پردازش ماژول بنده حدود 150 تشخیص در ثانیه و 20 خواندن در ثانیه است

برای اطلاعات بیشتر و دانلود دمو به لینک زیر برید
قیمت ماژول از 4 تا 15 میلیون میباشد

http://golbafan.webs.com

----------


## مصطفی ساتکی

به نظر شما وسط این تاپیک نیاز بود تبلیغ کنید.
فکر کنم سایت جایی برای تبلیغات هم در نظر گرفته باشه.

----------


## golbafan

> به نظر شما وسط این تاپیک نیاز بود تبلیغ کنید.
> فکر کنم سایت جایی برای تبلیغات هم در نظر گرفته باشه.


 سلام
من تبلیغ نکردم و در مورد روش جدید تشخیص صحبت کردم
این قیمت دادن جهت اطلاع  دوستان ذکر شد که اگر موفق شدند قیمت شکنی نکنند و بازارو خراب نکنند

----------


## skyzare

با سلام .... :لبخند: 

کلا دوستان بی خیال بشید دیگه !!!  :لبخند:  

انشالله شاهد موفقیت های بیشتر شما ها باشیم .... :لبخند:

----------


## gbg

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

----------


## gbg

خوب من به همین سرعت دست به کار شدم



نتیجش این شدش :


خب حالا یکی بقیش رو توضیح بده بریم سراغ ادامه کار - فکر کنم این قسمت آسون ترینش بود
* - لازمه که توضیح بدم از الگوریتم Sobel برای پیدا کردن لبه های عمودی و افقی تصویر استفاده کردم تو کدی که نوشتم ماتریس رو در هر اندازه ای که بخوام می تونم بگیرم و اعدادش رو هم به دلخواه می تونم عوض کنم یعنی میتونم فقط لبه عمودی یا افقی یا هر دو رو مشخص کنم

----------


## gbg

چون نمی شد عکس بیشتری گذاشت این ها رو هم تو این تاپیک گذاشتم

----------


## gbg

دوستان مرحله بعدی چیه؟
کسی نظری نداره؟

----------


## gbg

دوستان لااقل کسی میدونه مستطیل یا خط رو چطور میشه پیدا کرد؟

----------


## مصطفی ساتکی

وقتی خطوطی که دارید زوایاشون به صورت  k *pi/2 باشه شما می تونید به صورت projection خطوط رو تشخیص بدید 
 زمانیکه خطوط بتونن هر زوایه ای در صفحه داشته باشند بایستی از hough line detection برای یافتن خط استفاده کنید که در این حالت شما 2  accumulator دارید یکی مربوط به rho و teta که شما خطوطی رو که دارای teta یکسان هستند و دارای rho متقاوتی هستند رو مشخص کنید.

----------


## gbg

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

----------


## gbg

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

----------


## gbg

دوستان تا اینجا که تنهایی و بدون کمک اومدم جلو
لااقل تئوریش رو درست توضیح بدین که بتونم کدش رو بنویسم
به خدا ثواب داره

----------


## مصطفی ساتکی

hough استاندار  نسبت به حالت statistic hough  دارای order بالاترییه
 عملکرد حالت استاندار به صورت زیر می باشد :
کلیه نقاط ها نسبت به هم در صفحه باید بررسی شوند در این بررسی شما زاویه خطی که بین 2 نقطه ایجاد میشه رو بدست میارید پس در accumulator یک بعدش رو برای زاویه در نظر می گیریم که به اون teta گفته میشه گزینه بعدی که اینجا مطرحه فاصله
این خط تا مبداً مختصاته به این هم میگن rho پس کلیه نقاطی که یک خط رو تشکیل می دن دارای یک teta و یک rho یکسان هستند
پس حالا شما میاید ماکزیمم ها رو در این accumulator پیدا می کنید و از این طریق می توان پی برد که این peek مربوط به کدام خط است ( از روی اطلاعات rho و teta )
بقیه کاری که باید انجام بدید بیاد در صفحه کلیه نقاطی رو که در اون راستا وجود داره رو تحلیل کنید مثلا خطوط از کدام نقطه شروع میشه و به کدام نقطه ختم میشه و یا چه میزان gap رو مابین پاره خط هایی که یک خط را تشکیل می دهند صرف نظر کنید

----------

