اطلاعیه

Collapse
No announcement yet.

استخراج چشم از تصویر چهره

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    استخراج چشم از تصویر چهره

    سلام. من یه برنامه نوشتم که چشم رو از تصویر استخراج کنه. چندتا اشکال دارم:
    1- چرا خروجی cb و cr به توان دو سفیده؟
    2- چرا and آی مپ هام سفیده؟
    3- چرا خروجی لومینانسم که داره چشم ها رو نشون میده، یکم نویز داره و برای تصاویر دیگه که امتحان کردم درست نیست؟

    کد:
    [left]i=imread('pic8.jpg');
    imshow(i);
    subplot(4,4,1)
    imshow(i)
    %%
    iycbcr=rgb2ycbcr(i);
    subplot(4,4,2)
    imshow(iycbcr)
    y=iycbcr(:,:,1);
    cb=iycbcr(:,:,2);
    cr=iycbcr(:,:,3);
    ccb=cb.^2;
    subplot(4,4,3)
    imshow(ccb)
    ccr=(255-cr).^2;
    subplot(4,4,4)
    imshow(ccr)
    cbcr=ccb./cr;
    subplot(4,4,5)
    imshow(cbcr)
    %%
    igray=rgb2gray(i);
    subplot(4,4,6)
    imshow(igray)
    g=1./3;
    l=g*ccb;
    m=g*ccr;
    n=g*cbcr;
    %%
    eyemapchr=l+m+n;
    subplot(4,4,7)
    imshow(eyemapchr)
    J=histeq(eyemapchr);
    subplot(4,4,8)
    imshow(J)
    SE=strel('disk',15,8);
    o=imdilate(igray,SE);
    p=1+imerode(igray,SE);
    eyemaplum=o./p;
    subplot(4,4,9)
    imshow(eyemaplum)
    cc=and(J,eyemaplum);
    subplot(4,4,10)
    imshow(cc)[/left]

    #2
    پاسخ : استخراج چشم از تصویر چهره

    تغییرات در کد زیر رو ببین:
    کد:
    i=imread('pic8.jpg');
    imshow(i);
    subplot(4,4,1)
    imshow(i)
    %%
    iycbcr=rgb2ycbcr(i);
    subplot(4,4,2)
    imshow(iycbcr)
    y=double(iycbcr(:,:,1));
    cb=double(iycbcr(:,:,2));
    cr=double(iycbcr(:,:,3));
    ccb=cb.^2;
    subplot(4,4,3)
    imshow(ccb,[])
    ccr=(255-cr).^2;
    subplot(4,4,4)
    imshow(ccr,[])
    cbcr=ccb./cr;
    subplot(4,4,5)
    imshow(cbcr,[])
    %%
    igray=rgb2gray(i);
    subplot(4,4,6)
    imshow(igray)
    g=1./3;
    l=g*ccb;
    m=g*ccr;
    n=g*cbcr;
    %%
    eyemapchr=l+m+n;
    subplot(4,4,7)
    imshow(eyemapchr)
    J=histeq(eyemapchr);
    subplot(4,4,8)
    imshow(J,[])
    SE=strel('disk',15,8);
    o=imdilate(igray,SE);
    p=1+imerode(igray,SE);
    eyemaplum=o./p;
    subplot(4,4,9)
    imshow(eyemaplum,[])
    cc=and(J,eyemaplum);
    subplot(4,4,10)
    imshow(cc,[])
    لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
    لطفاً سوالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
    با تمام وجود گناه کردیم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنیم چه می کند؟"دکتر شریعتی"
    اگر جایی که ایستاده اید را نمی پسندید، عوضش کنید شما درخت نیستید!! "پاسکال"
    یا به اندازه ی آرزوهایت تلاش کن یا به اندازه تلاشت آرزو کن. "شکسپیر"

    دیدگاه


      #3
      پاسخ : استخراج چشم از تصویر چهره

      سلام. خیلی خیلی ممنون. 1-پس مشکل این بود که باید به صورت double به ycbcr انتقال می دادم؟ 2-اون کروشه های توی imshow به چه درد می خورند؟ 3- الان دیگه eyemapchrominance و eyemapluminace و and اونا خروجی سفید میدن. این رو چکار کنم؟

      دیدگاه


        #4
        پاسخ : استخراج چشم از تصویر چهره

        سلام.
        در راهنمای متلب زیر هر دستور ببین چه نوع ورودی و خروجی ها چیه و دستور چطور عمل می کنه.
        مثلاً کروشه توی imshow برای وقتی هست که نوع ورودی double هست و رنجش توی بازه استاندارد تصاویر نیست، در این صورت متلب مقادیر پیکسل ها رو برای نمایش طوری اسکیل میکنه که در این بازه قرار بگیرن.
        اون دو تا متغیر که گفتی ندیدم.
        لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
        لطفاً سوالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
        با تمام وجود گناه کردیم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنیم چه می کند؟"دکتر شریعتی"
        اگر جایی که ایستاده اید را نمی پسندید، عوضش کنید شما درخت نیستید!! "پاسکال"
        یا به اندازه ی آرزوهایت تلاش کن یا به اندازه تلاشت آرزو کن. "شکسپیر"

        دیدگاه


          #5
          پاسخ : استخراج چشم از تصویر چهره

          خروجی eyemaplum و eyemapchr و and اونا در subplot شماره 7 و 9 و 10 هست که سفیده.

          دیدگاه


            #6
            پاسخ : استخراج چشم از تصویر چهره

            برای من که این طور نیست:

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

            دیدگاه


              #7
              پاسخ : استخراج چشم از تصویر چهره

              اتفاقا برای من هم یک لحظه یکی از خروجی های سفید، جواب داد ولی دوباره سفید شد!
              1- حالا فرض کنیم که همه خروجی ها مثل فایلیه که شما قرار دادین. مسئله اول اینه که خروجی and که آخرین خروجیه باید شبیه خروجی eyemaplum باشه یعنی باید region چشم ها رو نشون بده. لطف می کنید بفرمایید چرا این طور نیست؟
              2- من فرض کردم خروجی eyemaplum همون region چشمه و از قانون template matching برای یافتن رنگ پوست که همون پلک ها باشه استفاده کردم. خروجی eyemaplum رو به عنوان یه mask در نظر گرفتم و در تصویر RGB اصلی ضرب کردم و بعد در یک حلقه for ، قانون template matching رو پیاده کردم. تو این مرحله باید شکل چشم رو به صورت دقیق بهم نشون بده که نداد! چرا؟
              3-اگه لطف کنید ایمیل بدید که مقاله رو براتون ایمیل کنم ببینید کجا رو اشتباه کردم ممنون می شم.

              کد:
              [left]close all;
              clear;
              i=imread('pic8.jpg');
              imshow(i);
              subplot(4,4,1)
              imshow(i)
              iycbcr=rgb2ycbcr(i);
              subplot(4,4,2)
              imshow(iycbcr)
              y=double(iycbcr(:,:,1));
              cb=double(iycbcr(:,:,2));
              cr=double(iycbcr(:,:,3));
              ccb=cb.^2;
              subplot(4,4,3)
              imshow(ccb,[])
              ccr=(255-cr).^2;
              subplot(4,4,4)
              imshow(ccr,[])
              cbcr=ccb./cr;
              subplot(4,4,5)
              imshow(cbcr,[])
              %%
              igray=rgb2gray(i);
              subplot(4,4,6)
              imshow(igray)
              g=1./3;
              l=g*ccb;
              m=g*ccr;
              n=g*cbcr;
              %%
              eyemapchr=l+m+n;
              subplot(4,4,7)
              imshow(eyemapchr)
              J=histeq(eyemapchr);
              subplot(4,4,8)
              imshow(J,[])
              SE=strel('disk',15,8);
              o=imdilate(igray,SE);
              p=1+imerode(igray,SE);
              eyemaplum=o./p;
              subplot(4,4,9)
              imshow(eyemaplum,[])
              cc=and(J,eyemaplum);
              subplot(4,4,10)
              imshow(cc,[])
              subplot(4,4,11)
              imshow(i);
              R=i(:,:,1);
              G=i(:,:,2);
              B=i(:,:,3);
              newi=i.*repmat(eyemaplum,[1,1,3]);
              subplot(4,4,12)
              imshow(newi)
              for R=0:300
               for  G=0:300
               for  B=0:300
                 temp1=and((R>95),(G>40));
                 temp1=and(temp1,(B>20));
                 temp1=and(temp1,max(max(R,G),B)-min(min(R,G),B)>15);
                 temp1=and(temp1,abs(double(R)-double(G))>15);
                 temp2=and((R>220),(G>210));
                 temp2=and(temp2,(B>170));
                 temp2=and(temp2,abs(double(R)-double(G))<=15);
                 temp2=and(temp2,(R>B));
                 temp2=and(temp2,(G>B));
                 temp=or(temp1,temp2);
               end
               end
              end
              subplot(4,4,13)
              imshow(temp)[/left]

              دیدگاه


                #8
                پاسخ : استخراج چشم از تصویر چهره

                سلام. شکر خدا بالاخره تونستم چشم رو در بیارم. اینم زکاتش، ان شاءالله به دردتون بخوره:

                کد:
                %to get the image
                i=imread('pic8.jpg');
                subplot(4,4,1)
                imshow(i)
                title('original image');
                %to transmit the image to YCBCR color space
                iycbcr=rgb2ycbcr(i);
                %to have a correct range for y and cb and cr
                iycbcr = im2double(iycbcr);
                subplot(4,4,2)
                imshow(iycbcr)
                title('YCBCR space');
                %to obtain the values of y and cb and cr
                y=iycbcr(:,:,1);
                cb=iycbcr(:,:,2);
                cr=iycbcr(:,:,3);
                %these are the parts of the formula for chrominance eyemap 
                ccb=cb.^2;
                subplot(4,4,3)
                imshow(ccb)
                title('CB^2');
                ccr=(1-cr).^2;
                subplot(4,4,4)
                imshow(ccr)
                title('(1-CR)^2');
                cbcr=ccb./cr;
                subplot(4,4,5)
                imshow(cbcr)
                title('CB/CR');
                %to transmit the image to gray scale space
                igray=rgb2gray(i);
                igray=~igray;
                subplot(4,4,6)
                imshow(igray)
                title('Gray space');
                g=1./3;
                l=g*ccb;
                m=g*ccr;
                n=g*cbcr;
                %%
                %this is the formula for chrominance eyemap
                eyemapchr=l+m+n;
                subplot(4,4,7)
                imshow(eyemapchr)
                title('Chrom Eyemap');
                %to obtain better result, we'd better get a histogram equalization from chrominance eyemap
                J=histeq(eyemapchr);
                subplot(4,4,8)
                imshow(J)
                title('Equalized image');
                %the parts of formula for obtaining luminance eyemap
                SE=strel('disk',15,8);
                o=imdilate(igray,SE);
                p=1+imerode(igray,SE);
                eyemaplum=o./p;
                subplot(4,4,9)
                imshow(eyemaplum)
                title('Lum Eyemap');
                %as the paper had said, in this section, we must perform AND on the afformentioned eyemaps(lum and chr), now we have the eye approximate refion as a mask 
                cc=and(J,eyemaplum);
                subplot(4,4,10)
                imshow(cc)
                title('AND of Lum&Chrom');
                %%
                subplot(4,4,11)
                %In this section, we wanna apply the mask (and of lum and chr eyemaps) on the original image to see only the exact eyes
                imshow(i);
                i=im2double(i);
                title('original image');
                R=i(:,:,1);
                G=i(:,:,2);
                B=i(:,:,3);
                %because our image is 3D, we should use repmat command to multiply the mask by the original image
                newi=i.*repmat(cc,[1,1,3]);
                subplot(4,4,12)
                imshow(newi)
                title('Multiplication');

                دیدگاه


                  #9
                  پاسخ : استخراج چشم از تصویر چهره

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

                  دیدگاه


                    #10
                    پاسخ : استخراج چشم از تصویر چهره

                    توضیح برنامه رو گذاشتم روی کدها.

                    دیدگاه


                      #11
                      پاسخ : استخراج چشم از تصویر چهره

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

                      کد:
                      i=imread('pic8.jpg');
                      subplot(5,5,1)
                      imshow(i)
                      title('original image');
                      iycbcr=rgb2ycbcr(i);
                      iycbcr = im2double(iycbcr);
                      subplot(5,5,2)
                      imshow(iycbcr)
                      title('YCBCR space');
                      y=iycbcr(:,:,1);
                      cb=iycbcr(:,:,2);
                      cr=iycbcr(:,:,3);
                      ccb=cb.^2;
                      subplot(5,5,3)
                      imshow(ccb)
                      title('CB^2');
                      ccr=(1-cr).^2;
                      subplot(5,5,4)
                      imshow(ccr)
                      title('(1-CR)^2');
                      cbcr=ccb./cr;
                      subplot(5,5,5)
                      imshow(cbcr)
                      title('CB/CR');
                      igray=rgb2gray(i);
                      igray=~igray;
                      subplot(5,5,6)
                      imshow(igray)
                      title('Gray space');
                      g=1./3;
                      l=g*ccb;
                      m=g*ccr;
                      n=g*cbcr;
                      %%
                      eyemapchr=l+m+n;
                      subplot(5,5,7)
                      imshow(eyemapchr)
                      title('Chrom Eyemap');
                      t=histeq(eyemapchr);
                      subplot(5,5,8)
                      imshow(t)
                      title('Equalized image');
                      SE=strel('disk',15,8);
                      o=imdilate(igray,SE);
                      p=1+imerode(igray,SE);
                      eyemaplum=o./p;
                      subplot(5,5,9)
                      imshow(eyemaplum)
                      title('Lum Eyemap');
                      cc=and(t,eyemaplum);
                      subplot(5,5,10)
                      imshow(cc)
                      title('AND of Lum&Chrom');
                      %%
                      subplot(5,5,11)
                      imshow(i);
                      I=im2double(i);
                      title('original image');
                      R=I(:,:,1);
                      G=I(:,:,2);
                      B=I(:,:,3);
                      newi=I.*repmat(cc,[1,1,3]);
                      subplot(5,5,12)
                      imshow(newi)
                      title('Multiplication');
                      %%
                      %Convert from the sRGB to the LAB color space
                      cform = makecform('srgb2lab');
                      t = applycform(newi,cform);
                      subplot(5,5,13)
                      imshow(t)
                      k=t(:,:,2);
                      subplot(5,5,14)
                      imshow(k)
                      L=graythresh(t(:,:,2));
                      BW1=im2bw(t(:,:,2),L);
                      subplot(5,5,15)
                      imshow(BW1)
                      M=graythresh(t(:,:,3));
                      subplot(5,5,16)
                      imshow(M)
                      BW2=im2bw(t(:,:,3),M);
                      subplot(5,5,17)
                      imshow(BW2)
                      O=BW1.*BW2;
                      subplot(5,5,18)
                      imshow(o)
                      BW3=edge(o,'canny');
                      subplot(5,5,19)
                      imshow(BW3)

                      دیدگاه


                        #12
                        پاسخ : استخراج چشم از تصویر چهره

                        سلام. از این که وقت میذاری و نتیجه کارت رو به اشتراک میذاری ممنونم.
                        اگه امکان داره یه توضیح کوتاه در مورد الگوریتم بده چون فهمیدن نحوه عملکردش از روی کد سخته.
                        در ضمن برای گذاشتن کد از تگ مربوطه که به شکل علامت # هست استفاده کن.
                        لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
                        لطفاً سوالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
                        با تمام وجود گناه کردیم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنیم چه می کند؟"دکتر شریعتی"
                        اگر جایی که ایستاده اید را نمی پسندید، عوضش کنید شما درخت نیستید!! "پاسکال"
                        یا به اندازه ی آرزوهایت تلاش کن یا به اندازه تلاشت آرزو کن. "شکسپیر"

                        دیدگاه


                          #13
                          پاسخ : استخراج چشم از تصویر چهره

                          سلام.
                          متاسفانه 10 روز بیشتر وقت ندارم کارم رو تحویل بدم، بعدش ان شاءالله توضیح کاملش رو می ذارم.
                          دوباره مشکل پیدا کردم. می خوام از قانونی که تو مقاله داده، پوست رو تشخیص بدم. کدش رو هم نوشتم ولی نمی دونم چرا جواب نمی ده! میشه بازم کمکم کنید لطفا؟
                          (R>95)AND(G>40)AND(B>20)AND(max(R,G,B)-min(R,G,B)>15)AND(|R-G|>15

                          این قسمت از برنامه دقیقا تا subplot(4,4,11) مثل برنامه بالاست. فقط قسمت تشخیص پوستش رو می خوام تغییر بدم. قانون نوشته شده توی مقاله رو توی یک حلقه for گذاشتم که چون تصویر سه بعدیه، سه تا متغیر i,j,d تعریف کردم. بازه شمارش این متغیرها رو با x,y,z مشخص کردم.

                          کد:
                          subplot(4,4,11)
                          imshow(myimage);
                          myimage=im2double(myimage);
                          title('original image');
                          R=myimage(:,:,1);
                          G=myimage(:,:,2);
                          B=myimage(:,:,3);
                          X=size(myimage,1);
                          Y=size(myimage,2);
                          Z=size(myimage,1);
                          for i=1:X
                           for  j=1:Y
                           for  d=1:z
                            if (R(i,j,d)>95)&&(G(i,j,d)>40)&&(B(i,j,d)>20)&&(max(max(R(i,j,d),G(i,j,d)),B(i,j,d))-min(min(R(i,j,d),G(i,j,d)),B(i,j,d)))>15&&abs(double(R(i,j,d))-double(G(i,j,d)))>15
                             
                             segment(i,j,d)=1;
                            else
                              segment(i,j,d)=0;
                            %end
                            end
                           end
                          end
                           
                          subplot(4,4,13)
                          imshow(segment))
                          title('Eye');

                          دیدگاه


                            #14
                            پاسخ : استخراج چشم از تصویر چهره

                            ببین کد زیر همون چیزی هست که میخواستی: (به هر حال جواب نمیده)
                            کد:
                            myimage=imread('lena_color_512.tif');
                            %%
                            subplot(4,4,11)
                            imshow(myimage);
                            myimage=im2double(myimage);
                            title('original image');
                            R=myimage(:,:,1);
                            G=myimage(:,:,2);
                            B=myimage(:,:,3);
                            X=size(myimage,1);
                            Y=size(myimage,2);
                            segment=zeros(X,Y);
                            for i=1:X
                              for  j=1:Y
                                if (R(i,j)>95) && (G(i,j)>40) && (B(i,j)>20) && (( (max(max(R(i,j),G(i,j)),B(i,j)) - min(min(R(i,j),G(i,j)),B(i,j))) )>15) && (abs(double(R(i,j))-double(G(i,j)))>15)
                                  segment(i,j)=1;
                                else
                                  segment(i,j)=0;
                                end
                              end
                            end
                            
                            subplot(4,4,12)
                            imshow(segment)
                            title('Eye')
                            در ضمن توی کد قبلی تغییراتی دادم که این رو هم میتونی چک کنی:
                            کد:
                            clear;clc;close all
                            i=imread('lena_color_512.tif');
                            imshow(i);
                            subplot(4,4,1)
                            imshow(i)
                            %%
                            iycbcr=rgb2ycbcr(i);
                            subplot(4,4,2)
                            imshow(iycbcr)
                            y=double(iycbcr(:,:,1));
                            cb=double(iycbcr(:,:,2));
                            cr=double(iycbcr(:,:,3));
                            ccb=cb.^2;
                            subplot(4,4,3)
                            imshow(ccb,[])
                            ccr=(255-cr).^2;
                            subplot(4,4,4)
                            imshow(ccr,[])
                            cbcr=ccb./cr;
                            subplot(4,4,5)
                            imshow(cbcr,[])
                            %%
                            igray=rgb2gray(i);
                            subplot(4,4,6)
                            imshow(igray)
                            g=1./3;
                            l=g*ccb;
                            m=g*ccr;
                            n=g*cbcr;
                            %%
                            eyemapchr=l+m+n;
                            subplot(4,4,7)
                            imshow(eyemapchr,[])
                            ueyemapchr = uint8( 255 * ( (eyemapchr - min( eyemapchr(:) ) )/max( eyemapchr(:) ) ) );
                            J=histeq(ueyemapchr);
                            subplot(4,4,8)
                            imshow(J)
                            SE=strel('disk',15,8);
                            o=imdilate(igray,SE);
                            p=1+imerode(igray,SE);
                            eyemaplum=o./p;
                            subplot(4,4,9)
                            imshow(eyemaplum,[])
                            Jbin = im2bw(J,graythresh(J));
                            eyemaplumbin = im2bw(eyemaplum,graythresh(eyemaplum));
                            cc=and(Jbin,eyemaplumbin);
                            subplot(4,4,10)
                            imshow(cc,[])
                            این هم خروجی(برای تصویر بزرگ روی عکس کلیک کن) :



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

                            دیدگاه


                              #15
                              پاسخ : استخراج چشم از تصویر چهره

                              خیلی خیلی متشکرم از توجه و کمکتون
                              1- همونطور که فرمودین، بازم خبری از خروجی نیست. البته یک خطایی هم اینجا داشتم و اونم اینه که باید در انتها از دستور زیر استفاده می کردم و خروجی رو im در نظر می گرفتم که بازم توفیری نداره.
                              کد:
                              im(:,:,1)=myimage(:,:,1).*segment;  
                              im(:,:,2)=myimage(:,:,2).*segment; 
                              im(:,:,3)=myimage(:,:,3).*segment
                              2- خروجی قسمت اول که تغییرش دادین عالیه. حتی نیازی به تشخیص پوست هم نداره ولی من مجبورم از تشخیص پوست استفاده کنم.
                              3- می شه بفرمایید کاربرد دستور zeroes اینجا چیه؟
                              4- باور کنید من از # استفاده کردم. یعنی اول این تگ رو زدم بعد کد رو نوشتم ولی الان متوجه شدم منظورتون آیکون های اینجاست! شرمنده

                              دیدگاه

                              لطفا صبر کنید...
                              X