PDA

View Full Version : مباحثی پیرامون OCR و بررسی برخی از روشها



mzjahromi
پنج شنبه 18 اسفند 1384, 09:16 صبح
خلاصه ای از پرژه پایانی دوره کارشناسی
تهیه کننده: محمد ذوالقدر

آذر ماه 1380
چکیده :
بازشناسی حروف و کاراکترها یکی از موضوعات جالبی است که درقرون اخیر توجه بسیاری از محققین را به خود جلب کرده است . دراین مبحث با استفاده از تئوری گرافها سعی در بازشناسی کلمات، حروف،و بطور کلی الگوهای مختلف داریم. عملیات شناسائی با استفاده از نقاط بحرانی، محل چرخشها، اتصالات و ارتباطات بین آنها انجام می شود. در نهایت می توان نظریه احتمالات را نیز جهت تطبیق الگو با نمونه های موجود، مورد استفاده قرار داد. ولی آنچه تا کنون استفاده شده است تطابق قطعی الگوها با نمونه های موجود در بانک اطلاعاتی می باشد .

mzjahromi
پنج شنبه 18 اسفند 1384, 09:17 صبح
در قرون اخیر شبیه سازی ماشینی خواندن کلمات بسیار جالب تر از قبل شده است. افزایش چشمگیر منابع و مقالات موجود در این زمینه بیانگر همین مطلب می باشد .
این جذابیت و فعالیت ،تنها بخاطر مبارزه با مشکلات موجود نمی باشد.، بلکه به دنبال این کار، پردازش اتوماتیک حجم بالای اطلاعات، مانند خواندن اطلاعات پستی، اتوماسیون اداری و سایر کارها و برنامه های علمی نیز به راحتی انجام خواهد شد.
وجود مشکلاتی از قبیل نویز، مسائل ویژه متون دست نویس و وابسته به نویسنده و … پیچیدگی مسئله را به شدت افزایش می دهد. جهت تحلیل اینگونه مسائل نیاز به انجام عملیاتی از قبیل جداسازی کاراکترها از کلمات و شناسائی ویژگیهای اساسی کاراکترها خواهیم داشت. هر یک از روشهای مختلف تحت عنوان کلی شناسائی کاراکترها ائم از روشهای برون خطی(Off-Line ) یا روشهای بلادرنگ(On-Line) با توجه به سخت افزار و الگوریتم خاصی کار می کنند. در شناسائی حروف و کاراکترها به صورت بلادرنگ عملیات شناسائی زمانی انجام می شود که کاربر درحال رسم حروف و یا کاراکترها می باشد جهت انجام این کار نیاز به یک صفحه الکترونیکی با دقت 200 نقطه در اینچ و سرعت نمونه برداری 100 نقطه در ثانیه، داریم همچنین این صفحه باید قادر به ارسال اطلاعات به صورت یک بعدی نیز باشد .
در بازشناسی برون خطی، عملیات پس از چاپ یا نوشتن کامل متون انجام خواهد شد.
OCR یکی از روشهای شناسائی کاراکترها در مقابل شناسائی مغناطیسی می باشد. درOCR اطلاعات ورودی توسط یک پویشگر خوانده می شود و سپس موقعیت هر کاراکتر شناسائی می شود. به دنبال آن کاراکترها از یکدیگر جدا می شوند و نتیجه به صورت یک ماتریس به پیش پردازنده ارسال می شود و عملیات نازکسازی، کاهش نویز و نرمال سازی اندازه ای روی آن انجام می شود و در نهایت ماشین مربوط به شناسائی کاراکترها آنها را شناسائی می کند .
در سه قرن گذشته روشهای بسیار زیادی توسط دانشمندان مختلف جهت شناسائی کاراکترها ارائه شده است دیدگاهها و روشهائی که تاکنون ارائه شده اند به چند دسته مختلف تقسیم می شوند. که عبارتند از : روشهای آماری، روشهای ساختاری و شبکه های عصبی. روشی که در این مبحث ارائه شده است از دسته دوم می باشد .
حال با مروری بر مراحل بازشناسی حروف بحث را ادامه می دهیم .

mzjahromi
پنج شنبه 18 اسفند 1384, 09:24 صبح
روشهائی که هم اکنون جهت شناسائی متون دست نویس وجود دارندمعمولا از سه فاز عمده تشکیل شده اند که عبارتند از : پیش پردازش، جداسازی و تشخیص .
توجه شود که نمی توان از نرم افزارهای شناسائی متون انتظار نتایجی قابل انعطاف و صریح مانند انسانها داشت. خروجی اینگونه ماشینها لیستی از قطعات ( کلمه ها یا کاراکترها ) قابل انطباق، به همراه ضریب تشابه آنها می باشد. این ضرایب مشخص می کنند که هر قطعه تا چه اندازه به قطعه مورد نظر شباهت دارد.


1-1-1) پیش پردازش
در این مرحله قسمتهای مناسبی از تصویر جهت شناسائی و جداسازی قطعات علامتگذاری می شوند بطور کلی عملیاتی که در پیش پردازش انجام می شوند به شرح زیر است، اما با توجه به روش انتخاب شده ممکن است یک یا چند مرحله از مراحل زیر اصلا انجام نشود یا اینکه به شکلی متفاوت صورت پذیرد.
از دیگر عملیاتی که در پیش پردازش انجام می شود تشخیص موقعیت کاراکترها می باشد این کار نیز می تواند توسط نمودارهای چگالی افقی و عمودی انجام شود .

1-1-2)جداسازی
متون دست نویس شامل جمله ها،کلمات وکاراکترهاهستندو فرض می شود که جمله ها با نقطه ختم می شوند و بین کلمات نیز فواصل کوتاهی وجود دارد بدین ترتیب قطعات مختلف متنی که ممکن است در یک تصویر موجود باشد شناسائی می شوند. سپس احتمال اینکه جمله بدست آمده صحیح باشد بررسی می شود. اعمال فوق با روشهای مختلف جداسازی انجام می شود و در هر مورد احتمال صحت جمله بررسی می شود و جمله ای که احتمال صحیح بودن آن بیش از سایرین باشد معرفی می شود پس از آن ماشین تشخیص کلمه کار خود را شروع می کند. در صورتیکه این ماشین، عملیات تشخیص را به صورت کاراکتری انجام می دهد، باید عملیات جداسازی در سطح کاراکترها را هم انجام دهد .


1-1-3) شناسائی
این قسمت سعی در شناسائی کاراکترها و کلمات دارد. توجه شود که غالب نرم افزارهای نوشته شده در زمینه تشخیص کلمات تنها قادر به شناسائی تعداد محدودی از کلمات می باشند. آنچه در مباحث زیرین مشاهده می شود روشهائی جهت شناسائی کاراکترها و کلمات می باشند یک سیستم تشخیص کلمه تنها می تواند از استراتژیهای تحلیلی،holistic و مبتنی بر تشخیص استفاده کند روش چهارم تنها مربوط به شناسائی کاراکترها می باشد.


1-1-3-1)روشهای تحلیلی
روشهای تحلیلی کلمات را قبل از شناسائی به واحدهای کوچکتری تقسیم می کنند با توجه به روش استفاده شده، این واحدها می توانند قطعه ها کاراکترها شبه کاراکترها و… باشند. این واحدها به شدت وابسته به کاراکترها هستند بنابراین شناسائی آنها وابسته به یک مجموعه خاص از کلمات نمی باشد (محدودیت در تعداد کلمات وجود ندارد)روشهای تحلیلی عملیات جداسازی را بطور کامل و دقیق انجام می دهند چون در این روشها کلمات صریحاً به کاراکترهائی شکسته خواهند شد که به طور جداگانه شناسائی می شوند. البته در چنین مواردی نیاز به یک پردازش نهائی جهت اطمینان از صحت اطلاعات نیز وجود دارد.


1-1-3-2)روشهای holistic
روشهای holistic کلمات را بصورت یکجا و بدون هیچگونه جداسازی شناسائی می کنند و این عملیات را طی دو مرحله انجام می دهند.
1)استخراج ویژگیها
2)مقایسه شکل کلمه ناشناخته با کلمات موجود در مجموعه لغات خود


1-1-3-3)روشهای مبتنی بر تشخیص
در روشهای مبتنی بر تشخیص یک سری جداسازیهای داخلی انجام می شود و هر گروه از کاراکترهای جداسازی شده با یک ماشین جداگانه بررسی می شوند و تنها گروهی ارائه می شود که دارای معنی قابل قبولی باشد. سپس تصویر جداسازی شده به ماشین تشخیص الگو ارسال می شوند و پس از انتخاب بهترین جداسازی نتیجه نهائی استفاده خواهد شد.


1-1-3-4)بازشناسی کاراکترها
بدون شک بازشناسی کاراکترهای دست نویس پایه کلیه ماشینهای خواندن اتوماتیک هستند. بازشناسی کاراکترها به صورت تک تک می تواند نمونه ای از مسائل تشخیص الگو باشد که نیاز به انتخاب ویژگیها استخراج ویژگیها، فرایند یادگیری و دسته بندی اطلاعات دارد دو دیدگاه کلی بازشناسی کاراکترها و اعداد می توانند به صورت زیر باشند.
1-تطبیق الگو
2- تحلیل ساختاری

mzjahromi
پنج شنبه 18 اسفند 1384, 09:25 صبح
روشهای شناسائی برون خطی ( Off-Line ) روی تصاویر دو بعدی اعمال می شوند درحالیکه در روشهای بلادرنگ از داده های یک بعدی استفاده می شود . در حالت بلادرنگ می توان قسمتهای مختلف متن را ذخیره کرد و سپس عملیات شناسائی را توسط روشهای برون خطی انجام داد . روشهای بلادرنگ دارای مزیتهای فراوانی هستند که تعدادی از آنها عبارتند از 1- ترتیب نوشتن 2- جهت و نحوة حرکت قلم موجود است و می تواند جهت شناسائی مورد استفاده قرار گیرد. همچنین برداشتن و گذاشتن قلم نیز می تواند جهت شناسائی ضربه ها مورد استفاده قرار گیرد .
روشهای تشخیص کاراکترها به صورت بلادرنگ ، به دو دستة عمده تقسیم می شوند .
1-تحلیل کاراکترها با استفاده از ترکیب ، که مبتنی بر مدل سازی متون تولید شده دست نویس می باشد .
2- استفاده از روشهای برون خطی جهت شناسائی بلادرنگ

mzjahromi
پنج شنبه 18 اسفند 1384, 09:26 صبح
بازشناسی حروف چینی یکی از زمینه های بسیار جالب و پیچیده در تشخیص الگو می باشد و مطالعات و تحقیقات زیادی در این زمینه انجام شده است. در این راستا مشکلات زیادی وجود دارد. به عنوان مثال کاراکترهای چینی واضح و شمرده هستند اما از نظر اندازه بسیار بزرگ و از نظر ساختاری نیز با یکدیگر شباهت زیادی دارند . بنابراین دسته بندی و شناسائی آنها بسیار مشکل می باشد در این مقاله روش جدیدی جهت شناسائی متون دست نویس چینی با استفاده از روشهای آماری تشخیص الگو معرفی شده است . دسته بندی و شناسائی با استفاده از نقاط بحرانی ، استخراج ویژگیها ودسته بندی آماری کاراکترها انجام می شود . این سیستم بر روی 500 کاراکتر مختلف ( واز هر کاراکتر 40 نمونه جداگانه ) تست شده است و دارای بازده 84.43% بوده است که این مورد از بهترین نتایج حاصل حاصل شده می باشد.
در بازشناسی کارکترهای چینی مشکلات زیادی وجود دارد . اول آنکه تعداد کاراکترها بسیار زیاد است ( بیش از 50000 کاراکتر که 6000 مورد آن معمولا مورد استفاده قرار می گیرند ) دوم اینکه کاراکتر های چینی ساختار بسیار پیچیده ای نسبت به حروف الفبای معمولی دارند و همچنین بسیاری از آنها دارای ساختار مشابهی می باشند. اینگونه مسائل در متون دست نویس بسیار پیچیده تر خواهد شد . روشهائی که در این زمینه پیشنهاد شده اند به دو دسته مهم تقسیم می شوند اولین روش بررسی ضربه ها می باشد که ویژگیهائی مانند نقاط انتهائی نقاط کناری موقعیت ضربه ها و… را از نمونه ورودی استخراج می کند . و دومین روش تطبیق الگو می باشد که مبتنی بر مقایسه الگوی ورودی و مدل استاندارد می باشد. بیشتر منابع، استفاده از دیدگاه بررسی ضربه ها را پیشنهاد می کنند به عنوان مثال یکی از روشهای موجود جهت تحلیل کاراکترهای چینی ( Augi )از روابط بین نقاط اتصال ، نقاط کناری و … استفاده می کند.
یاماموتو از جهت ضربه ها ، دسته بندی ضربه ها دامنه ضربه ها و چگالی ضربه ها جهت دسته بندی کاراکترها استفاده می کند. هسیه ولی نیز از آرایه ای یک بعدی که شامل ترتیبی از ضربه ها و روابط بین آنها می باشد استفاده می کنند. برای کلیه این روشها ، نیاز به یک الگوریتم مناسب جهت استخراج صحیح ضربه ها و همچنین دستیابی به یک کارائی مناسب می باشد این روش با استفاده از تکنیک جستجوی نقاط بحرانی، ویژگیها را جهت دسته بندی و شناسائی کاراکترهای چینی با استفاده از روشهای آماری ، استخراج می کند.

mzjahromi
پنج شنبه 18 اسفند 1384, 09:27 صبح
سیستمهای مبتنی بر قائده نیز در نرم افزارهای تشخیص کاراکتر مورد استفاده قرار می گیرند. مطمئنا بیشتر قوانین باید با تجربه و برخورد با کاراکترهای جدید تعریف شوند. بدین ترتیب کارائی سیستم بالاتر خواهد رفت بدیهی است هر چه تعداد قوانین معرفی شده به سیستم بیشتر باشد کارائی سیستم بالاتر خواهد رفت و به دنبال آن توانائی سیستم برای شناسائی مجموعه بزرگتری از کاراکترها نیاز به قوانین بیشتری دارد ولی در شناسائی ده رقم زبان عربی بیش از چهار صد قانون مورد استفاده قرار گرفته است که کارائی سیستم در اینحالت 91.4 % بوده است همانطور که قبلا گفته شد جهت افزایش کارائی می توان تعداد قوانین استفاده شده را افزایش داد.

mzjahromi
پنج شنبه 18 اسفند 1384, 09:30 صبح
در این مبحث ، روشی از بازشناسی ارائه شده است که با استفاده از یک شبکه هوشمند عصبی ( Neocognitron ) کار می کند. این روش نوعی از شبکه های عصبی است که جهت مدل سازی تصاویر مورد استفاده قرار می گیرد و قادر به کسب توانائی هائی جهت شناسائی الگوهای تصویری توسط یادگیری می باشد. هدف این مبحث به اثبات رساندن این مطلب است که شبکه های عصبی مذکور قادر به شناسائی مجموعه بزرگی از الگوهائی که در جهان واقعی با آنها مواجه می شویم است.
توانائی شبکه های عصبی در شناسائی کاراکترها ارتباط مستقیمی با استخراج ویژگیها در شبکه دارد در این مبحث کارائی شبکه های عصبی با بکارگیری دو مقدار آستانه ای و استفاده ازیک بانک اطلاعاتی بزرگ تحت عنوان ETL1 بررسی شده است . بانک اطلاعاتی ETL1 یک مجموعه از کاراکترهای دست نویس است که شامل انواع مختلفی از ارقام دست نویس می باشد. این ازقام توسط 1400 نفر نوشته شده اند و حدود 200 نمونه مختلف و تصادفی از هر مجموعه جهت یادگیری انتخاب شده است (مجموعاً 2000 مورد). به علاوه از هر مورد مجموعه 300 رقم دیگر نیز جهت تست میزان کلیت برنامه انتخاب شده است .
. نتیجه بدست آمده رقمی بالای 98 % جهت الگوی ارقام موجود در ETL1 بوده است .

mzjahromi
پنج شنبه 18 اسفند 1384, 09:36 صبح
اکثر سیستمهائی که بدون تأثیر تغییر شکلها و تغییر مکانهای تصویر عملیات شناسائی را انجام می دهند ، توانائی محدودی در این زمینه دارند و لازم است حتما تصویر تغییر شکل یافته استاندارد باشد و قادر به شناسائی تصاویری که دارای چرخش جابجائی فشردگی و کشش هستند نمی باشند به عنوان مثال نمونه ای از اینگونه ماشینها تنها قادر به شناسائی الگوهای تغییر شکل یافته ( افزایش طول یا عرض و … ) می باشند ولی الگوهای چرخش یافته را نمی توانند شناسائی کنند . Neocognitron مدلی از شبکه های عصبی چند لایه است که قادر به شناسائی الگوها می باشد این شبکه دارای یک ساختار سلسله مراتبی است که لایه های بالائی آن دارای حساسیت بیشتری نسبت به انتقال و چرخش الگو در تصویر می باشند این شبکه قادر به استخراج ویژگیهای پیچیده تصویر نیز می باشد این مدل نیز با استفاده از کاراکترهای دست نویس موجود در پایگاه داده ETL1 تست شده است و نتیجه ای بالای 98% را ارائه داده است لازم به ذکر است که این روش قادر به شناسائی الگوهائی که بیش از حد چرخش یافته اند نمی باشد

mzjahromi
پنج شنبه 18 اسفند 1384, 09:39 صبح
بیشتر روشهائی که جهت دست یابی به کارائی بالا در بازشناسی کاراکترها ارائه شده است عملیات شناسائی را با استفاده از راه حلهای آماری ، شبکه های عصبی و ترکیبی از شبکه های عصبی و روشهای آماری ، انجام می دهند . اینگونه روشها را می توان با بررسی پارامترهائی از قبیل ، سرعت، کارائی ، نیازمندیهای حافظه ای ، امکان پیاده سازی بر روی سیستمهای دیجیتال و در شبکه های عصبی سرعت یادگیری ارزیابی کرد . در این میان شبکه های عصبی بیشتر از سایرین جالب توجه است . چون تعادل مناسبی را بین کارائی ، سرعت و امکانات سخت افزاری بر قرارمی کند . MLP نیز نمونه ای از شبکه های عصبی است که جهت دسته بندی اطلاعات مورد استفاده قرار می گیرد. در این مبحث مدلی برای شناسائی کاراکترهای دست نویس با استفاده از MLP مطرح شده است.
استفاده از تکنیکهای ساده پیش پردازش ، سیستم یادگیری پیشرفته و دو مرحله ای و ارائه سه گروه از نمونه های آزمایشی باعث ایجاد کارائی و سرعت بسیار قابل توجهی شده است . پیاده سازی کامل نرم افزار ( به زبان C ) در مراحل پیش پردازش و شبکه های عصبی MLP و پیاده سازی منطقی بر اساس معماری شبکه های عصبی با استفاده از زبان VHDL ، سرعت و کارائی بالائی را ارائه کرده است. مجموعه های تست و یادگیری برای این سیستم از پایگاه داده NIIST ( National In stitute for standard and tochnoloyy) انتخاب شده اند . در مرحله اول به منظور افزایش سرعت سیستم تنها چند هزار کاراکتر به سیستم شناسانده شده است . پس از حدود ده مرحله ، تعداد نمونه ها به تدریج افزایش یافته تا زمانیکه کل مجموعه یادگیری را شامل شود . کارائی MLP توسط 11.941کاراکتر برای حروف بزرگ و 58.536 کاراکتر برای اعداد ، بررسی شده است . نتیجه حاصل از تست سیستم با توابع مختلف در مرحله پیش پردازش ، به صورت زیر می باشد .

جدول4)کارائی روش MLP
شبکة عصبی حروف بزرگ اعداد
MLP-1 93.4 /
MLP-2 94.82 96.45
MLP-3 96.2 97.02

mzjahromi
پنج شنبه 18 اسفند 1384, 09:41 صبح
این مبحث روشی را جهت شناسائی کاراکترها ارائه می دهد که دارای سرعت بالا و دقت کافی بوده و با استفاده از تقسیمات چند مرحله ای و ویژگیهای سلسله مراتبی عملیات خود را انجام می دهد. ویژگیها در دسته های مختلف از کم دقت تا با دقت توسط مفاهیم بازگشتی دسته بندی می شوند . سیستم های شناسائی با توجه به منابع محاسباتی از قبیل میزان حافظه و زمان پردازش میزان استفاده از ویژگیها را در مراحل مختلف کنترل می کنند . در این مبحث روشی مطرح شده است که میزان مراحل لازم جهت دسته بندی الگوی ورودی را مشخص می کند این مورد باعث استفاده بهینه از منابع محاسباتی می شود .
OCR سلسله مراتبی ، به صورت پویا فاکتوهائی مثل کیفیت الگوی ورودی تشابهات و اختلافات یک گروه از الگوها با گرهی دیگر ، و زمان لازم جهت پیش پردارزش را نیز در نظر می گیرد. زمانیکه عملیات تست این روش، با مجموعه اطلاعات NIST انجام شد ، این روش حدود 300 بار سریعتر از روشهای K- neakest – neigbor و ده بار سریعتر از روشهای شبکه های عصبی بود . در حالیکه کارائی این روش در حدود 96% بوده است که این مقدار معادل مقادیر حاصل شده با دو روش دیگر می باشد.


شکل7 ) نمونه ای از تصویرها و زیر تصویرها


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



جدول 5 ) کارائی روش سلسله مراتبی
Testingset Traning Set Image Source Testing Image Traning Image No. Of Classes Data Set
Top2 Top1 Top2 Top1
98.8 96.2 99.9 99.5 Postal +NIST 12242 25656 10 1
99.5 98.2 99.7 98.6 NIST Digit 53301 159228 10 2
98.8 96.4 99.9 99.2 NIST Alpha Uppercase 11481 34961 26 3
97.1 90.4 99.8 98.7 NIST Alpha lowercase 9623 29059 26 4
94.7 78.2 98.7 93.4 NIST Alpha foll class 21104 64020 52 5
97.1 92.4 99.5 97.5 NIST Alpha folding 21104 64020 52 6

amir_pro
چهارشنبه 16 فروردین 1385, 21:48 عصر
سلام
می خواستم بدونم از چه الگوریتمی باید استفاده کرد که عکسی را که در اختیار داریم بتوان به نواحی فعالی تبدیل کرد که هر کدام حکم عکس را داشته باشد.
با تشکر

mzjahromi
پنج شنبه 17 فروردین 1385, 08:03 صبح
هر کدوم از این روشهلائی که دیدید و صدها روش دیگه از الگوریتم خاص خودشونن استفاده می کنن.
فکر می کنم منظور شما جدا سازی هست.
جدا سازی خودش یه مقوله مهم در OCR هست و برای زبانهای مختلف فرق میکنه. مثلا برای متون تایپی انگلیسی نسبتا راحت تر هست و برای متون به هم پیوسته فارسی خیلی مشکلتره
شما شباهت ش و ثب رو در نظر بگیرید.
ولی خوب کل این مراحل هست که OCR رو ایجاد میکنه
1- حذف نویزها
2- نازک سازی
3- جدا سازی
4- تشخیص

البته بسته به روش انتخابی شما ممکنه مرحله 2 و 3 جابجا بشن یا 2 حذف بشه.

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

amir_pro
پنج شنبه 17 فروردین 1385, 11:56 صبح
سلام
ببینید ما شرط می کنیک که همه ویژگی های اون نوشته که به عکس تبدیل شده ثابت باشد مثلا سایز آن 14 و فونت استایل آن رگولار باشد. خوب، بعد چطور می شود این عکس را به نواحی تقسیم کنیم که در آن بیاید قسمتهای بالا و پایین و چپ و راست آن را که سفید است و امون ثابت بوده را حذف کنیم و اون عکسی را که به این شکل تبدیل شده را به قسمتهایی تبدیل کنیم که هر قسمت آن اندازه حروف باشد که آن حروف هم انگلیسی هستند. بعد آن عکسی را که کوچک است را با 26 عکسی که حروف انگلیسی دارند مقایسه کرد البته باید بگم که برنامه ای نوشتم که می آید دو تا عکس با پسوند بی ام پی را مقایسه می کند. ممنون میشم اگه ککمک کنید

mzjahromi
پنج شنبه 17 فروردین 1385, 13:48 عصر
ببینید:
شما اول باید سطر ها رو جدا کنید.
برای این کار از بالای صفحه شروع به Scan کردن می کنید و به سمت پائین میاید. با فرض عدم وجود نویز، اولین سطری که یک نقطه سیاه رنگ داشته باشه رو به عنوان سطر شروع در نظر می گیرید(منظور من از سطر سطر پیکسلها هست نه سطر متن)
پویش رو ادامه میدید تا به اولین سطر بعد از اون برسید که هیچ نقطه سیاهی در اون نیست این هم آخرین سطر پیکسلی از این سطر متنتون هست
پس محل قرار گرفتن یک سطر از متن رو یافته اید
حالا باید کاراکتر ها رو توی این سطر جستجو کنید.
اگر کاراکتر ها با یک یا دو فاصله قرار گرفته باشند جستجوی یک کاراکتر هم به همان سادگی جستجوی یک سطر هست ولی اگر بدون فاصله باشند الگوریتم یه خورده پیچیده تر میشه.

amir_pro
پنج شنبه 17 فروردین 1385, 14:49 عصر
سلام
ممنون از راهنماییتون.سعی می کنم برنامه سطرشا بنویسم اما اسکن دلفی تا اونجایی که من بلدم (کمی بلدم) عمودی انجام می شه و نمیدونم باید چیکار کرد

mzjahromi
پنج شنبه 17 فروردین 1385, 15:00 عصر
سلام
مگه با چه ابزاری از دلفی کار میکنید؟
من خودم با TImage کار کردم.

amir_pro
یک شنبه 20 فروردین 1385, 11:30 صبح
سلام
مگه با چه ابزاری از دلفی کار میکنید؟
من خودم با TImage کار کردم.

سلام
ممنون از کمکاتون
Timage ببخشید ولی امتحان کردم و عنصر
ویژگی اسکن را نداشت، شما چه جوری این کار را انجام دادید

mzjahromi
یک شنبه 20 فروردین 1385, 11:36 صبح
مگه چطوری اسکن میکنید؟


Function Picture.GetPixel2(image:TImage;x,y:Integer):Byte;
Begin //read a 2 color bitmap pixels from file
if Image.Canvas.Pixels[x,y]=0 then
GetPixel2:=NcColor
else
GetPixel2:=BackColor;
End;

mzjahromi
یک شنبه 20 فروردین 1385, 11:42 صبح
function Picture.NextRow(i:Integer;var down:Integer):Boolean;
var
x,y,count:Integer;
flag:Boolean;
begin
y:=i+1;
Flag:=False;
repeat
count:=0;
for x:=0 to w-1 do
if getpixel(X,y)<>BackColor then
Count:=Count+1;
if count>0 then
flag:=True;
y:=Y+1;
until ((Flag and(count=0))or(y=h));
down:=y;
if Y>=h then
NextRow:=False
Else
NextRow:=True;
End;




function Picture.Nextcol(top,down,i:Integer;var Right:Integer):Boolean;
var
x,y,count:Integer;
flag:Boolean;
begin
X:=i+1;
Flag:=False;
repeat
count:=0;
for y:=top to down do
if getpixel(X,y)<>BackColor then
Count:=Count+1;
if count>0 then
flag:=True;
X:=X+1;
until ((Flag and(count=0))or(X>=W));
Right:=X;
if X>=W then
Nextcol:=False
Else
Nextcol:=True;
End;

aakh1361
چهارشنبه 30 فروردین 1385, 00:53 صبح
سلام مقاله خوبی بود
اما چرا ادامه ندادید ؟

mzjahromi
چهارشنبه 30 فروردین 1385, 06:41 صبح
سلام مقاله خوبی بود
اما چرا ادامه ندادید ؟

باشه ادامه میدم.

mzjahromi
چهارشنبه 30 فروردین 1385, 06:56 صبح
ادامه از پست 10

استفاده ازمحاسبات نرم افزاری جهت شناسائی اعداد دست نویس
اینگونه روشها با استفاده از تئوریهای منطق فازی شبکه های عصبی و تئوری احتمالات سعی در شناسائی ویژگیهای قابل استخراج به همراه ضریب خطاهائی ازقبیل ضریب اطمینان میزان صحت و… دارند. دراین مبحث نمونه ای از این روشها جهت دسته بندی اطلاعات مورد استفاده قرار گرفته اند. در این روش از منطق فازی جهت شناسائی و استخراج ویژگیها و از تئوری احتمالات جهت دسته بندی اطلاعات استفاده شده است.
روشهای آماری متعارف که در موضوعات مختلف شناسائی کاراکترها مورد استفاده قرار می گیرند با اعمال محدودیتها وقوانینی ، عملیات دسته بندی نمونه ها را انجام می دهند اینگونه روشها با یک مشکل نه چندان ساده مواجه هستند و آن برخورد دسته های مختلف با یکدیگر می باشد یکی از راه حلهائی که برای این مشکل می توان مطرح کرد تعیین درجه عضویت است از این طریق می توان عملیات شناسائی را ساده تر انجام داد. روشی که در اینجا انتخاب شده است جهت دسته بندی ارقام دست نویس طراحی شده است . این روش بجای اینکه اطلاعات را به 62 دسته مختلف ( جهت شناسائی ارقام و حروف ) دسته بندی کند آنها را به ده دسته تقسیم می کند ( تنها ارقام را شناسائی می کند ) این کار نمونه مورد بررسی را ساده تر خواهد کرد در حالیکه کلیه مشکلات حالت قبلی را ( از قبیل برخورد دسته های مختلف با یکدیگر ، نویز، … ) دارا است.
سیستمهای موجود جهت شناسائی کاراکترها روشها و راههای مختلفی را پیشنهاد می کنند به طور کلی در سیستمهای شناسائی می توان دو مرحله را در نظر گرفت : اول طراحی روشی جهت استخراج ویژگیها. و دوم دسته بندی ویژگیها. کلیه فعالیتهای این روش بر روی دو بخش فوق متمرکز می شود یک بخش مربوط به استخراج اتوماتیک ویژگیها که مبتنی بر شبکه های عصبی است و بخش دیگر جهت دسته بندی ویژگیها که مبتنی بر احتمالات و منطق فازی می باشد.
سالهای زیادی است که شبکه های عصبی دارای اهمیت زیادی ازنظر تحقیقات شده است . هدف از این تحقیقات پیوسته شبیه ساختن عملیات ماشین به انسان می باشد SOM که توسط کوهونن پیشنهاد شده است یک ساختار شبکه ای جهت استفاده در سیستم های شناسائی الگومی باشد از این سیستم نیز جهت استخراج ویژگیها استفاده شده است و نتایج را بهبود بخشیده است .
این سیستم در یک زبان برنامه نویسی منطقی با نام فریل ( Fril ) پیاده سازی شده است . زبان برنامه نویسی فریل امکانات لازم جهت پیاده سازی این سیستم و اهدافی از قبیل مجموعه های فازی احتمالات ، ضریب اطمینان و … را پشتیبانی می کند این سیستم عملیات یادگیری را با سرعت نسبتاً پائینی انجام می دهد ( حداکثر ده ساعت برای سیستمهای عادی ) اما بدون اعمال هیچگونه عملیات بهینه سازی قادر به شناسائی و دسته بندی سریع ارقام با سرعتی در حدود 5 الی 15 رقم در ثانیه می باشد . این سیستم برای هر الگو ضریب تشابهی را با هر ده رقم ارائه می دهد نمونه ای از این ضرایب در شکل زیر مشاهده می شود .



شکل 5) نمونه ای از کاراکتر،نازکسازی و نرمالسازی آن و ضریب تشابه آن با هر ده کاراکتر

جهت شناسائی، الگوئی که دارای بالاترین ضریب تشابه است ارائه می شود. نتیجه مجموعه های یادگیری و تست در جدول 2 مشاهده می شود این جدول نتایج بیشترین در صد تشابهات برای هر دسته را نشان می دهد که مقادیری استاندارد در سیستمهای شناسائی کاراکترها می باشند مقادیر 60.2 % , 73.2% در مجموعه های یادگیری و تست بدین معنی است که ویژگیهای استخراج شده از بهترینها نبوده اند . جهت افزایش کارائی سیستم از ویژگیهائی که توسط سیستم SOM استخراج شده اند استفاده می کنیم. جدول 1 نتیجه حاصل شده با اعمال 14 ویژگی کلی را نشان می دهد .





جدول 1) نتیجه ویژگی های ساده
مجموعه دسته بندی
0 1 2 3 4 5 6 7 8 9 مجموع
یادگیری 66.2 79.8 70.4 69.2 81.2 71.5 66.3 63.4 77.4 82.2 73.2
تست 51.0 67.6 55.9 51.4 82.1 39.7 68.1 54.1 45.6 49.6 60.2


جدول 2)نتیجه ویژگی های ساده و ترکیبی
مجموعه دسته بندی
0 1 2 3 4 5 6 7 8 9 مجموع
یادگیری 80.3 83.2 90.9 75.4 94.6 89.5 83.0 66.5 93.3 91.4 84.6
تست 73.7 77.6 80.8 61.4 92.5 49.1 78.1 64.2 55.6 59.7 71.9


استفاده از ترکیب ساختاری ویژگیها ، باعث افزایش کارائی سیستم به 71.9% و 84.6% برای مجموعه های یادگیری و تست شده است . در اینحالت عملیات محاسباتی اضافه ای که انجام می شود عبارتند از : استفاده از قوانین با ویژگیهای بیشتر و مجموعه های فازی بزرگتر . ولی می توان آنها را با حذف ویژگیهائی که دارای تأثیر کمتری ( وزن کمتر ) هستند کاهش داد . این مورد را می توان با اعمال یک مقدار آستانه جهت حداقل وزن برای هر چهارده ویژگی انجام داد .
1/14=0.036
در اینصورت باید وزن ویژگیهای باقیمانده را دوباره نرمالسازی کنیم . با اعمال این موارد ، بازدهی سیستم به82.3% و 70.8% کاهش می یابد ولی سرعت پردازش تا حدود دو برابر افزایش خواهد یافت.
با استفاده از ترکیب ویژگیها می توان نتیجه مناسبتری بدست آورد. همانطور که در جدول 3 دیده می شود ترکیب تنها سه نوع ویژگی نتیجه مناسبتری را ارائه می دهد . ( 89.6% و 82.5% ) این مجموعه اطلاعات با ویژگیهای تولید شده توسط سیستم SOM بدست آورده شده است .

جدول 3)نتیجه ترکیب سه نمونه از ویژگیها
مجموعه دسته بندی
0 1 2 3 4 5 6 7 8 9 مجموع
یادگیری 88.6 85.3 96.2 79.0 98.3 88.6 86.6 83.2 98.7 95.4 89.6
تست 81.6 82.6 85.8 65.5 97.5 69.1 84.1 70.1 61.6 61.7 82.5

mzjahromi
چهارشنبه 30 فروردین 1385, 06:59 صبح
شناسائی فونتها با استفاده از ویژگیهای گرافیکی و تایپی
تاکنون منابع قابل توجهی درزمینه شناسائی متون تایپی ارائه شده است. سیستمهای جدید OCR که سیستمهای تک فونت نامیده می شوند ، قادر به خواندن یک فونت واحد و در بعضی موارد یک فونت ویژه ، که برای آن طراحی شده اند می باشند. ( Ocra ocrb fonts ) تحقیقات و پیشرفتهای انجام شده اخیر در این زمینه ، به منظور طراحی سیستمی جهت شناسائی کلیه فونتها می باشد. که سعی در شناسائی کاراکترهای کلیه فونتها دارد. تعدادی از سیستمهای موجود OCR تنها قادر به شناسائی دو یا سه حالت از یک فونت مثل Sanserif ,seriffed , boldItolic می باشند. در این زمینه می توان به دو روش مکمل اشاره کرد.
1-پیش روش: که کاراکترهای تحلیل شده متن هنوز شناسائی نشده اند
2-پس روش: که محتویات متن نیز در شناسائی کاراکترها کمک می کنند.
موریس توانائی مدلهای بینائی انسان را جهت تشخیص متون تایپی بررسی کرده است. او از تبدیلات فوریه جهت استخراج ویژگیهای کلی بردارها و روش کلاس بندی بیز استفاده کرده است. خوبیاری و هال نیز روشی را ارائه داده اند که فونت اصلی در یک متن را مشخص می کند.
در این مبحث پیش روشی از (Optical font Recognition) ارائه شده است که هدف آن تفاوت قائل شدن بین فونتها ئی که در بخش خاصی از متن واقع شده اند و مجموعه بیشماری از صدها فونت شناخته شده، می باشد. دراین سیستم که Apofis ( ( A priori optical font Identification system نامیده می شود، ویژگیهای گرافیکی متون تایپی از تصویر متن استخراج می شود و توسط تئوری کلاس بندی بیز مورد استفاده قرار می گیرد.


شکل 8 )دسته بندی قطعات متصل به هم




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

جدول 6)نتیجه شناسائی فونتها
FONT
Seriffed Typefaces
97.46 PL Palatino
96.92 NC New-century-schlbk
95.27 LB Lucida-bright
92.87 TN Times
SanSeriffed Typefaces
99.84 HB Helvetica-black
99.58 AG Avant-Grade
99.44 HV Helvetica
91.26 LS Lucida-Sans
TypeWriter TypeFaces
99.30 CR Courier
97.16 LT Lucida-Sans-TypeWriter
96.91 Average

mzjahromi
چهارشنبه 30 فروردین 1385, 07:01 صبح
بازشناسی کاراکترها به روش VDHMM
روش HMM ((Hidden Markov Model یکی از موفق ترین روشهائی است که تاکنون ارائه شده است این روش سعی می کند با شکستن کلمات به اجزاء کوچکتر آنها را شناسائی کند VDHMM که دراین مبحث مطرح شده است روش PDHMM موفقی جهت شناسائی کلمات دست نویسی می باشد . در این روش توسط یک مدل ، کل نمونه مدلسازی می شود . بنابراین 26 حالت مختلف که به 26 حرف مختلف در الفبا مربوط می شوند وجود دارد.قبل از شناسائی، کلمات به قطعات کوچکتری شکسته می شوند. فرض می شود که حداقل یک نقطه انقطاع بین دو کلمه دست نویس مجاور وجود دارد . به منظور تأمین این احتیاجات مجبور به استفاده از الگوریتمها ی جداسازی می باشیم ولی این الگوریتمها نقاطی قلابی نیز به عنوان نقاط انقطاع معرفی می کنند. معقول ترین راه حل، برطرف ساختن ابهامات جدا سازی با شناسائی نقاط قلابی می باشد . مهمترین سؤالی که در اینجا مطرح می شود این است که : آیا می توان مدلی برای یک کلمه ارائه داد(MD-HMM)که کلیه پارامترهای سیستم برای این مدل جدید از پارامترهای VD- HMM نتیجه شود ؟ برای درک بهتر این مدل از VD-HMM مدلی با نام NE-HMM (Non – Ergodic ) ارائه شده است. که در این مدل وضعیت هر نوع کاراکترتنها می تواند از چپ به راست بدست آید و مدل کلمات باید از اتصال مدل کاراکترهای مورد نیاز حاصل شوند . NE-HMM نیاز به مرحله دشوار یادگیری ندارد و همچنین مشکلات ویژه روش MD-HMM را نیز ندارد.

شکل 9 ) a)تصویر اصلی b)تصویر جداسازی شده c)بلوکهای تصویر
با توجه به اینکه روش VD-HMM از احتمال تکرار حروف نیز در شناسائی استفاده می کند ، مشکل دیگری که برای این روش و کلیه سیستمهای مشتق شده از آن وجود دارد ، نیاز به قابل اطمینان بودن احتمال تکرار می باشد. این احتمالات در زمان اجرا محاسبه می شود.
مرحله دوم این روش، ارائه راه حلی جهت اجتناب از محاسبه احتمال تکرار حروف می باشد. با توجه به ایتکه جداسازیهای اضافی ، توسط الگوریتمهای جداسازی تولید می شوند مجموعه های متعددی از نقاط انقطاع در نظر گرفته می شود که هر مجموعه ، با یک روش جداسازی مخصوص به خود ارائه شده است . بخش شناسائی بهترین جداسازی را انتخاب می کند. این بخش مجموعه ای را انتخاب می کند که شامل نقاط صحیح انقطاع باشند و دارای بهترین ترتیب از نظر موقعیت حروف در کلمه باشد . این فلسفه شبیه به VDHMM است ولی با استفاده از یک پیش فرض ساده دیگر به محاسبات پیچیده احتمال رخداد نیازی نیست . این مفروضات می توانند به صورت زیر باشند .
فرض کنید یک کاراکتر می تواند حداکثر به چهار کاراکتر شکسته شود. بدین ترتیب چهار احتمال تکرار برای هر وضعیت وجود خواهد داشت. پس از تخصیص دادن احتمال تکرارهای از پیش تعیین شده برای هر وضعیت ، تنها برنده انتخاب می شود. هنگام شناسائی ، با بررسی یک ، دو ، سه و یا چهار قطعه مجاور به عنوان یک نماد ، می توان بیشترین احتمال یکی از نمادها را یافت و سپس احتمال تکرار این نماد در متن را بررسی کرد . در این روش از محاسبه احتمال تکرار یک نماد در هر وضعیت، جلو گیری می شود. کارائی این روش همانطوری که انتظار می رود مانند روش VD-HMM است . این روش جدید VSL-HMM نام دارد (Variable Sequence length ) نتیجه آزمایشات انجام شده بر روی سیستمها در جداول زیر مشاهده می شود.

جدول 7) نتیجه روشهای HMM

1000 کلمه 100 کلمه 10 کلمه
VD-HMM
PD-HMM NE-HMM
MD-HMM VD-HMM
PD-HMM NE-HMM
MD-HMM VD-HMM
PD-HMM NE-HMM
MD-HMM نوع سیستم
21.27 - 24.47 - 63.82 - مستقیم
45.74 74.47 69.15 88.29 88.29 96.80 Top1
- - 82.98 95.74 98.93 100 Top5

67.02 92.55 - - - - Top10

mzjahromi
چهارشنبه 30 فروردین 1385, 07:05 صبح
در این مبحث با استفاده از روشهای ساختاری تشخیص الگو، سعی در بازشناسائی کاراکترها و بطور کلی بازشناسی الگوها داریم.
در این طرح ، با مدلسازی الگو به صورت یک گراف ، سعی در شناسائی آن داریم. بدیهی است که انجام بسیاری از عملیات ساختاری بر روی گرافها ، ساده تر از تصاویر می باشد. در این مدل نقاط بحرانی الگو، گرههای گراف را تشکیل می دهند و یالها نیز اتصالات بین نقاط هستند. حال با پیمایش گراف و بدست آوردن جهت چرخش و میزان چرخش خطوط،الگو را شناسائی می کنیم. نتایجی که از این طرح انتظار می روند به صورت زیر هستند.
مرحله اول : شناسائی کلیه کاراکترهای یک فونت خاص ، پس از یکبار یادگیری همان فونت.
مرحله دوم : شناسائی کلیه کاراکترهای فونتهای مشابه پس از یادگیری یکی از آنها.
مرحله سوم : شناسائی کاراکترهای کلیه فونتها ، پس از یادگیری چند فونت پایه
مرحله چهارم : شناسائی کاراکترهای دست نویس ، پس از یادگیری فونتهای استاندارد.
همانطور که مشاهده می شود اهدافی که در این طرح دنبال می شوند در چهار مرحله هستند که در هر مرحله تکمیل تر شده و انتظارات بیشتری از سیستم داریم . امید است که با پیاده سازی این سیستم به هر چهار مرحله فوق دست یابیم.

aakh1361
چهارشنبه 30 فروردین 1385, 20:55 عصر
واقعا مقاله خوب و کاربردی هست

موفق باشی

mzjahromi
چهارشنبه 30 فروردین 1385, 20:59 عصر
ممنون از لطفتون.

mzjahromi
یک شنبه 03 اردیبهشت 1385, 09:28 صبح
با فرض اینکه کاراکتر یا الگوی ورودی به صورت نازکسازی شده است، ابتدا نقاط بحرانی تصویر را جستجو می کنیم. این نقاط عبارتند از نقاط اتصال ، نقاط انحراف و نقاط ابتدائی و انتهائی کاراکترها. بدین ترتیب هر گونه تغیر مسیر ، انشعابات و انقطاع را به عنوان یک نقطه بحرانی علامتگذاری می کنیم
نمونه ای از اینگونه نقاط را در شکل 1 مشاهده می کنید.


شکل 1 ) نمونه هائی از نقاط بحرانی


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


شکل 2) نمونه ای از گرافهای تولید شده

حال درون گراف ، هشت نمونه یال مختلف به صورتهای زیر وجود دارد .


شکل 3) نمونه هائی از یالهای موجود در گراف

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

شکل 4 ) تشابه گرافهای یک کاراکتر در فونتهای مختلف

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


شکل 5 ) جهت پیمایش و ترتیب شناسائی
یالها در یک گره از گراف

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

شکل 6 ) نتیجه پیمایش گراف


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


شکل 7 ) نحوه پیمایش گراف به روش ترکیبی

با استفاده از روشهای فوق و شناساندن چند نمونه از فونتهای مختلف به سیستم، می توان عملیات شناسائی کاراکترها را با کارائی نسبتا مناسبی انجام داد. اما با افزودن امکانات اضافه تری به سیستم فوق ، باز هم می توان کارائی سیستم را بالا برد .
نمونه ای از اینگونه امکانات عبارتند از :
1-استفاده از روشهای آماری و همچنین استفاده از احتمالات جهت تطبیق دو الگو با یکدیگر. بدین ترتیب تطبیق دو رشته مختلف کمی پیچیده تر از یک مقایسه ساده می باشد ولی کارائی سیستم به مقدار زیادی بالا خواهد رفت.
2-یافتن روشهای مناسبتری جهت پیمایش گراف . همانطور که مشاهده شد کارائی سیستم با استفاده از روشهای مختلف پیمایش ، تغییر می کند ممکن است بتوانیم روشی بهتر و مناسب تر جهت پیمایش گراف یافته و توسط آن کارائی سیستم را بالا ببریم .
بطور کلی مراحل مختلف طی شده در این الگوریتم به صورت زیر می باشند
1-نازک ساختن خطوط تصویر ویافتن تصویر ناکسازی شده (Skeleton Image )
2-یافتن نقاط بحرانی در حداقل تعداد ممکن
3-یافتن گراف مربوط به کاراکتر ، با استفاده از نقاط بحرانی و اتصالات بین آنها
4-پیمایش گراف و یافتن رشته مربوط به پیمایش
5-جستجوی رشته حاصل شده در بانک اطلاعاتی و یافتن الگو ، با استفاده از اطلاعاتی که در مرحله یادگیری یه سیستم داده شده است .
شکل زیر تا حدودی بیانگر مراحل فوق می باشد .

mzjahromi
یک شنبه 03 اردیبهشت 1385, 09:31 صبح
3-2-1)الگوریتم نازکسازی
اولین مرحله از این الگوریتم ناکسازی است. با توجه به اینکه استخراج نقاط بحرانی و تشخیص ارتباطات بین آنها ، در یک تصویر عادی بسیار مشکل است ، نیاز یه یک الگوریتم نازکسازی می باشد. در اینجا از الگوریتم Zang – suen جهت نازکسازی تصاویر استفاده شده است. این الگوریتم در هر مرحله یک لایه از قسمتهای مرزی تصویر را برمی دارد، و این کار را تا زمانیکه ضخامت کلیه خطوط تصویر یک شود ادامه می دهد و تضمین می کند که تصویر نازکسازی شده ، در وسط تصویر اصلی قرار بگیرد ، و نقاطی که به یکدگیر متصل بوده اند ، اتصال خود را حفظ کرده و نقاط انتهائی خطوط نیز تغییری نکنند. در حذف نقاط مرزی باید به سه نکته توجه کنیم . اولا تعداد نقاط رنگی اطراف یک نقطه باید ثبت شوند . زیرا نباید نقاط انتهائی یک خط حذف شود . همچنین نقاط بحرانی که با حذف آنها اتصالات قطع خواهد شد ، نباید حذف شوند . دوم اینکه اگر در جهت عقربه ساعت به دور نقطه مورد نظر حرکت کنیم باید دو نقطه از نقاط همسایه یکدیگر ، دارای مقادیر متفاوتی باشند ( تغییر رنگ وجود داشته باشد ) بدین ترتیب می توان اطمینان داشت که نقطه درحال حذف شدن از نقاط مرزی می باشد. و همچنین باید مواظب باشیم که نقاط بحرانی تصویر حذف نشوند. با استفاده از الگویتم فوق می توان یک تصویر نازکسازی شده و مناسب جهت انجام عملیات مورد نظر به دست آورد.

3-2-2)گراف
همانطور که گفته شد در این روش کاراکترها را به صورت یک گراف مدلسازی می کنیم وسپس با پیمایش این گراف عملیات شناسائی را انجام می دهیم. بنابراین نیاز به یک الگوریتم مناسب جهت پیاده سازی گرافها داریم. بدین منظور می توان از ماتریس همسایگی استفاده کرد. ماتریس همسایگی ، یکی از روشهای پیاده سازی گراف است که توسط یک ماتریس دو بعدی ارتباطات بین گرهها را مشخص می کند. هر سطر و هر ستون از ماتریس مربوط به یک گره می باشد و در صورتی که یالی بین دو گره موجود باشد محتوای خانه مربوط به سطر گره اول و ستون گره دوم و همچنین محتوای خانه مربوط به ستون گره اول و سطر گره دوم ، علامتگذاری می شود. بدین ترتیب کلیه همسایه های هر گره مشخص می شود و ساختار کلی گراف ظاهر می شود. بدیهی است که برای پیاده سازی یک گراف با n گره ، نیاز به یک ماتریس n*n داریم .

3-2-3)صف
همانطور که می دانیم برای پیمایش گراف به روش اول سطح نیاز به یک صف جهت نگهداری گرههائی که باید پیمایش شوند داریم. در اینجا از صف دایره ای با اندازة ثابت استفاده شده است.
همانطور که می دانیم صف دایره ای نمونه ای از صف است که از یک طرف عناصر وارد آن می شوند و از طرف دیگر خارج می شوند و همچنین ابتدا و انتهای صف نیز به هم متصل هستند .



شکل 9 ) صف دایره ای

3-2-4 ) صف اولویت
با توجه به اینکه عملیات پیمایش یالهای یک گره را همیشه باید با یک ترتیب خاص انجام دهیم به یک صف اولویت نیز نیاز داریم. این صف،یالهائی را که دارای زاویه کمتری نسبت به خط عمود هستند را در ابتدا خارج می سازد. با توجه به اینکه این مسئله در هر دو روش اول عمق و اول سطح اهمیت زیادی دارد، بنابراین در هر دو روش باید از صف اولویت استفاده کنیم همانطور که می دانیم صف اولویت چیزی جز یک صف عادی که مرتبا اعضای آن اولویت بندی می شوند نیست.
همچنین ما نمی خواهیم که اعضای درون صف مرتبا اولویت بندی شوند چون بدین ترتیب باز هم ترتیب پیمایش گرهها به هم می خورد تنها چیزی که باید در نظر گرفته شود این است که در هر گره یالها به ترتیب خاصی پیمایش شوند بدین منظور کافی است که یالهای هر گره را به ترتیب خاصی وارد یک صف معمولی نمائیم بنابراین ابتدا باید یالها را مرتب نموده و سپس آنها را وارد صف نمائیم.
برای مرتب سازی ، در اینجا از الگوریتم حبابی استفاده شده است و قبل از اینکه یالهای یک گره را پیمایش کنیم آنها را مرتب نموده و سپس وارد صف می کنیم.
همانطور که مشاهده می شود از ساده ترین الگوریتمها جهت پیاده سازی این سیستم استفاده شده است. این کار به منظور ساده نمودن پیاده سازی و عیب یابی سیستم انجام شده است و پس از دستیابی به نتایج نهائی می توان الگوریتمهای مناسبتری را در نظر گرفت.

mzjahromi
یک شنبه 03 اردیبهشت 1385, 10:02 صبح
اولین مرحله پیاده سازی سیستم نازکسازی تصاویر استفاده شده است. همانطور که گفته شد از الگوریتم zong- sunen جهت نازکسازی تصاویر استفاده شده است. این الگوریتم دارای توابع زیر است.
1-Range : این تابع بررسی می کند که آیا نقطه در حال بررسی در محدوده مجاز تصویر می باشد یا خیر بدیهی است . نقاطی با طول و عرض منفی و یا نقاطی با طول و عرض بزرگتر از طول و عرض تصویر از نقاط غیر مجاز شمرده می شوند.


Function Picture.range(n,m:Integer):Integer;
Begin
if(n<0) OR (n>=w)then
range:=0
else if(m<0) OR (m>=h)then
range:=0
else
range:=1;
End;

2-Nay8 : این تابع با چرخش حول یک نقطه خاص ، تعداد نقاط رنگی اطراف آن را مشخص می کند.


Function Picture.nay8(i,j,val:Integer):Integer;
var
n,m,k:Integer;
Begin
if(GetPixel(i,j)<>val)then
Begin
Nay8:=0;
Exit;
End;
k:=0;
for n:=-1 to 1 do
Begin
for m:=-1 to 1 do
Begin
if(range(i+n,j+m)<>0)then
if(GetPixel(i+n,j+m)=val)then k:=K+1;
End;
End;
Nay8:=k-1;
End;

3-crossing-index : این تابع مشخص می کند که نواحی اطراف یک نقطه به چند دسته تقسیم می شوند. بدین ترتیب که در جهت حرکت عقربه های ساعت به دور نقطه مورد نظر می چرخد و به محظ اینکه تغییر رنگی احساس کند شمارگر خود را یکی اضافه نموده و عملیات را تا اتمام یک دور کامل ادامه می دهد با توجه به اینکه تعداد نواحی همیشه ضریبی از دو می باشد، در نهایت مقدار بدست آمده تقسیم بردو شده و برگردانده می شود .
4-thinezs : این تابع عملیات اصلی نازکسازی را انجام می دهد عملیات این تابع به صورت زیر است .
4-1)یک نقطه را در نظر گرفته و مشخص می کند که آیا این نقطه رنگی است یا خیر .


for j:=1 to y.h-2 do
for i:=1 to y.w-2 do
Begin
if(y.GetPixel(i,j)<>val)then continue;
n:=y.nay8(i,j,val);

4-2) به دنبال آن بررسی می کند که نقطه مورد نظر از نقاط انتهائی تصویر نباشد و از نقاطی که در وسط تصویر نیز نباشد .


if((n>=2) And (n<=6))Then
Begin

4-3)و سپس بررسی می کند که آیا این نقطه از نقاط مرزی است یا خیر.


if(y.crossing_index(i,j,error_code)=1)then
Begin

4-4) و در نهایت مشخص می کند که آیا با حذف این نقطه خطوط پیوسته تصویر منقطع نمی شوند .


if((y.GetPixel(i-1,j)=BackColor) OR
y.GetPixel(i,j+1)=BackColor) OR (y.GetPixel(i+1,j)=BackColor))then
Begin
if((y.GetPixel(i,j+1)=BackColor) OR (y.GetPixel(i+1,j)=BackColor) OR (y.GetPixel(i,j-1)=BackColor))Then
Begin
SetPixel(i,j,BackColor);
again:=1;
End
End

4-5) در صورتیکه کلیه شرایط فوق برقرار باشند نقطه مذکور حذف خواهد شد .
4-6)عملیات فوق برای کلیه نقاط تصویر انجام می شود .
4-7) کلیه مراحل فوق را آنقدر تکرار می کند که دیگر هیچیک از نقاط تصویر قابل حذف نباشد .
همانطور که مشاهده می شود الگوریتم فوق ، عملیات نازکسازی را با روشی کاملا ساده انجام می دهد حال تصویر حاصل آماده شناسائی می باشد .

mzjahromi
چهارشنبه 06 اردیبهشت 1385, 13:56 عصر
این الگوریتم جهت آشکار ساختن نقاط بحرانی مورد استفاده قرار می گیرد و به صورت زیر عمل می کند.
فرض کنید چهار جهت اصلی وجود دارد که عبارتند از بالا به پائین ، چپ به راست ، بالا چپ به پائین راست و بالا راست به پائین چپ ابتدا مشخص می کنیم که سه نقطه متوالی با کدامیک از الگوهای فوق تطابق دارد. حال اگر نقطه چهارم نیز در این مسیر قرار گیرد هیچگونه نقطه بحرانی وجود نخواهد داشت ولی در صورتیکه نقطه چهارم در مسیری متفاوت با مسیر قبلی قرار گیرد نقطه سوم به عنوان نقطه بحرانی علامتگذاری خواهد شد. در هر صورت عملیات فوق را با نقاط 4,3,2 ادامه می دهیم تا اینکه کلیه نقاط شناسائی شوند اما در صورتیکه سه نقطه انتخاب شده هیچکدام از مسیرهای فوق را نتواند تشکیل دهند باز هم نقطه وسط بحرانی خواند بود همچنین نقاط ابتدائی و انتهائی و نقاطی که در تقاطعها وجود دارند نیز بحرانی می باشند .
4-3) کاهش نقاط بحرانی
با استفاده از روش فوق تعدا زیادی از نقاط کنار هم به صورت نقاط بحرانی علامتگذاری می شوند بدین ترتیب در تشکیل گراف نقاط زیادی وجود خواهند داشت که نیازی به آنها نمی باشد و پیچیدگی گراف را هم بالا می برد. به همین دلیل سعی می شود که تا حد امکان نقاط بحرانی کاهش داده شوند و به حداقل تعداد ممکن برسند جهت دستیابی به این هدف درون تصویر جستجو کرده و به دنبال نقاط بحرانی کنار هم می گردیم. حال تنها نقطه ای را نگه می داریم که موقعیت آن از سایرین بحرانی تر باشد و بقیه نقاط بحرانی مجاور را به نقاط عادی تبدیل می کنیم.
عملیات فوق را در طی مراحل زیر انجام می دهیم .
1-در ابتدا بررسی می کنیم که آیا نقطه در حال بررسی از نقاط بحرانی است یا خیر در صورتیکه این نقطه از نقاط بحرانی باشد عملیات زیر را انجام می دهد.


if(GetBufPixel(i,j)=NcColor)then
exit;
Repeat

2- در بین نقاط اطراف نقطه مورد نظر جستجو می کند که آیا نقطه ای بحرانی تر از نقطه جاری وجود دارد یا خیر؟ در صورت وجود، عملیات را با آن نقطه انجام می دهد.


flag:=True;
if(getBufpixel(i,j)=CColor)then
Begin
i1:=i;j1:=j;
if((getbufpixel(i,j+1)=CColor)And(crossing_Index(i ,j+1,Road11)>crossing_Index(i1,j1,Road11)))then
Begin
j1:=j+1;
i1:=i;
flag:=False;
End;

……


if((getbufpixel(i-1,j-1)=CColor)And(crossing_Index(i-1,j-1,Road11)>crossing_Index(i1,j1,Road11)))then
Begin
i1:=i-1;j1:=j-1;
flag:=False;
End;
i:=i1;j:=j1;
End
until flag;

3- و به دنبال آن عملیات کاهش نقاط بحرانی را با نقاط اطراف نقطه جاری ادامه می دهد تابع getfriend مشخص می کند که اطراف این نقطه چه نقاطی وجود دارند و متغیر Road مشخص می
کند قبلا چه مسیر هائی طی شده است و هم اکنون نباید تکرار شود .


while(GetFriend1(i,j,i1,j1,Road1))do
Begin
DecreaseCritical(i1,j1,Road1);
Road:=Road and GetRoad(i-i1,j-j1);
Road1:=Road;
End;

4- پس از انجام عملیات بر روی نقاط اطراف نوبت به نقطه جاری می رسد و در صورتیکه اطراف این نقطه نقاطی بحرانی وجود داشته باشد این نقاط حذف خواهند شد تابع Round pixel مشخص می کند که در اطراف یک نقطه خاص چند نقطه رنگی وجود دارد.


if((getbufpixel(i,j+1)=CColor)And(RoundPixel2(i,j+ 1,BackColor,255)<>1))then
putpixel(i,j+1,NcColor);
…..

mzjahromi
چهارشنبه 06 اردیبهشت 1385, 13:59 عصر
همانطور که گفته شد نقاط بحرانی گرهها و ارتباطات بین آنها یالهای گراف را تشکیل می دهند. بنابراین برای یافتن گراف عملیات زیر انجام می دهیم .
1-یافتن گرههای گراف بدیهی است که هر نقطه بحرانی یک گره از گراف را تشکیل می دهد بنابراین کافی است نقاط بحرانی را یافته و موقعیت هر یک از آنها را به عنوان یک گره از گراف ثبت کنیم.


for j:=y1 to y2 do
for i:=x1 to x2 do
if(GetBufPixel(i,j)=CColor)then
Begin
G.SetInfo(index,i,j);
index:=Index+1;
End;

2- یافتن یالها : برای هر گره با توجه به نقاط اطراف آن یالهائی که به گره وارد شده یا از آن خارج می شوند را جستجو می کنیم بدین منظور از تابع Findedge استفاده شده است .


for k:=0 to index-1 do
Begin
G.GetInfo(k,i,j);
Road:=255;Road1:=255;
while(GetFriend1(i,j,i1,j1,Road))do
Begin
FindEdgs(i1,j1,k,Road,G);
Road1:=Road1 And GetRoad(i-i1,j-j1);
Road:=Road1;
End
End

2-1) findedge: این تابع که یک تابع بازگشتی است ، از یک نقطه شروع کرده و در یک مسیر مشخص آنقدر جلو می رود تا به یک نقطه بحرانی برسد سپس یال بین این نقطه و نقطه مبدا را علامتگذاری کرده و باز می گردد این عملیات طی مراحل زیر انحام می شود .
2-1-1) بررسی می شود که آیا نقطه بحرانی است یا خیر؟ واگر این نقطه یک نقطه بحرانی است و همان نقطه مبدا نیست ارتباط بین این گره و گره مبدا را برقرار می کنیم .


if(GetBufPixel(i,j)=CColor)then
Begin
indx:=G.GetIndex(i,j);
if(indx<>index)then
G.SetEdge(indx,index);
FindEdgs:=indx;
Exit;
End;

2-1-2) همچنین در صورتیکه در اطراف نقطه جاری، نقطه ای بحرانی وجود داشته باشد، عملیات فوق را با آن انجام می دهیم.


if(GetFriend(i,j,i1,j1,CColor,Road))then
Begin
indx:=G.GetIndex(i1,j1);
if(indx<>index)then
G.SetEdge(indx,index);
FindEdgs:=indx;
Exit;
End

2-1-3) و در انتها در صورتیکه نقطه جاری از نقاط بحرانی نباشد عملیات فوق را با نقاط اطراف آن انجام می دهیم و گره بازگردانده شده را به عنوان یکی از همسایه های گره جاری در نظر می گیریم .


else if(GetBufPixel(i,j)=NcColor)then
Begin
putpixel(i,j,BackColor);
Road1:=Road;
indx:=index;
while(GetFriend1(i,j,i1,j1,Road))do
Begin
indx:=FindEdgs(i1,j1,index,Road{Road1&Road},G);
Road1:=Road1 and GetRoad(i-i1,j-j1);
Road:=Road1;
if(indx<>index)then
Begin
G.SetEdge(indx,index);
if(GetFriend1(i,j,i1,j1,Road))then
putpixel(i,j,NcColor);
FindEdgs:=indx;
exit;
End
End;
putpixel(i,j,NcColor);
FindEdgs:=indx;
Exit;
End;

mzjahromi
پنج شنبه 07 اردیبهشت 1385, 07:03 صبح
با وجود اینکه نقاط بحرانی یافته شده، در یک مرحله کاسته می شوند، اما باز هم ممکن است نقاطی وجود داشته باشند که نیازی به آنها نیست. این مرحله از برنامه سعی در حذف گرههای اضافی گراف دارد این عملیات به عهده تابع DecreaseEdge می باشد این تابع یک زاویه را به عنوان آرگومان گرفته و کلیه خطوطی که زاویه بین آنها از این مقدار آستانه کمتر باشد را با هم ادغام می کند این عملیات به ترتیب زیر انجام می شود :
1-بررسی می شود که آیا یک گره از گراف قابل حذف شدن است یا خیر. تنها گرههائی قابل حذف شدن هستند که دو یال بیشتر نداشته باشند.


for i:=0 to v-1 do
if(EdgeNum(i)=2)then
Begin

2- هر دو یال متصل به این گره در نظر گرفته می شود و زاویه بین آن دو محاسبه می شود.


x1:=v-1;
for j:=0 to v-1 do
if(GetEdge(i,j) And (i<>j))then
Begin
x1:=j;
break;
End;
x2:=v-1;
for j:=x1+1 to v do
if(GetEdge(i,j) And (i<>j))then
Begin
x2:=j;
break;
End;
j:=Degree(x[x1],y[x1],x[i],y[i],x[x2],y[x2]);


3- در صورتیکه این زاویه از مقدار آستانه کمتر باشد گره مذکور حذف خواهدشد.


if((j<DTelorance) And (j>-DTelorance))then
Begin
ReSetEdge(i,x1);
ReSetEdge(i,x2);
SetEdge(x1,x2);
flag:=True;
End

4- عملیات فوق را تا زمانیکه هیچ گره قابل حذفی وجود نداشته باشد تکرار می کنیم .


Until(not flag);

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

M.GhanaatPisheh
پنج شنبه 07 اردیبهشت 1385, 11:21 صبح
اصلا دوست ندارم با فرستادن پست تشکر اینجا رو بیخود شلوغ کنم.
ولی مقاله بسیار جالبی هست.
منتظر ادامه داستان هستم.

sjj
جمعه 08 اردیبهشت 1385, 01:25 صبح
عالیه لطفا ادامه بدید

ermia1384
شنبه 23 اردیبهشت 1385, 16:19 عصر
سلام:
این قسمت crossing index نامفهومهه

mzjahromi
شنبه 23 اردیبهشت 1385, 16:30 عصر
از کدوم قسمت ؟ نازکسازی؟؟
کجاش نا مفهومه؟

ermia1384
یک شنبه 24 اردیبهشت 1385, 11:30 صبح
از کدوم قسمت ؟ نازکسازی؟؟
کجاش نا مفهومه؟
بله.همون قسمت نازک سازی.
اولا من متوجه نشدم کدش کدومه. ثانیا در قسمت thinezs نفهمیدم "y "چیست.

mzjahromi
یک شنبه 24 اردیبهشت 1385, 11:51 صبح
در اولین فرصت سورس کامل پیاده سازی نازکسازی رو خواهم گذاشت

samir1987
دوشنبه 25 اردیبهشت 1385, 16:01 عصر
در اولین فرصت سورس کامل پیاده سازی نازکسازی رو خواهم گذاشت
با سلام :
لطفا در صورت امکان هرچه سریعتر راجع به قسمت نازک سازی توضیح بیشتری بفرمایید.
باتشکر.

mzjahromi
دوشنبه 25 اردیبهشت 1385, 19:15 عصر
اصل مقاله اش رو Attach کردم به اسن پست اگر مشکلتون رو حل نکرد میتونید توی گوگل دنبال Skeletonization بگردید. ولی با این مشکلتون حل میشه
ببخشید آپلود نمیشه میفرستم به ایمیلتون
شما با کدوم ID کار میکنید؟
شما دو نفر هستید که به این مقاله نیاز دارید یا یه نفر؟

mzjahromi
دوشنبه 25 اردیبهشت 1385, 19:18 عصر
Appendix A: Implementation of the Zhang-Suen skeletonization algorithm from
Practical Computer Vision Using C.
/* The IMAGE data structure */
struct image
{ int nr, nc; /* rows, columns */
unsigned char **data; /* Pixel values */
};
void main(int argc, char *argv[])
{ char input[30], output[30];
struct image *x;
int error_code;
int i, j;
if (argc != 3) return;
strcpy(input, argv[1]);
strcpy(output, argv[2]);
readimage(&x, input, &error_code);
if (error_code == 0)
{ thinzs(x, 0, &error_code);
if (error_code == 0)
{ writeimage(x, output, &error_code);
if (error_code != 0) an_error(error_code);
}
else an_error(error_code);
}
else an_error(error_code);
}
/* Return TRUE (1) if (n,m) are legal pixel coordinates
for the image X, and return FALSE (0) otherwise. */
int range (struct image *x, int n, int m)
{ if (n < 0 || n >= x->nr) return 0;
if (m < 0 || m >= x->nc) return 0;
return 1;
}
/* Return the number of 8-connected neighbors of (i,j) having value VAL */
int nay8 (struct image *x, int i, int j, int val)
{ int n,m,k;
if (x->data[i][j] != val) return 0;
k = 0;
for (n= -1; n<=1; n++) {
for (m= -1; m<=1; m++) {
if (range(x,i+n, j+m))
if (x->data[i+n][j+m] == val) k++;
}
}
return k-1;
}
/* Compute the crossing index for pixel (ii, jj) */
int crossing_index(struct image *x, int ii, int jj, int *error_code)
{ int i,j,k, count;
*error_code = 0;
if ( (ii<=0)||(ii>= x->nr-1)||(jj<=0)||(jj>=x->nc-1) ){
*error_code = NO_RESULT;
return -1;
}
count = 0;
i = ii-1; j = jj-1; k = x->data[i][j];
/* Move clockwise around the (II,JJ) Pixel, counting level changes */
j++; /* Move to (i-1,j) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
j++; /* Move to (i-1,j+1) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
i++; /* Move to (i,j+1) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
i++; /* Move to (i+1,j+1) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
j--; /* Move to (i+1,j) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
j--; /* Move to (i+1,j-1) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
i--; /* Move to (i,j-1) */
15
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
i--; /* Move to (i-1,j-1) */
if (k != x->data[i][j]) { k = x->data[i][j]; count++; }
return count/2;
}
/* Zhang-Suen type of thinning procedure. Thin the region VAL */
void thinzs (struct image *x, int val, int *error_code)
{ int i,j,n, again;
struct image *y;
y = 0;
copy (x, &y, error_code);
if (*error_code) return;
do {
again = 0;
for (i=1; i<y->nr-1; i++)
for (j=1; j<y->nc-1; j++) {
if (y->data[i][j] != val) continue;
n = nay8(y, i, j, val);
if ( (n>=2) && (n<=6) ) {
if (crossing_index(y,i,j,error_code)==1) {
if ( (y->data[i-1][j]==BACKGROUND) ||
(y->data[i][j+1]==BACKGROUND) ||
(y->data[i+1][j]==BACKGROUND) ) {
if ( (y->data[i][j+1]==BACKGROUND) ||
(y->data[i+1][j]==BACKGROUND) ||
(y->data[i][j-1]==BACKGROUND) ) {
x->data[i][j] = BACKGROUND;
again = 1;
}
}
} else if (*error_code) { freeimage(y, &again); return; }
}
}
copy (x, &y, error_code);
if (*error_code) { freeimage(y,&again); return; }
for (i=1; i<x->nr-1; i++)
for (j=1; j<x->nc-1; j++) {
if (x->data[i][j] != val) continue;
n = nay8(x, i, j, val);
if ( (n>=2) && (n<=6) ) {
if (crossing_index(x,i,j,error_code)==1) {
if ( (x->data[i-1][j]==BACKGROUND) ||
(x->data[i][j+1]==BACKGROUND) ||
(x->data[i][j-1]==BACKGROUND) ) {
if ( (x->data[i-1][j]==BACKGROUND) ||
(x->data[i+1][j]==BACKGROUND) ||
(x->data[i][j-1]==BACKGROUND) ) {
y->data[i][j] = BACKGROUND;
again = 1;
}
}
} else if (*error_code) { freeimage (y, &again); return; }
}
}
copy (y, &x, error_code);
if (*error_code) { freeimage (y, &again); return; }
} while (again);
freeimage (y, error_code);
}
16
Appendix B: Implementation of the Zhang-Suen skeletonization algorithm for
Chimaera, using the C function RFUOP to simulate a call to the RFU.
/* NOTE: PICTURES MUST BE > 32 PIXELS WIDE */
#define background 0
#define foreground 1
#define N 32
#define FULL (unsigned int) 4294967295
#define PASS1 1
#define PASS2 2
#define MAX 2048
typedef struct picture
{ int nrows;
int ncols;
int wordcols;
unsigned int data[MAX][MAX/N];
} picture;
void main()
{ picture p;
char infile[50], outfile[50];
FILE *inf, *outf;
printf("\nEnter name of input file: ");
scanf("%s", infile);
printf("\nEnter name of output file: ");
scanf("%s", outfile);
inf = fopen(infile, "r"); outf = fopen(outfile, "w");
if (read_picture(&p, inf) != -1)
{ skel(&p);
write_picture(&p, outf);
}
fclose(inf); fclose(outf);
}
void skel(picture *p)
{ int mask1, mask2;
int pict[3][3];
picture newp;
int nr, nc, row, col;
int x, change;
nr = p->nrows;
nc = p->wordcols;
mask1 = (unsigned)FULL>>1;
mask2 = (unsigned)FULL<<(p->wordcols*N - p->ncols);
newp.nrows = nr;
newp.wordcols = nc;
newp.ncols = p->ncols;
for (col = 0; col < nc; col++)
{ newp.data[0][col] = p->data[0][col];
newp.data[nr-1][col] = p->data[nr-1][col];
}
while (1)
{ /* test for change */
change = 0;
/* pass 1 */
for (row = 1; row < nr-1; row++)
{ for (x = 0; x < 3; x++)
{ pict[x][0] = 0;
pict[x][1] = p->data[row+x-1][0];
pict[x][2] = p->data[row+x-1][1];
}
newp.data[row][0] = RFUOP(pict, mask1, PASS1);
change = change | (newp.data[row][0] ^ p->data[row][0]);
for (col = 1; col < nc-1; col++)
{ for (x = 0; x < 3; x++)
{ pict[x][0] = pict[x][1];
pict[x][1] = pict[x][2];
pict[x][2] = p->data[row+x-1][col+1];
}
newp.data[row][col] = RFUOP(pict, FULL, PASS1);
change = change | (newp.data[row][col] ^ p->data[row][col]);
}
for (x = 0; x < 3; x++)
{ pict[x][0] = pict[x][1];
pict[x][1] = pict[x][2];
pict[x][2] = 0;
}
newp.data[row][nc-1] = RFUOP(pict, mask2, PASS1);
change = change | (newp.data[row][nc-1] ^ p->data[row][nc-1]);
}
/* pass 2 */
for (row = 1; row < nr-1; row++)
{ for (x = 0; x < 3; x++)
{ pict[x][0] = 0;
pict[x][1] = newp.data[row+x-1][0];
17
pict[x][2] = newp.data[row+x-1][1];
}
p->data[row][0] = RFUOP(pict, mask1, PASS2);
change = change | (p->data[row][0] ^ newp.data[row][0]);
for (col = 1; col < nc-1; col++)
{ for (x = 0; x < 3; x++)
{ pict[x][0] = pict[x][1];
pict[x][1] = pict[x][2];
pict[x][2] = newp.data[row+x-1][col+1];
}
p->data[row][col] = RFUOP(pict, FULL, PASS2);
change = change | (p->data[row][col] ^ newp.data[row][col]);
}
for (x = 0; x < 3; x++)
{ pict[x][0] = pict[x][1];
pict[x][1] = pict[x][2];
pict[x][2] = 0;
}
p->data[row][nc-1] = RFUOP(pict, mask2, PASS2);
change = change | (p->data[row][nc-1] ^ newp.data[row][nc-1]);
}
/* see if any changes */
if (!change) break;
}
}
/* 0 3 6
1 4 7 for bit access
2 5 8 */
int RFUOP(int pict1[3][3], int mask, int pass)
{ int b[9], c[7];
int m, x;
int neigh, cross;
int pict2;
int nbit;
pict2 = pict1[1][1];
/* get middle bits */
for (nbit = N-1; nbit >= 0; nbit--)
{ if (nbit != N) for (x = 0; x < 6; x++) b[x] = b[x+3];
else
{ for (x = 0; x < 3; x++) b[x] = (pict1[x][0])&1 == foreground;
m = 1<<nbit;
for (x = 0; x < 3; x++) b[3+x] = (pict1[x][1]&m)>>nbit == foreground;
}
/* see if we’re at end of word */
if (nbit != 0)
{ m = 1<<(nbit-1);
for (x = 0; x < 3; x++) b[x+6] = (m&pict1[x][1])>>(nbit-1) == foreground;
}
else for (x = 0; x < 3; x++) b[x+6] = (pict1[x][2]>>(N-1))&1 == foreground;
/* if current focus pixel is foreground, continue */
if ((b[4]) && (mask&(1<<nbit)))
{ /* determine level changes */
c[0] = b[0] ^ b[1]; c[1] = b[1] ^ b[2]; c[2] = b[2] ^ b[5];
c[3] = b[5] ^ b[8]; c[4] = b[8] ^ b[7]; c[5] = b[7] ^ b[6];
c[6] = b[6] ^ b[3];
/* crossing index */
cross = 0;
for (x = 0; x < 7; x++) cross += c[x];
if ((cross == 1) || (cross == 2))
{ neigh = 0;
for (x = 0; x < 4; x++) neigh += b[x];
for (x = 5; x < 9; x++) neigh += b[x];
if ((neigh >= 2) && (neigh <= 6))
{ if (pass == PASS1)
{ if (!b[5] || !b[7] || (!b[3] && !b[1]))
{ pict2 &= ~(1<<nbit);
pict2 |= background<<nbit;
}
}
else
{ if (!b[1] || !b[3] || (!b[7] && !b[5]))
{ pict2 &= ~(1<<nbit);
pict2 |= background<<nbit;
}
}
}
}
}
}
return pict2;
}

ermia1384
سه شنبه 26 اردیبهشت 1385, 13:23 عصر
من برنامه راخوندم و یک سری سوالاتی دارم:
قسمت تبدیل تصویر به کدهارو قبلابا++cخودم نوشتم
می خواستم بدونم برای اضافه کردن به برنامم که با عرض نامحد ود(پویا)تعریف شده
می بایست در قسمت نازک سازی از الگوریتم 32 پیکس(A)استفاده کنم یا بیش از 32 پیکسل(B) ویا هردو.
با تشکر.

mzjahromi
سه شنبه 26 اردیبهشت 1385, 13:44 عصر
می خواستم بدونم برای اضافه کردن به برنامم که با عرض نامحد ود(پویا)تعریف شده
می بایست در قسمت نازک سازی از الگوریتم 32 پیکس(A)استفاده کنم یا بیش از 32 پیکسل(B) ویا هردو.
با تشکر.من منظور شما رو درست متوجه نمیشم

ermia1384
سه شنبه 26 اردیبهشت 1385, 18:45 عصر
من منظور شما رو درست متوجه نمیشم
کد شما ازدو قسمت AوBتشکیل شده:
/* NOTE: PICTURES MUST BE > 32 PIXELS WIDE */این را شما در قسمت Appendex Bنوشته اید(ابتدای آن)اما تابعی که من برای تبدیل تصویر به کداستفاده کردم به صورت پویا تعریف شده وعرض تصویر میتواند هر اندازه باشد.حالا سوال من این است که کدی که شما نوشته اید آیا
1)از دو قسمت تشکیل شده یعنیa,b
2)آیا تصویر بایدpixcel32باشد؟
با تشکر

mzjahromi
چهارشنبه 27 اردیبهشت 1385, 06:18 صبح
کد شما ازدو قسمت AوBتشکیل شده:
/* NOTE: PICTURES MUST BE > 32 PIXELS WIDE */این را شما در قسمت Appendex Bنوشته اید(ابتدای آن)اما تابعی که من برای تبدیل تصویر به کداستفاده کردم به صورت پویا تعریف شده وعرض تصویر میتواند هر اندازه باشد.حالا سوال من این است که کدی که شما نوشته اید آیا
1)از دو قسمت تشکیل شده یعنیa,b
2)آیا تصویر بایدpixcel32باشد؟
با تشکر
1) این کد رو من ننوشتم. از توی یه مقاله درش آوردم (الگوریتم Zang suen)
2) شما مجبور نیستید این کد رو عینا استفاده کنید . همونطور که من این کار رو نکردم. شما با توجه به نیازهای خودتون میتونید بخشهائی از کد رو عوض کنید.

ermia1384
چهارشنبه 27 اردیبهشت 1385, 08:34 صبح
1) این کد رو من ننوشتم. از توی یه مقاله درش آوردم (الگوریتم Zang suen)
2) شما مجبور نیستید این کد رو عینا استفاده کنید . همونطور که من این کار رو نکردم. شما با توجه به نیازهای خودتون میتونید بخشهائی از کد رو عوض کنید.

بله من با توجه به نیازهای خودم قسمت هایی از اون رو کاملا عوض کردم فقط سوال من این که
آیا Appedex A و Appendex Bجداگانه هستند یا به هم ربط دارند

ermia1384
یک شنبه 31 اردیبهشت 1385, 13:24 عصر
[QUOTE=mzjahromi][code][LEFT]
Appendix A: Implementation of the Zhang-Suen skeletonization algorithm from
تابع copyچه کاری انجام میدهد؟
آیا محتویات yرادرx کپی می کند؟
چرا در بدنه ی thinezدو بار هر کدام از مراحل برای x,وyانجام می شود؟

ermia1384
دوشنبه 01 خرداد 1385, 14:11 عصر
[QUOTE=mzjahromi][code][LEFT]

تابع copyچه کاری انجام میدهد؟
آیا محتویات yرادرx کپی می کند؟
چرا در بدنه ی thinezدو بار هر کدام از مراحل برای x,وyانجام می شود؟
کسی نیست جواب ما رو بده

mzjahromi
پنج شنبه 04 خرداد 1385, 07:26 صبح
تابع copyچه کاری انجام میدهد؟
آیا محتویات yرادرx کپی می کند؟
چرا در بدنه ی thinezدو بار هر کدام از مراحل برای x,وyانجام می شود؟


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

mzjahromi
جمعه 12 خرداد 1385, 10:52 صبح
فهرست منابع:


Lakhmi C.j Lazzerini B. (1999) ”knowledge Based intelligent techniques in character recognition” Computational Inteligence

Sirganesh M.(2001)”the role of Holistic Paradigms in HandwritenWord Recognition” IEEE Trans. Vol 23 No 2 PP 149-162

Katherine N. Scott H. (1997) Mapping methods for the chimeria Reconfigurable functional Unit” ECE Technical Report

Abdelwahab Z. Rolf I. (1998) “Optical Font Recognition Using Typographical features” IEEE Trans. Vol 20 No 8 PP 877-882

Govindaraju V. Sarguar N. (2000) “ OCR in Hierarchical feature Space “ IEEE Trans. Vol 22 No 4 PP 400-406

Kundu A. He y. Yenchen M. (1998) “ Alternative To variable Duration HMM in HandWriten Recognition” IEEE Trans. Vol 20 no 11 PP 1275-1280

Adnan A. Sameer S. (1997) ”Machine Recognition Of Hand Printed Chinese Characters” Inteligent Data Analisis” PP 101-118

Lucus j. Van Vilet Ben J. (1998) A Contour Processing Method for Fast Binary NeiburHood Operations” Pattern Recognition Vol 7 No 1 PP 27-36

mzjahromi
شنبه 13 خرداد 1385, 17:23 عصر
این سیستم در زبان C++ بطور جزئی و در زبان Delphi بطور کامل پیاده سازی شده است. همانطور که گفته شد، این سیستم به صورت کاملا ساده و بدون هیچگونه الگوریتم پیچیده ای پیاده سازی شده است.
این کار به منظور سادگی در عیب یابی و رفع مشکلات برنامه بوده است. با این وجود نتایجی که از سیستم گرفته شده است اگرچه نتایج کاملا ایده آلی نیست ولی قابل مقایسه با سایر سیستمهای موجود در این زمینه می باشد. در آزمایشات انجام شده بر روی این سیستم فرض شده است که تصویر ورودی کاملا واضح و روشن بوده و نیاز به هیچگونه نرمالسازی، حذف نویز و . . . ندارد. بنابراین آزمایشات انجام شده، در شرایط کاملا ایده آل بوده است.
همچنین برای شناسائی کاراکترها تنها از سه ویژگی استفاده شده است که عبارتند از:
میزان چرخش خطوط تصویر
میزان شباهت رشته بدست آمده در پیمایش ترکیبی گراف
نسبت طول کاراکتر به عرض آن
آزمایشات بر روی 15 فونت و در چهار مرحله مختلف انجام شده است. در هر مرحله یکی از فونتها به سیستم شناسانده شده و کارائی سیستم با سایر فونتها نیز بررسی می شود. به عنوان مثال در مرحله اول تنها فونت Andalus به سیستم شناسانده شده است ولی کارائی سیستم با هر 15 فونت بررسی شده است. و در مرحله دوم علاوه بر فونت Andalus ، فونت Arabic Transparent نیز شناسانده شده است(توجه شود که تنها کاراکترهائی از فونت جدید شناسانده می شود که سیستم قادر به شناسائی آنها نیست) و باز هم کارائی سیستم برای هر 15 فونت بررسی شده است. این عملیات تا مرحله چهارم ادامه یافته است.
نتایج این آزمایشات در جدول 1 مشاهده می شود.بدیهی است در صورتیکه تعداد فونتهای شناسانده شده به سیستم زیاد تر شود، کارائی سیستم نسبت به فونتهای مختلف بالاتر خواهد رفت ولی ممکن کارائی کلی و میانگین کارائی سیستم برای فونتهائی که به آن شناسانده شده است پائین آید.


جدول 1) نتیجه بررسی کارائی سیستم بر روی فونتهای مختلف



مرحله چهارم مرحله سوم مرحله دوم مرحله اول Font
100.0 100.0 100.0 100.0 Andalus
100.0 100.0 100.0 11.54 ArabicTransparent
100.0 100.0 73.08 7.69 ArialBlack
100.0 42.31 42.31 38.46 Arshia
80.77 80.77 80.77 15.38 ArialNarrow
42.31 42.31 46.15 7.69 ComicSans
53.85 34.62 30.77 26.92 CompSet
3.85 3.85 3.85 0.0 Courier
53.85 34.62 30.77 26.92 Elham
50.0 50.0 42.31 19.23 Impact
53.85 34.62 30.77 26.92 Kamran
65.38 65.38 61.54 0.0 Lucida
65.38 65.38 65.38 19.23 MsSans
42.31 42.31 38.46 34.62 MsSeriffed
7308 76.92 69.23 7.69 Tohoma


همانطور که مشاهده می شود کارائی سیستم برای فونتهائی که به آن شناسانده شده اند در حدود 100% است(توجه شود که این مقدار ممکن است با بزرگتر شدن مجموعه یادگیری، تا 95% کاهش یابد. ولی در صورتیکه مجموعه یادگیری زیاد بزرگ نباشد این نتیجه می تواند حفظ شود)و برای سایر فونتها (بسته به میزان تشابه کاراکترهای فونت جدید به یکی از فونتهای مجموعه یادگیری) از 0 تا 80% متغیر است.که این مقادیر(مقادیر مجموعه یادگیری) قابل مقایسه با سایر روشهای شناسائی فونتها می باشد. مشاهده می شود که کارائی این سیستم بسیار مناسب تر از کارائی سیستمهای تک فونت بوده ویا حتی قابل رقابت با سیستمهای پیشرفته تر نیز می باشد.

mzjahromi
یک شنبه 14 خرداد 1385, 09:42 صبح
1-کلیه عملیات این سیستم بر روی گرافها انجام می شود و نیازی به بررسی تصاویر نمی باشد.
2- همچنین مرحله یادگیری آن بسیار ساده و سریع می باشد(در مقایسه با مرحله یادگیری در شبکه های عصبی).
3-با توجه به اینکه تنها شکل ساختاری الگوی ورودی مورد نظر است، این سیستم مستقل از هرگونه زبان خاص بوده و با اندکی تغییر، قابل اعمال بر روی کلیه زبانها ازجمله زبان فارسی می باشد.

در پایان خاطرنشان می شویم که تحقیقات بر روی این سیستم همچنان ادامه دارد و سعی می شود که با شناسائی ویژگیهای مناسبتر سیستم را جهت شناسائی متون دست نویس مورد استفاده قرار داد.

ermia1384
پنج شنبه 25 خرداد 1385, 12:42 عصر
سلام:
من با استفاده از الگوریتمی که برای نازک سازی مطرح کردید وداشتن مرحله قبل (تبدیل تصویر به کد)برای قسمت نازک سازی درc++یک کلاس طراحی کردم.
ولی الان مشکلی که دارم این هست که وقتی برنامه را اجرا می کنم فقط قسمت اول ان یعنی تبدیل کد به تصویر انجام می شودclass ImageMatrix,,وکلاس من یعنیclass makeرا اجرا نمیکند.
نمیدونم شاید یه جا تو حلقه بی نهایت گیر می کنه#include <stdio.h>
#include <assert.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
class ImageMatrix
{
private:
FILE *fp;
unsigned long width;
unsigned long height;
long byteCols;
char **m;
void fileError();
void dec2binary(int, char *);
int pow2(int);


public:
ImageMatrix(char *fAddress); // faddress: image address
~ImageMatrix();
int read(char *faddress);
int getPixel(long x = 0, long y = 0);
int setPixel(int value=0,long x = 0, long y = 0);
int setPixel(long x = 0, long y = 0); // Returns 0 when t
//setting is successful
long getWidth();
long getHeight();
void save(char *saveAddress);
friend class make;
};

ImageMatrix::ImageMatrix(char *faddress)
{
read(faddress);

}

int ImageMatrix::read(char *faddress)
{
if ((fp = fopen("a:\\ye.bmp", "rb")) == NULL)
{
fileError();
return 1; //Error opening file
}
/* Read 1 bit bitmap: */

/* Input the width of the image: */
fseek(fp,18, SEEK_SET);
fread(&width, 4, 1, fp);
/* Input the height of the image: */
fseek(fp,22, SEEK_SET);
fread(&height, 4, 1, fp);
/* Allocate memory for m */
if (width % 8)
byteCols = width / 8 + 1; // clos: columns
else
byteCols = width / 8;
m = new char*[height];
for (int i = 0; i < height; i++)
m[i] = new char[byteCols];
for (i = 0; i < height; i++)
for (int j = 0; j < byteCols; j++)
m[i][j] = 0;
int numberOfZeros = 0;
while(byteCols % 4)
{
byteCols ++;
numberOfZeros ++;
}
byteCols -= numberOfZeros; // Reset byteCols

long bfOffBits; // 4 bytes are needed
assert(!fseek(fp, 10, SEEK_SET)); // offset to start of image data in
//bytes
fread(&bfOffBits, 4, 1, fp);
fseek(fp, bfOffBits, SEEK_SET); // go to the start of image data
for (i = height - 1; i >= 0; i--)
{

for (int j = 0; j < byteCols; j++)
fread(&m[i][j], 1, 1, fp);
fseek(fp, numberOfZeros, SEEK_CUR);
}
/* End of reading 1 bit bitmap */
return 0;
}


void ImageMatrix::dec2binary(int d, char *b)
{
int i = 0;
while(d)
{
b[i++] = d % 2;
d /= 2;
}
}

int ImageMatrix::getPixel(long x, long y)
{
if (y < 0 || y > height - 1)
y = 0;
if (x < 0 || x > width - 1)
x = 0;

int t = x / 8;
int r = x % 8;

unsigned char b = m[y][t];
char bb[8]; // binary byte
for (int i = 0; i < 8; i++)
bb[i] = 0;
dec2binary(b, bb);

return bb[7-r];
}

int ImageMatrix::setPixel(long x, long y)
{
//if (value)
//value = 1;
if (y < 0 || y > height - 1 || x < 0 || x > width - 1)
return 0; // This pixel does not exist;
/*int t = x / 8;
int r = x % 8;
unsigned char b = m[y][t];
char bb[8]; // binary byte
for (int i = 0; i < 8; i++)
bb[i] = 0;
dec2binary(b, bb);
bb[7 - r] = value;
char newValue = 0;
for (i = 0; i < 8; i++)
newValue += pow2(i) * bb[i];
m[y][t] = newValue;*/
return 1;
}

int ImageMatrix::setPixel(int value,long x, long y)
{
if (value)
value = 1;
//if (y < 0 || y > height - 1 || x < 0 || x > width - 1)
//return 0; // This pixel does not exist;
int t = x / 8;
int r = x % 8;
unsigned char b = m[y][t];
char bb[8]; // binary byte
for (int i = 0; i < 8; i++)
bb[i] = 0;
dec2binary(b, bb);
bb[7 - r] = value;
char newValue = 0;
for (i = 0; i < 8; i++)
newValue += pow2(i) * bb[i];
m[y][t] = newValue;
return 1;
}
void ImageMatrix::save(char *s)
{
FILE *saveAdr;
char ch;
if ((saveAdr = fopen(s, "wb")) == NULL)
fprintf(stderr, "\nError saving image");
long bfOffBits; // 4 bytes are needed
assert(!fseek(fp, 10, SEEK_SET)); // offset to start of image data in
//bytes
fread(&bfOffBits, 4, 1, fp);
fseek(fp, 0, SEEK_SET);
for (int i = 0; i < bfOffBits; i++)
{
fread(&ch, 1, 1, fp);
fwrite(&ch, 1, 1, saveAdr);
}

/* Number of Zeros */
int numberOfZeros = 0;
while(byteCols % 4)
{
byteCols ++;
numberOfZeros ++;
}
byteCols -= numberOfZeros; // Reset byteCols
/*----------------*/
ch = 0; // ch is set to zero for adding zeros to bitmap
for (int j = height - 1; j >= 0; j--)
{
for (int i = 0; i < byteCols; i++)
fwrite(&m[j][i], 1, 1, saveAdr);
for (int k = 0; k < numberOfZeros; k++)
fwrite(&ch, 1, 1, saveAdr);
}
fclose(saveAdr);
}

int ImageMatrix::pow2(int n)
{
int t = 1;
for (int i = 0; i < n; i++)
t *= 2;
return t;
}

void ImageMatrix::fileError()
{
fprintf(stderr, "\nError reading file");
}

long ImageMatrix::getWidth()
{
return width;
}
long ImageMatrix::getHeight()
{
return height;
}

ImageMatrix::~ImageMatrix()
{
for(int i = 0; i < height; i++)
delete [] m[i];
delete [] m;
fclose(fp);
}
/*void f(ImageMatrix &a, int x, int y, int r, int c)
{
int t;
for (int i = 0; i < a.getHeight(); i++)
for (int j = 0; j < a.getWidth(); j++)
{
t = (i-x)*(i-x)/10 + (j-y)*(j-y)/4;
if(t <= (r+1)*(r+1) && t >= r*r)
a.setPixel(j, i);
}
a.save("a:\\5.bmp");
}*/
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
class make {
public:

int check (int,int);
int around(int,int);
void thin();
};




make::check (s,t)
{

ImageMatrix a("a:\\ye.bmp");
int n,m;

int f=0;
int val=0;

if(a.getPixel(s,t)==val)
//return 0;
for(n=-1;n<=1;n++)
{
for(m=-1;m<=1;m++)
{
if(a.setPixel(s+n,t+m))
if(a.getPixel(s+n,t+m)==0)
f++;
}
}
return f-1;
}
//RETURN THE NUMBER OF 8 PIXEL AROUND (S,T) HAVING VALUE!=VAL

//**********************************
make:: around(s,t)
{
ImageMatrix a("a:\\ye.bmp");
int w,e,r,co_num;
co_num=0;
w=s-1;
e=t-1;
r=a.getPixel(w,e);
e++;

if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
e++;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
w++;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
w++;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
e--;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
e--;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
w--;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
w--;
if(r!=a.getPixel(w,e))
{
r=a.getPixel(w,e);
co_num++;
}
return (co_num/2);
}
//COMPUTE THE CROSSING INDEX FOR PIXEL (S,T);
//MOVE CLOCKWISE AROUND THE(S,T)PIXEL,COUNTING LEVEL CHANGES
//********************************
void make:: thin()
{
make d;
ImageMatrix a("a:\\ye.bmp"),b("a:\\ye.bmp");

int BACKGROUND=1;
int val=0;
int i,j,repeat,g;
//int n;
do{
repeat=0;
for(i=1;i<(a.getHeight())-1;i++)
for(j=1;j<(a.getWidth())-1;j++)
{
if(a.getPixel(i,j)==val)
//continue;
{
g=d.check(i,j);
if((g>=2)&&(g<=6))
{
if(d.around(i,j)==1)
{
if((1==b.getPixel(i-1,j))
||(1==b.getPixel(i,j+1))
||(1==b.getPixel(i+1,j)) )
{
if((1==b.getPixel(i,j+1))
||(1==b.getPixel(i+1,j))
||(1==b.getPixel(i,j-1)))
{
//a.getPixel(i,j)=BACKGROUND;
a.setPixel(1,i,j);
repeat=1;
}
}
}
}
}
for(i=1;i<(a.getHeight())-1;i++)
for(j=1;j<(a.getWidth())-1;j++)
{
if(a.getPixel(i,j)!=val)
//continue;
g=d.check(i,j);
if((g>=2)&&(g<=6))
{
if(d.around(i,j)==1)
{
if((1==a.getPixel(i-1,j))
||(1==a.getPixel(i,j+1))
||(1==a.getPixel(i,j-1)) )
{
if((1==a.getPixel(i-1,j))
||(1==a.getPixel(i+1,j))
||(1==a.getPixel(i,j-1)))
{
//a.getPixel(i,j)=BACKGROUND;
a.setPixel(1,i,j);
repeat=1;
}
}
}
}
}
}
}
while(repeat);
}
//THIN THE REGION


//**********************************
//**********************************
void main()
{
ImageMatrix a("a:\\ye.bmp");
ImageMatrix b("a:\\ye.bmp");
class make d ;
//a.setPixel(0, 0, 2);
//a.setPixel(36, 39, 1);

clrscr();

// cout << "hi";
for (int j = 0; j < a.getHeight(); j++)
{
printf("\n");
for (int i = 0; i < a.getWidth(); i++)
{
int b = a.getPixel(i, j);
if(b)
d.thin();
//printf("%c", 178);
//else
//printf(" ");



}
}
a.save("a:\\4.bmp");
/* int s,t;
// int dcheck= d.check(s,t);
//int daround=d.around(s,t);
for( s=0;s<a.getHeight();s++)
{

for( t=0;t<a.getWidth();t++)
{
if((a.setPixel(s,t)))
//continue;

// cout << "b";
d.check(s,t);

d.around(s,t);
d.thin();
// printf("*");
}

}*/
getch();
}

ermia1384
پنج شنبه 25 خرداد 1385, 12:53 عصر
برای قسمت عکس با توجه به جایی که عکس را قرارمی دهید مسیر را عوض کنید
شما می توانید یک حرف در paintبکشید واز ان استفاده کنیدولی درمحیط سیاه وسفید

mzjahromi
جمعه 26 خرداد 1385, 20:02 عصر
منظورتون از تبدیل تصویر به کد همون لود کردن تصویر در حافظه هست؟
نازکسازی رو من ازش جواب گرفتم.
Traceکردن کد شما عملا کار سختیه
مشکل رو خودتون راحتتر میتونید پیدا کنید

negarmosh
جمعه 13 مرداد 1385, 09:24 صبح
من این ترم پروژه پایانیم در مورد تشخیص حروف دست نویس فارسی با استفاده از نرم افزار matlab است شما می تونید در این زمینه کمکی بکنید یا کسی که قبلاً انجام داده باشه را به من معرفی کنید ؟
با تشکر

mzjahromi
شنبه 14 مرداد 1385, 07:33 صبح
دوست عزیز این قبیل مسائل ربطی به محتویات تاپیک نداره و بهتره از طریق پیغام خصوصی مطرح کنید

realman
پنج شنبه 02 شهریور 1385, 16:54 عصر
با عرض سلام و خسته نباشید خدمت شما:
مقاله فوق العاده ای بود.واقعا ممنون.
ممکنه اطلاعاتی هم در مورد حذف نویز در اختیار ما قرار بگید؟(حتی به صورت کلی).
پیشاپیش از لطف شما متشکرم.

ali_pourhadi
پنج شنبه 30 شهریور 1385, 03:11 صبح
سلام آقا من جدا از مطالب اتون استفاده کردم
میخواستم اگه مکنه مقاله رو به طور کامل یه جا آپلود کنید که همه استفاده کنند مثل rapidshare
در هر صورت ممنون میشم
من یه قبل از اینکه مطالب شما رو بخونم روی ocr فارسی خیلی فکر کرده بو دم ولی هیچ راه حل
خوبی به ذهنم نرسید یه برنامه برای پروژه درس طراحی الگوریتم ام نوشتم که برای تشخیص اعداد 1 و 2 و 3 و 4 که با دست نوشته شدن و چاپی نیستن البته میشه بیشترش کرد ولی من چون با همین نمره امومیگرفتم ادامه ندادم:خجالت:
من از روش اسکن سطری و ستونی استفاده کردم
سورس برنامه اتچ میکنم که اگه کسی خواست استفاده کنه
اگه تکمیل اش هم کردین به ما هم بدین:لبخند:
عکسی که میگیره باید 50 * 50 pixel باشه . البته نسبت به نویز حساسه ولی میشه اسکن دایره ای هم اظافه کرد که خطا کمتر بشه . من چند نمونه از اعدادی که تشخیص میده قرار دادم
سعی کردم اداد طوری باشه که معمولا ما تو دست نوشته های خودمون بکار میبریم
سورس مربوط به vb.net است

XackerX
سه شنبه 12 تیر 1386, 11:40 صبح
سلام . آقا میشه سورسهاتون رو آپلود کنین تا بتونسم بهتر استفاده کنیم . اگه این کار بشه منم یه چیزائی تو مطلب دارم که آپ میکنم

Hadizadeh
سه شنبه 26 تیر 1386, 11:06 صبح
دوستان، بنده نرم افزار OCR حروف گسسته و ارقام چه فارسی و چه به هر زبانی دیگری رو نوشتم و الان هم تو چند تا پروژه صنعتی داره کار میکنه. اگه مایل هستید تا اطلاعات بیشتری به دست بیارید به من یه ایمیل بزنید: hadipardis_at_yahoo.com
این نرم افزار vرو به فرم یک ActiveX می تونم بهتون بدم گه جهت کارهای OMR یا علامت خوانی هم می تونه مورد استفاده قرار بگیره.

Inprise
سه شنبه 26 تیر 1386, 18:20 عصر
دستخط یا حروف تایپ شده ؟

mzjahromi
سه شنبه 26 تیر 1386, 18:32 عصر
سلام . آقا میشه سورسهاتون رو آپلود کنین تا بتونسم بهتر استفاده کنیم . اگه این کار بشه منم یه چیزائی تو مطلب دارم که آپ میکنم

برای اینجور نرم افزارها سورس کمک چندانی نمیتونه بکنه و ......
به همین دلیل هم فقط تکه های کلیدی اش رو گذاشتم

Hadizadeh
چهارشنبه 27 تیر 1386, 21:54 عصر
دستخط یا حروف تایپ شده ؟

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

Inprise
چهارشنبه 27 تیر 1386, 22:12 عصر
میتونی یک دموی ساده برای شناسائی اعداد فارسی 1-9 بصورت دستخط همینجا بگذاری ؟ قاعدتا حق داری برنامه رو کاملا محدود کنی تا فقط یه Proof of Concept باشه .

Hadizadeh
جمعه 29 تیر 1386, 16:34 عصر
از لحاظ دمو مشکلی نیست ولی من این کارو برای کسی که واقعا خواهان اون هست می تونم انجام بدم. حالا کی می خواد؟ و برای چه کاری می خواد؟

Inprise
شنبه 30 تیر 1386, 12:47 عصر
من لااقل الان قولی نمیدم ؛ بنابراین اگر مایل بودی اینکار رو انجام بدی میتونی به عنوان یک جور مارکتینگ بهش نگاه کنی چون این اطراف خیلی ها به این موضوع علاقه دارن . اگر دموئی مطابق درخواست قبلی ام اینجا گذاشتی و نتیجه اش قابل توجه بود از مدیر سایت تقاضا میکنم برای مدت مشخصی یک امکان آگهی تبلیغاتی رایگان برای محصول یا خدمتی که میتوانی ارائه کنی بهت بده . در بدترین حالت حتی اگر نخواستی کدی منتشر کنی مقداری عکس واقعی بدون ادیت که مسئله طرح شده رو نشون بدن هم میتونه خوب باشه

Hadizadeh
شنبه 30 تیر 1386, 15:35 عصر
از توجه خاص شما ممنونم. اول اجازه بدید که یک مسئله مهم رو من دوباره خاطرنشان کنم و اونم اینکه اصولا کاربردهای بینایی ماشین و در حالت خاص تر مثل مسئله تشخیص کاراکتر که عمدتا در حوزه کامپیوتر ویژن از اون نام می برند بستگی کامل به نوع کاربرد داره. مثلا در تمامی حالات که اینجا داریم صحبت می کنیم فرض رو بر این می گیریم که ما کاراکتر های مورد نظر رو قبلا با انجام یکسری عملیات پیش پردازش و پست پراسسینگ یا همون پس پردازش های لایت کرده ایم. مثلا شما نباید انتظار داشته باشید که من یک برنامه بهتون بدم که شما به ورودی اون یک عکس حاوی کاراکتر ها با هر بک گروند و یا حتی دارای نور نان یونیفورم (غیر یکنواخت)‌ باشه و بعد انتظار داشته باشین که برنامه درست جواب بده. ولی خوب اگه شما یک کاراکتر باینری شده (که با اعمال یک سطح آستانه عمدتا تطبیقی مثل اتسو به دست اومده) رو به برنامه دادید باید سیستم درست کار کنه و من هم از برنامه ای که به زودی اینجا می زارم تا همین قدر بیشتر ازش انتظار ندارم. نکته دوم اینکه همین طور که قبلا هم اشاره کردم، من فقط به شما برنامه OCR حروف گسسته تایپی رو می دم نه دست خط! دست خط اون هم فارسی یک دنیای پیچیده دیگه ای داره. ثالثا برای شروع یک برنامه بهتون می دم که نیاز به آموزش فونت مورد نظر رو داره لذا انتظار یک برنامه همه منظوره رو هم نداشته باشین. با این اوصاف هنوز هم خواهان اون هستید؟

Hadizadeh
یک شنبه 31 تیر 1386, 07:52 صبح
من یک نکته دیگه رو یادم رفت که بگم و اونم اینکه همینطورکه در بالا اشاره کردم، انتخاب مناسب متد OCR کاملا بستگی داره به نوع کاربرد مثلا وقتی شما می دونید که سایز (ارتفاع) کاراکترهای شما از یک حد خاص بیشتره اونوقت می تونید روش مناسب تر رو راحت تر پیدا کنید و یا اگه می دونید که مثلا کاراکترهای شما هیچ نوع چرخش و یا کجی (Skew) ندارند خوب طبیعی که بازهم مسئله ساده تره. اینو گفتم که اگه دوستان کاربرد خاصی مد نظرشون هست ، اشاره کنند تا زودتر به جواب برسیم. به هر حال چه Open در داخل این فروم و چه خصوصی از طریق ایمیلم می تونید کاربردتون رو مطرح کنید امیدوارم که بتونم کمکتون کنم.

Inprise
یک شنبه 31 تیر 1386, 08:26 صبح
پس مسئله دستخط - فعلا - منتفی است . میتونی یک دموی ساده برای شناسائی اعداد انگلیسی تایپ شده اینجا بگذاری ؟ شرایط ورودی رو خودت مشخص کن . با توجه به فعالیتت در بخش دلفی باید فرض کنیم که با دلفی کد مینویسی ؟ مجبور نیستی به این سوال اخر جواب بدی البته .

Hadizadeh
یک شنبه 31 تیر 1386, 08:41 صبح
بله حتما این کارو می کنم و دلفی هم زبان مورد علاقه منه! فقط یک کمی وقت می خوام. به زودی ان شاء الله

Hadizadeh
یک شنبه 31 تیر 1386, 09:38 صبح
دوستان همین طور که قول داده بودم برنامه OCR اعداد به هر زبانی رو ضمیمه کردم. منتظر نظرات شما هستم.

Hadizadeh
یک شنبه 31 تیر 1386, 09:40 صبح
یادم رفت بگم که توضیحات نحوه کار با اون در خود برنامه با فشردن کلید Help نشون داده میشه. از بالا به پایین و از چپ به راست فیلدها و یا دکمه ها رو به ترتیب بررسی کنید. اگه سوالی هست خوشحال میشم بشنوم!

Hadizadeh
یک شنبه 31 تیر 1386, 11:38 صبح
دوستات توجه کنند که انتخاب نمونه های آموزشی مناسب و کافی (حتی نمونه های نویز دار) در دقت برنامه بسیار موثر هست. همچنین توجه کنید که پس از فشردن دکمه Learn در دیالوگ دوم به شما یک مقدار خطا نشون داده میشه که برای عملکرد درست می بایست این خطا تا حد امکان کوچیک باشه یعنی مثلا زیر 0.1 باشه. میزان این خطا بستگی مستقیمی به نمونه های آموزشی و تعداد تکرار و همچنین توپولوژی شبکه آموزشی به کار رفته داره که در اینجا چون هدف صرف یک دموی ساده بوده من پارامترهای مربوط به شبکه رو حذف کردم و لذا شما نمی تونید اونها رو دستکاری کنید. بنابراین ممکنه برای یک بانک آموزشی خاص شما دقت خیلی خوبی نگیرید که یک دلیل مهمش همین امره.

Hadizadeh
چهارشنبه 03 مرداد 1386, 17:33 عصر
آقای Inprise دمو رو دیدید؟ نظرتون چیه؟

mzjahromi
چهارشنبه 03 مرداد 1386, 19:39 عصر
اینهم نسخه اجرائی برنامه پیاده سازی شده ای که من کار کردم.
البته میشه خیلی بهتر از اینها روش کار کرد ولی من بیشتر وقت نداشتم
نکاتی در مورد روش استفاده از برنامه
1- در برنامه یک چک باکس با عنوان Learn مشاهده میکنید اگر این چک باکس تیک خورده باشد برنامه در مد آموزش قرار میگیرد و پس از شناسائی هم نمونه از شما در مورد صحت شناسائی سوال میکند
2- از قسمت سمت چپ نرم افزار فایل BMP را انتخاب نموده و دکمه Start را بزنید
3 نرم افزار حاوی یک فایل DB است که هم اکنون با فایل FontNum.BMP برای شناسائی اعداد آموزش داده شده است. در صورت تمایل میتوانید این فایل رو در Database Desktop (از دلفی) بازکرده و اطلاعات آنرا تخلیه کنید و روال آموزش را خودتان طی کنید.
4- همانطور که گفته شد نرم افزار آموزش پذیر است و برای شناسائی کاراکتر ها اعداد و نمونه های هم شکل میتواند مورد استفاده قرار گیرد
5 - نرم افزار در شرایط کاملا آزمایشگاهی و ایده آل تست شده است.
مجموعه ای از تصاویر جهت تست برنامه قرار داده شده است

Hadizadeh
شنبه 13 مرداد 1386, 11:15 صبح
آقای جهرمی من متاسفانه متوجه نشدم چه جوری باید با برنامه شما کار کرد؟ کلاسیفایرت چیه؟

mzjahromi
شنبه 13 مرداد 1386, 12:43 عصر
کدوم قسمت رو مشکل دارید؟
یه تصویر بهش معرفی میکنید
میتونید بهش آموزش بدید
یا بخواهید که شناسائی کنه

اطلاعاتی که در مورد برنامه میخواهید توی صفحات اول مقاله هست. هم در مورد نحوه شناسائی و هم در مورد میزان دقت
میزان دقت برای تا 3 فونت 100 درصد هست ولی وقتی مجموعه یادگیری زیاد میشه یه کم دقت میاد پائین
البته پیاده سازی اش اونجوری که من دوست داشتم در نیومد و بیشتر وقت نذاشتم و الا انتظار خیلی بیشتر از اینها ازش داشتم حتی میشد توسعه اش داد برای حروف فارسی و سایر زباهنها چون بیشتر Pattern رو تشخیص میده نه دقیقا کاراکتر رو

علی اکبر اله داغی
دوشنبه 05 شهریور 1386, 12:13 عصر
با سلام خدمت دوستان
من در زمینه OCR خیلی وقته دارم کار می کنم به خصوص حروف فارسی چاپی
ولی الان برای شما یک برنامه ای که از شبکه عصبی مصنوعی برای آموزش استفاده می کنه رو براتون می ذارم
جهت اموزش به شبکه اینطور عمل کنید:
1لف)یک روش اینست که شما خودتون حرف رو براش می کشید و در قسمت "حرفی که شبکه می آموزد" حرف آنرا بنویسید و کلید "آموزش" رو بزنید
ب) روش دیگه اینه که از فونت خاصی استفاده کنید جهت اینکار هم در قسمت "حرفی که شبکه می آموزد" حرف آنرا بنویسید و ایندفعه قبل از کلید آموزش کلید "رسم حرف" بزنید و بعد کلید آموزش
جهت تست شبکه هم پس از رسم اون در شبکه (جدول) کلید "تشخیص" رو بزنید
شما حتی می تونید شبکه عصبی بدست اومده رو ذخیره کنید
منتظر نظراتتون هستم....

Hadizadeh
دوشنبه 05 شهریور 1386, 12:32 عصر
آقای داغی ، ورود شما رو به جامعه برنامه نویس خوشامد می گم. ببینم شما می تونید یک کاراکتر جدید رو بدون آموزش مجدد کل شبکه به سیستم آموزش بدید؟

علی اکبر اله داغی
دوشنبه 05 شهریور 1386, 12:38 عصر
بله
در صورتی که به ازای هر حرف بخواهیم یک نرون داشته باشیم که در اینصورت حجم شبکه افزایش پیدا می کنه و شبیه به همان مقایسه یک حرف با تمام حروف خواهد شد که عملا ارزش شبکه عصبی از بین خواهد رفت
همانطور که می دونید یکی از مزیت های شبکه های عصبی همین موازی کار کردن اونهاست
در ضمن من "اله داغی" هستم
مرسی

Hadizadeh
دوشنبه 05 شهریور 1386, 12:42 عصر
بله
در صورتی که به ازای هر حرف بخواهیم یک نرون داشته باشیم که در اینصورت حجم شبکه افزایش پیدا می کنه و شبیه به همان مقایسه یک حرف با تمام حروف خواهد شد که عملا ارزش شبکه عصبی از بین خواهد رفت
همانطور که می دونید یکی از مزیت های شبکه های عصبی همین موازی کار کردن اونهاست

نه نه اینطوری نمیشه گفت. مگه شبکه عصبیتون از چه نوعیه؟ پس انتشار نیست؟

علی اکبر اله داغی
دوشنبه 05 شهریور 1386, 14:11 عصر
این هم یک مقاله در رابطه با OCR و شبکه های عصبی همراه با شرح یک نمونه عملی ساده که مربوط به درس شیوه ارائه خودم بوده

علی اکبر اله داغی
یک شنبه 11 شهریور 1386, 14:06 عصر
نه نه اینطوری نمیشه گفت. مگه شبکه عصبیتون از چه نوعیه؟ پس انتشار نیست؟

چه ارتباطی با انتشار داشت؟!!!!!!!!

Hadizadeh
یک شنبه 11 شهریور 1386, 14:09 عصر
چون شبکع عصبی چند لایه یک سیستم بچ هست که نیاز به همه داده های آموزشی جهت آموزش مجدد دارد .البته بستگی به متد آموزش داره. تو پس انتشار این طوریه!

Hadizadeh
یک شنبه 11 شهریور 1386, 14:12 عصر
آقای اله داغی من برنامتون رو چک کردم. این طور که به نظر می رسه شما هیچ نوع متد استخراج ویژگی استفاده نکردی که همین امر دلیل دقت پایین اون هست. در کارهای OCR دو تا چیز مهم تر از طبقه بند نهایی هستند 1- استخراج وِیژگی های مناسب و اصطلاحا فیشری و 2- انتخاب مناسب داده های آموزشی

علی اکبر اله داغی
دوشنبه 12 شهریور 1386, 08:22 صبح
آقای اله داغی من برنامتون رو چک کردم. این طور که به نظر می رسه شما هیچ نوع متد استخراج ویژگی استفاده نکردی که همین امر دلیل دقت پایین اون هست. در کارهای OCR دو تا چیز مهم تر از طبقه بند نهایی هستند 1- استخراج وِیژگی های مناسب و اصطلاحا فیشری و 2- انتخاب مناسب داده های آموزشی

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

alimf64
سه شنبه 18 تیر 1387, 16:56 عصر
آقای ذوالقدر لطفا اگه میشه من یک نسخه از پروژه شما رو داشته باشم.
ممنون می شم

mahoubi
جمعه 04 مرداد 1387, 22:06 عصر
سلام کسی میتونه در مورد ارقام دستنویس منو کمک کنه؟

svs-vhs
شنبه 21 آذر 1388, 23:25 عصر
sلام
میدونم این مبحث خیلی قدیمیه. ولی خیلی عالیه
اما من عکس های این مقاله رو هم میخواستم ببینم. ولی مثل اینکه اصلا وجود ندارن.
کسی ندیده؟؟ یا نداره؟؟

nnehrshad
سه شنبه 28 اردیبهشت 1389, 10:23 صبح
اصل مقاله اش رو Attach کردم به اسن پست اگر مشکلتون رو حل نکرد میتونید توی گوگل دنبال Skeletonization بگردید. ولی با این مشکلتون حل میشه
ببخشید آپلود نمیشه میفرستم به ایمیلتون
شما با کدوم ID کار میکنید؟
شما دو نفر هستید که به این مقاله نیاز دارید یا یه نفر؟
می شه واسه منم ایمیل کونی
nnehrshad_alpha@Yahoo.com

nnehrshad
سه شنبه 28 اردیبهشت 1389, 10:27 صبح
دوستان، بنده نرم افزار OCR حروف گسسته و ارقام چه فارسی و چه به هر زبانی دیگری رو نوشتم و الان هم تو چند تا پروژه صنعتی داره کار میکنه. اگه مایل هستید تا اطلاعات بیشتری به دست بیارید به من یه ایمیل بزنید: hadipardis_at_yahoo.com
این نرم افزار vرو به فرم یک ActiveX می تونم بهتون بدم گه جهت کارهای OMR یا علامت خوانی هم می تونه مورد استفاده قرار بگیره.
می شی واسه منم بفرستی
nnehrshad_alpha@yahoo.com

nnehrshad
سه شنبه 28 اردیبهشت 1389, 10:31 صبح
خلاصه ای از پرژه پایانی دوره کارشناسی
تهیه کننده: محمد ذوالقدر

آذر ماه 1380
چکیده :
بازشناسی حروف و کاراکترها یکی از موضوعات جالبی است که درقرون اخیر توجه بسیاری از محققین را به خود جلب کرده است . دراین مبحث با استفاده از تئوری گرافها سعی در بازشناسی کلمات، حروف،و بطور کلی الگوهای مختلف داریم. عملیات شناسائی با استفاده از نقاط بحرانی، محل چرخشها، اتصالات و ارتباطات بین آنها انجام می شود. در نهایت می توان نظریه احتمالات را نیز جهت تطبیق الگو با نمونه های موجود، مورد استفاده قرار داد. ولی آنچه تا کنون استفاده شده است تطابق قطعی الگوها با نمونه های موجود در بانک اطلاعاتی می باشد .
می شی ایمیلتونو بدید
nnehrshad_alpha@yahoo.com

meysam_online
دوشنبه 31 خرداد 1389, 12:22 عصر
سلام . امکانش هست که این مقاله رو واسم بفرستید. ممنون میشم.
خیلی ضروری(M-Roostaei@myway.com)
roostaei.stu@gmail.com

smile17
شنبه 05 تیر 1389, 21:51 عصر
منم یه سری مقاله در زمینه ی OCR دارم که براتون میزارم
http://rapidshare.com/files/403014802/ocr.zip.html

mahsan66
سه شنبه 12 مرداد 1389, 11:48 صبح
سلام من این برنامه روبازبان متلب پیاده سازی کردم جواب داد اگه خواستید میتونم کمکت کنم البته مال من ocrبرای حروف لاتین است.شما هم اگه مقاله یامطلب بدرد بخور دارید برام بفرستید ممنون میشم
sedsyebaroon_mgh66

FarzadiCe
شنبه 22 بهمن 1390, 12:47 عصر
سلام من این برنامه روبازبان متلب پیاده سازی کردم جواب داد اگه خواستید میتونم کمکت کنم البته مال من ocrبرای حروف لاتین است.شما هم اگه مقاله یامطلب بدرد بخور دارید برام بفرستید ممنون میشم
sedsyebaroon_mgh66


سلام؛میشه این برنامه رو برای من ارسال کنید.
Farzad_Fire [at] Yahoo.Com

bhodaaaaa
جمعه 12 خرداد 1391, 11:33 صبح
سلام
مطالبتون جالب بود.ممنون
من پروژه دارم اين ترم درمورد بازشناسي اعداد بامتلب درپرسپترون ،پياده سازيشو ياد ندارم ممنون ميشم راهنماييم کنيد.
تاحالابامتلب کار کردم امادرسطح ابتدايي اماباشبکه عصبي نه.....
bhoda68_h@yahoo.com
مرسي

farnoosh1
سه شنبه 27 تیر 1391, 10:23 صبح
سلام
من یه برنامه ocr انگلیسی ساده میخوام برای پروژه پایانی کسی می تونه به من کمک کنه؟؟؟!!
ممنون میشم

badami68
جمعه 16 فروردین 1392, 13:09 عصر
سلام من این برنامه روبازبان متلب پیاده سازی کردم جواب داد اگه خواستید میتونم کمکت کنم البته مال من ocrبرای حروف لاتین است.شما هم اگه مقاله یامطلب بدرد بخور دارید برام بفرستید ممنون میشم
sedsyebaroon_mgh66
برا منم masood.badami.110@gmail.com

MOSA-jafarzade
پنج شنبه 19 اردیبهشت 1392, 18:53 عصر
سلام وقت بخیر .ببخشید اگه ممکنه منابعی هم در این رابطه معرفی کنید .ممنون از اطلاعات خوبتون .

مصطفی ساتکی
جمعه 20 اردیبهشت 1392, 23:13 عصر
سلام.
به نظر من اگر دنبال کتاب خوب می گردید کتاب Character Recognition Systems: A Guide for Students and Practitioners را تهی کنید من بعضی از فصل هاشو خوندم کتاب خوبی هستش.

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

موفق باشید.

imanzaker
چهارشنبه 08 خرداد 1392, 13:43 عصر
سلام
سورس کامل این برنامه را ندارید؟

nima_186128
سه شنبه 17 شهریور 1394, 12:54 عصر
سلام. من دارم روی پروژه ocr کار می کنم. با جداکردن کارکتر ها از عکس هم مشکلی ندارم. اما مشکل من اینه که نمیدونم بعد از جدا کردن هر کارکتر یا کلمه از تصویر چجوری تشخیص بدم که چه کارکتری هست. چندین متد تست کردم اما نتیجه مناسبی نگرفتم. اخرین روشی که تست کردم به خوبی تشخیص می داد، اما مشکلش این بود که یک عکسی که 5 یا 6 تا عدد بیشتر نداشت و 45 ثانیه طول کشید تا تشخیص داد!!! میخاسم بدونم از شما عزیزان کسی می تونه ویژگی از هر کارکتر بهم معرفی کنه که واسه هر کارکتر یکتا باشه؟

reyhane.a
شنبه 28 شهریور 1394, 00:55 صبح
سلام ممنون میشم برنامتون با زبان متلب را واسه منم ارسال کنید
r.attarian90@gmail.com

mohajer404
دوشنبه 28 دی 1394, 21:26 عصر
سلام من این برنامه روبازبان متلب پیاده سازی کردم جواب داد اگه خواستید میتونم کمکت کنم البته مال من ocrبرای حروف لاتین است.شما هم اگه مقاله یامطلب بدرد بخور دارید برام بفرستید ممنون میشم
sedsyebaroon_mgh66

و من ....:لبخندساده: hakime.mazaheri@yahoo.com