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

## asefy2008

سلام 
دوستان نمونه کدی برای این مورد دارن؟
فرق نمی کنه از چه روشی باشه.
در ضمن برای هر کدوم از قسمت های زیر هم نمونه کدی داشتن بزارن ممنون میشم(مخصوصا قسمت مربوط به شناسایی مردمک برای پیدا کردن مرکز وشعاع آن):
1.iris segmentation :
1.1)iris localization
1.2)noise reducation
2.normalizaton
3.شیوه های رمزگذاری 
4.مقایسه کردن 
همچنین کدهای سی شارپ الگوریتم های زیر :
sobel algorithm_canny algorithm_hough transform_داگمن_ma_Wildes_cui_xu_chavez_تش  یص یک مربع از دایره
(اگر هم سی شارپ نبود زبان های دیگه داشتن بزارن)
اگر هم تونستن در مورد این موارد هم یه توضیح بدن :
data mining_back propogation_paralel search algorithms_تبدیل ویولت گابور _ gabor filter 
اگر این casia دیتابیس رو هم کسی داره لطف کنه ممنون میشم . 
با بیان هر مطلبی که مربوط به این موضوع میشه می تونید کمک کنید.
در نهایت هم از این که موضوع طولانی و چندین سوال مطرح شد عذر می خوام می خواستم موضوع پراکنده نشه.
با تشکر از توجه شما

----------


## asefy2008

یعنی کسی در این مورد هیچی نمی دونه؟

----------


## seven7777777

asefy جان سلام
میگم مطمئنی این مطلب مبتدیه !!! :گیج: 

فکر کنم باید دست به دامن گوگل شی ...

----------


## asefy2008

سلام



> میگم مطمئنی این مطلب مبتدیه !!!


خوب آره :لبخند گشاده!: 



> فکر کنم باید دست به دامن گوگل شی ...


دست به دامن گوگل که خیلی وقت شدم ولی انصافا که خیلی سخته(مغزم دود کرده)
مطالب بسیار زیاد ولی اکثرا فارسی نیست و همچنین راه های زیادی وجود داره که آدم گیج میشه. مثلا می خوام از شبکه های عصبی (پرسپترون) برای تشخیص یک دایره از یک مربع استفاده کنم اصلا نمی دونم از کجا باید شروع کنم .درCODEPROJECT و CODE.GOOGLE هم هیچی پیدا نکردم اگر دوستان سایت های دیگه میشناسن که در مورد این مطلب توضیح داده کمک کنن.

----------


## حمید محمودی

سلام

بله که این مطلب خیلی مبتدیه !!!!  :بامزه: 

اما به نظر من با برنامه نویس های این سایت صحبت بکنی بد نیست.(پولشم که میدونی.....)

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

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

ممنون

----------


## asefy2008

> قبلنا اینکارو در حال تحقیقش بودم ولی ازبس موضوع پیچیده بود ولش کردم.که به جاییم نرسیدم.(شما اگه رسیدی بیا و برادری بکن یکمی توضیح بده.)


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




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


در این مورد چیزی نشنیدم.

----------


## Mohsen_cia

با سلام
من  اطلاعاتی در زمینه Iris Recognition دارم، اما نمیدونم که شما دقیقا چیکار میخواین کنین ...

قبلا من Fingerprint Recognition رو عملا به کار بردم ... هم Verification  و هم Identification  ... البته برنامه نویسیم زیاد خوب نیست ... اونم با VB.NET نوشتم با SDK

حالا اگه میتونم کمکی کنم بهم اطلاع بدین، منم بدم نمیاد Iris رو هم عملی کنم.
Mohsen_cia[@]Yahoo[dot]com

----------


## arefba

https://barnamenevis.org/showpo...&postcount=195
یه نمونه برنامه امیدوارم به دردت بخوره

----------


## asefy2008

> با سلام
> من اطلاعاتی در زمینه Iris Recognition دارم، اما نمیدونم که شما دقیقا چیکار میخواین کنین ...
> 
> قبلا من Fingerprint Recognitionرو عملا به کار بردم ... هم Verification و هم Identification ... البته برنامه نویسیم زیاد خوب نیست ... اونم با VB.NETنوشتم با SDK
> 
> حالا اگه میتونم کمکی کنم بهم اطلاع بدین، منم بدم نمیاد Iris رو هم عملی کنم.
> Mohsen_cia[@]Yahoo[dot]com


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



> https://barnamenevis.org/showpo...&postcount=195
> یه نمونه برنامه امیدوارم به دردت بخوره


ممنون

----------


## asefy2008

این هم الگوریتم لبه یاب sobel که با سی شارپ پیاده سازی شده :
  public Bitmap SobelAlgorithm(Bitmap Image)
        {
            Bitmap Result = new Bitmap(Image.Width, Image.Height);
            int temp, temp2;
            int[,] SobelHorizontalArray = new int[3, 3]{
                                                         { 1, 2, 1},
                                                         { 0, 0,  0},
                                                         { -1,-2,-1}
                                                       };
            int[,] SobelVERTICALArray = new int[3, 3]{
                                                         { 1, 0,-1},
                                                         { 2, 0,-2},
                                                         { 1,0,-1}
                                                       };
            for (int i = 0; i < Image.Width; i++)
            {
                for (int j = 0; j < Image.Height; j++)
                {
                    temp = 0;
                    temp2 = 0;
                    //convolve
                    for (int k = 0; k + i < Image.Width && k < 3; k++)
                    {
                        for (int n = 0; n + j < Image.Height && n < 3; n++)
                        {
                            temp += (Image.GetPixel(i + k, j + n).R * SobelHorizontalArray[k, n]);
                            temp2 += (Image.GetPixel(i + k, j + n).R * SobelVERTICALArray[k, n]);
                        }
                    }
                    if (Math.Sqrt(temp * temp + temp2 * temp2) > 129)
                        Result.SetPixel(i, j, Color.Black);
                    else
                        Result.SetPixel(i, j, Color.White);
                }
            }
            return Result;
        }در پایا این پست این رو بگم که ممکنه پست ها از بحث اصلی خارج بشن و لی برای پیاده سازی سیستم اصلی به این مباحث احتیاج هست .
دوستان لطفا بیشتر کمک کنن.

----------


## asefy2008

دوستان لطفا تو تحلیل و اجرای این کد کمک کنن (GaussianBlur)
من که هر چه کردم متوجه نشدم 
این کد مربوط به پردازش تصویر هست.
دوستان خواهشا کامل و با جزئیات راهنمایی بفرمایید.
لازم به ذکر هست این کد از سایتی برداشته شده که اون رو فراموش کردم

----------


## asefy2008

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

----------


## flash118

با سلام دوست عزیز در مورد الگوریتم  پردازش تصویر باید روی الگوریتم  هم MAGIN هم یه نظری بنداز فکر کنم مشکل گشای کار باشد

----------


## asefy2008

با سلام میشه یکم بیشتر در موردش توضیح بدی؟
اگر مقاله ای هم هست اگر بزاری بینهایت ممنون میشم 
در ضمن در مورد الگوریتم cnn چیزی شنیدی اگر در مورد این هم یه توضیح بدی ممنونت میشم.
در مورد تبدیل هاف هم به همین ترتیب.
با تشکر از راهنماییت

----------


## asefy2008

اگر دوستان کمک کنن بگن چرا در برنامه بالا از unsafe ارور میگره خیلی ممنون میشم

----------


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

شما برای تشخیص عنبیه ابتدا بایستی مردمک چشم رو پیدا کنی که بجای تبدیل circular hough می تونی از cnn بجاش استفاده کنید .فکر کنم یه دفعه براتون به اختصار cnn رو توضیح دادم.شبکه ای که من در این زمینه طراحی کردم  که رو مردمک چشم هم جواب داده با map بوده البته سفارش این کار برای پروژه ای دیگری بود که رو مردمک تست کردم جواب داد و بعد هم اگر database مربوط به اینکارت بزرگ باشه بهترین راه اینه از wavelet استفاده کنید.من مشتری برای اینکار نداشتم وگرنه طراحیش می کردم.

----------


## asefy2008

بازهم تشکر راهنماییتون
به نظر شما، برای مرحله پیدا کردن مردمک، cnn می تونه یک انتخاب مناسب باشه یا انتخابهای بهتری هم هست؟

----------


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

در چندین مقاله در IEEE خوندم که از Circular hough استفاده می کنند ولی من تست کردم با cnn هم جواب میده اینم یه راهکار دیگه اس میتونه با یه متد دیگه یه مقاله بشه

----------


## asefy2008

> اگر دوستان کمک کنن بگن چرا در برنامه بالا از unsafe ارور میگره خیلی ممنون میشم


اینم پاسخ دوستمون peikesms :



> روی نام برنامه در قسمت Solution Explorer راست کلیک کنید و گزینه Properties را انتخاب کنید. از پنجره باز شده گزینه دوم Build را انتخاب کنید. سپس گزینه Allow unsafe code را تیک بزنید.

----------


## انیشتین

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


سلام
فکر کنم فیلم تخیلی زیاد می بینی،
باور نکن عزیزم اینا فیلمه!! :لبخند گشاده!:

----------


## asefy2008

> سلام
> فکر کنم فیلم تخیلی زیاد می بینی،
> باور نکن عزیزم اینا فیلمه!!


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

----------


## asefy2008

اینم الگوریتم sobel (یک بار گذاشتم چون با توابع سیستم کار می کرد کند بود ):
        public void SobelAlgorithm()
        {
            int gx, gy;
            int[,] SobelHorizontalArray = new int[3, 3]{
                                                         { 1, 2, 1},
                                                         { 0, 0,  0},
                                                         { -1,-2,-1}
                                                       };

            int[,] SobelVERTICALArray = new int[3, 3]{
                                                         { 1, 0,-1},
                                                         { 2, 0,-2},
                                                         { 1,0,-1}
                                                       };
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    gx = 0;
                    gy = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 3; k++)
                    {
                        for (int n = 0; n + j < height && n < 3; n++)
                        {
                            gx += (image[i + k, j + n] * SobelHorizontalArray[k, n]);
                            gy += (image[i + k, j + n] * SobelVERTICALArray[k, n]);
                        }
                    }
                    int temp = (int)Math.Sqrt(gx * gx + gy * gy);
                    if (temp > 255)
                        image[i, j] = 255;
                    else if (temp < 0)
                        image[i, j] = 0;
                    else
                        image[i, j] = temp;
                }
            }
        }
اگه الگوریتم ها درست پیاده سازی نشده دوستان حتما بگن تا رفع شه.

----------


## asefy2008

در قطعه کد بالا image یک آرایه به تعداد پیکسل های عکستون هست.
اینم یک الگوریتم لبه یاب دیگه :
        public void PrewittAlgorithm()
        {
            int gx, gy;
            int[,] PrewittHorizontalArray = new int[3, 3]{
                                                         { -1, -1, -1},
                                                         { 0, 0,  0},
                                                         { 1,1,1}
                                                       };

            int[,] PrewittVERTICALArray = new int[3, 3]{
                                                         { -1, 0,1},
                                                         { -1, 0,1},
                                                         { -1,0,1}
                                                       };
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    gx = 0;
                    gy = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 3; k++)
                    {
                        for (int n = 0; n + j < height && n < 3; n++)
                        {
                            gx += (image[i + k, j + n] * PrewittHorizontalArray[k, n]);
                            gy += (image[i + k, j + n] * PrewittVERTICALArray[k, n]);
                        }
                    }
                    int temp = (int)Math.Sqrt(gx * gx + gy * gy);
                    if (temp > 255)
                        image[i, j] = 255;
                    else if (temp < 0)
                        image[i, j] = 0;
                    else
                        image[i, j] = temp;
                }
            }
        }

----------


## asefy2008

و اینم الگوریتم لبه یاب Roberts :
        public void RobertsAlgorithm()
        {
            int gx, gy;
            int[,] RobertsHorizontalArray = new int[2, 2]{
                                                         { -1, 0},
                                                         { 0, 1}
                                                       };

            int[,] RobertsVERTICALArray = new int[2, 2]{
                                                         { 0, -1},
                                                         { 1,0}
                                                       };
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    gx = 0;
                    gy = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 2; k++)
                    {
                        for (int n = 0; n + j < height && n < 2; n++)
                        {
                            gx += (image[i + k, j + n] * RobertsHorizontalArray[k, n]);
                            gy += (image[i + k, j + n] * RobertsVERTICALArray[k, n]);
                        }
                    }
                    int temp = (int)Math.Sqrt(gx * gx + gy * gy);
                    if (temp > 255)
                        image[i, j] = 255;
                    else if (temp < 0)
                        image[i, j] = 0;
                    else
                        image[i, j] = temp;
                }
            }
        }

----------


## asefy2008

ماسک يا عملگر لاپلاسين :
عملگر لاپلاسين از مشتق دوم تصوير استفاده مي کند. حساسيت عملگر لاپلاسين به نويز خيلي ز ياد است زيرا با نقاط عبور از صفر ارتباط دارد و ا ين در حالي است که در بيشتر موارد سيگنال نويز نيز داراي مقادير کوچک و نزديک صفر است .
        public void LAPLACE_OperatorOrMask()
        {
            int sigma;
            int[,] MaskArray = new int[3, 3]{
                                                         { 1, 1, 1},
                                                         { 1,-8,1},
                                                         { 1,1,1}
                                                       };

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    sigma = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 3; k++)
                    {
                        for (int n = 0; n + j < height && n < 3; n++)
                        {
                            sigma += image[i + k, j + n] * MaskArray[k, n];
                        }
                    }
                    sigma = Math.Abs(sigma);
                    if (sigma > 255)
                        image[i, j] = 255;
                    else
                        image[i,j]= sigma;
                }
            }
        }

----------


## asefy2008

public void SmoothAgorithm()
        {
            int sigma;
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    sigma = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 3; k++)
                    {
                        for (int n = 0; n + j < height && n < 3; n++)
                        {
                            sigma += (image[i + k, j + n]) / 9;

                        }
                    }
                    image[i, j] = sigma;
                }
            }
        }

----------


## asefy2008

برای نرم کردن لبه ها به کار می رود : 
        public void GaussianBlurAlgorithm()
        {
            int sigma;
            int[,] GaussianBlurArrayMask = new int[3, 3]{
                                                         { 1, 2, 1},
                                                         { 2, 4,2},
                                                         { 1,2,1}
                                                       };
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    sigma = 0;
                    //convolve
                    for (int k = 0; k + i < width && k < 3; k++)
                    {
                        for (int n = 0; n + j < height && n < 3; n++)
                        {
                            sigma += (image[i + k, j + n] * GaussianBlurArrayMask[k, n]);
                        }
                    }
                    sigma /= 16;
                    if (sigma > 255)
                        sigma = 255;
                    if (sigma < 0)
                        sigma = 0;
                    image[i, j]= sigma;
                }
            }
        }

----------


## asefy2008

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

----------


## asefy2008

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

----------


## asefy2008

برای کوچک کردن عکس از قطعه کد زیر می تونید استفاده کنید :
//ResizeImage
        public Bitmap resizeImage(Bitmap Image, Size size)
        {
            Bitmap b = new Bitmap(size.Width, size.Height);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage((Image)Image, 0, 0, size.Width, size.Height);
            g.Dispose();
            return b;
        }

----------


## asefy2008

لبه یاب سوبل که در زیر قرار دادم از تمام برنامه های موجود در این تاپیک سریع تر است(البته پرویت هم در این برنامه قرار داره.)

----------


## سوداگر

دكتر عليرضا عصاره روي موضوع تشخيص بيماري هاي چشم با كامپيوتر زياد كار كرده، ميتونيد اسم ايشون رو توي گوگل تايپ كنيد شايد مفيد باشه!
از سمينار ايشون توي دانشگاه چمران كه درمورد تشخيص منطقه   Fovia  توي چشم بود معلومه كارش خيلي درسته.

----------


## asefy2008

> دكتر عليرضا عصاره روي موضوع تشخيص بيماري هاي چشم با كامپيوتر زياد كار كرده، ميتونيد ايم ايشون رو توي گوگل تايپ كنيد شايد مفيد باشه!
> از سمينار ايشون توي دانشگاه چمران كه درمورد تشخيص منطقه   Fovia  توي چشم بود معلومه كارش خيلي درسته.


 ممنون دوست عزیز

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

----------

