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

## بهروز عباسی

درود
من برای یه پروژه کوچیک باید برنامه تشخیص پلاک بنویسم (قبلاً یه کارهایی کردم و لی الان جدی تر شده :متعجب: )
دنبال یه راه سریع و البته قابل اطمینان هستم ، شما چه Algorithmای رو پیشنهاد میکنید؟؟

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

اینم تصویر برنامه در حال اجرا ؛که محل پلاکو تشخیص داده :

----------


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

با چه روشی باینری کردید در ضمن حتماً هم نیاز نیست باینری کنید .
2 راه حل خوب برای این کار دارید یک اینکه مشتق در جهت y بگیرید تا نسبت به خطوط عمودی واکنش بهتری داشته باشید بعد آنها را در تصویر پیدا کنید.
راه حل دیگر استفاده از adaptive threshold به روش گوسی هستش.

موفق باشید.

----------


## بهروز عباسی

> با چه روشی باینری کردید در ضمن حتماً هم نیاز نیست باینری کنید .


راستش من به مباحث تئوری آشنایی چندانی ندارم (منظورم روشهایی مختلف انجام اینجو کاراست) ،امّا برای این کار تابع زیرو نوشتم (یادم نیست Algorithm اش رو ازکجا گیرآوردم)

function Binarization(const AInputImage: TBitmap;
  const AValue: integer): TBitmap;

type
  TRGB32 = packed record
    B, G, R: Byte;
  end;

  TRGB32Array = packed array [0 .. MaxInt div SizeOf(TRGB32) - 1] of TRGB32;
  PRGB32Array = ^TRGB32Array;

var
  iRow, iColumn: integer;
  _Result: TBitmap;

  RGBBitmap: PRGB32Array;
begin

  _Result := TBitmap.Create;

  try
    _Result.PixelFormat := pf32Bit;
    _Result.Assign(AInputImage);

    for iColumn := 0 to _Result.Height - 1 do
    begin
      RGBBitmap := _Result.Scanline[iColumn];
      for iRow := 0 to _Result.Width - 1 do
      begin
        if (RGBBitmap[iRow].B > AValue) then
          RGBBitmap[iRow].B := 255
        else
          RGBBitmap[iRow].B := 0;

        RGBBitmap[iRow].R := RGBBitmap[iRow].B;
        RGBBitmap[iRow].G := RGBBitmap[iRow].B;

      end;
    end;
    Result := (_Result);
  finally
    // _Result.Free;
  end;
end;




> 2 راه حل خوب برای این کار دارید یک اینکه مشتق در جهت y بگیرید تا نسبت به  خطوط عمودی واکنش بهتری داشته باشید بعد آنها را در تصویر پیدا کنید.


من قبلاً این کارو میکردم با استفاده از Vertical Sobel سعی میکردم لبه های عمودی رو بدست بیارم ؛چون ناحیه مربوط به پلاک بیشترین لبه ها رو داره اینطوری اونو پیدا کنم (Histogram) ،امّا مثلاً اگه اون ماشین یک *"نیسان"آبی* :لبخند گشاده!:  باشه که نرده هم داشته باشه  :چشمک:  اون قسمت نرده ها هم لبه های زیادی داره ---> خلاصه توی این جور مواقع نتونستم کاری کنم ،پیشنهادی دارید؟؟؟




> راه حل دیگر استفاده از adaptive threshold به روش گوسی هستش.


باید در موردش تحقیق کنم ممنون از کمکت.

----------


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

در کد بالا جای متغیر های iColumn , iRow رو عوض کنید (برای پیمایش height از iRowو برای پیمایش width از iColumn استفاده کنید).
بعد bitmap که تصویر خروجی در آن قرار می گیره pixelformat شو 8bit قرار بدید و در خروجی تابع قرار ندید به صورت پارامتر و var به تابع بفرستید هر 2 مورد تو کارایی برنامه تاثیر میذاره.
در ضمن این نوع آستانه گیری برای محیط های out door کاربرد نداره.
شما اول نواحی کاندید پلاک رو پیدا می کنید مثلاً نرده های پشت نیسان  هم ممکن جز این نواحی باشند بعد با شرط هایی که ویژگی های دیگر پلاک رو مشخص می کنه به هدفمون می رسیم.
 به صورت کاربردی و با دقت بالا بخاید و اون چیزی که من تو پلاک خوان خودم انجام دادم 300 ناحیه پلاک و 900 ناحیه غیر پلاک رو sobel گرفته با یک کلاسیفیر 2 بخشی آموزش دادم سپس با بررسی ratio و چند تا ویژگی  دیگر ، از پلاک تصویر sobel گرفته و پلاک رو با کلاسیفیر در نهایت چک می کنم که   که تا حالا پیش نیومده اشتباه کنه.

----------


## بهروز عباسی

> به صورت کاربردی و با دقت بالا بخاید و اون چیزی که من تو پلاک خوان خودم  انجام دادم 300 ناحیه پلاک و 900 ناحیه غیر پلاک رو sobel گرفته با یک  کلاسیفیر 2 بخشی آموزش دادم سپس با بررسی ratio و چند تا ویژگی  دیگر ، از  پلاک تصویر sobel گرفته و پلاک رو با کلاسیفیر در نهایت چک می کنم که   که  تا حالا پیش نیومده اشتباه کنه.


برای آموزش بهتره از چه نوع ANN ای استفاده کنم؟

----------


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

svm خودش 2 بخشی هستش و دقت بالایی هم داره.

----------


## 22mamliii

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

----------


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

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

موفق باشید.

----------


## mzolfaghari

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

----------


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

استخراج پلاک در چنین شرایط ایده ال اهمیت چندانی نداره . الگوریتم localization بایستی در شرایط جوی مختلف و همچنین شرایط پرسپکتیو جواب بده آن هم به صورت real در تصاویری با ابعاد 2500*1500 همچنین 24 فریم در ثانیه.

----------


## yakhteh

درود
میشه بگین چه روشی برای جداسازی پلاک از تصویر استفاده کردین؟
سپاس

----------


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

مشتق در جهت y  می گیریم چون حروف لبه های تندی دارند مجموعه از خطوط عمودی باقی می مونه بعدش این تصویر را با روش های adpaptive آستانه گیری می کنیم حالا مجموعه blob هایی که در کنار هم و فرکانس مشخص در راستای x دارند را دسته بندی می کنیم اینها میشه نواحی کاندید پلاک سپس aspect ratio نواحی را با شرطی بررسی می کنیم و در نهایت تصویر ناحیه کاندید را با svm بررسی می کنیم که ببینم پلاک هستش یا نه.

----------

