اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام بر همگی
    عیدتون مبارک باشه
    فرض کنیم دو عکس داریم،برای راحتی عدد1 و عدد 7(که شباهت کمتری دارند)رو در نظر بگیریم
    میخواهیم شباهت این دو عدد را نشون بدیم ترجیحا در یک پلات سه دیمانسیونی
    خوب من اینجا دو سوال داشتم
    1.بنده از تابع normxcorr2 برای این کار استفاده میکنم اما میخواستم از خوده تابع corr2 استفاده کنم
    اما هنگامیکه از تابع surf برای ترسیم استفاده میکنم خطا میگیره که این تابع تنها ماتریس میگیره
    2.اگر هر کدام از عکس های این اعداد دارای یک دیمانسیون نباشند مثلا عدد 1 و عدد 7 به ترتیب ابعاد زیر رو داشته باشند
    300*400 و 342*563 (فقط مثالند)
    برای زمانیکه آنها رو مقایسه میکنیم،خطای مبنی بر هم تراز نبودن ابعاد نده از چه برنامه ای باید استفاده کرد
    مرسی+ساله خوبی رو براتون آرزو میکنم

    #2
    پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

    نتیجه ی corr2 و normxcorr2 یک ماتریس هست که میتونی تنظیم کنی قسمت مرکزی نتیجه ی کرولیشنو با اندازه ی عکس های graylevel ورودیت رو بگیری
    فکر میکنم برای اینکار option ای داره به نام 'same'
    برای رسم سه بعدی با تابع surf باید قبلش از meshgrid استفاده کنی تا مقادیر سطر و ستون ات را گرید کنی
    نتیجه های meshgrid و corr2 کلا سه تا ماتریس میشن که می تونی با تابع surf رسمشون کنی
    برای توضیحات بیشتر میتونی از help متلب راجع به دستورهایی که عرض کردم کمک بگیری
    object tracking: http://www.eca.ir/forum2/index.php?topic=88447.msg547644#msg547644

    any help or opinion on robot mapping will be welcome

    دیدگاه


      #3
      پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

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

      دیدگاه


        #4
        پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

        به نظرم در دستور normxcorr2 ورودیهاش باید ماتریس دوبعدی می بودند برا همین باید graylevel کنید و از حالت رنگی خارج اش کنید
        می تونید کرولیشن قسمت حقیقی و مختلط را جداگانه محاسبه کنید و برآیند اونها را در یک ماتریس جدید جایگزین کنید
        اندازه ی حاصل کرولیشن دو تصویر یک تصویر بزرگتر می شه مانند کانولوشن
        تابع همبستگی متقابل یک تعریف ریاضی هست که امید ریاضی نمونه های سیگنال اول ضربدر مزدوج سیگنال دوم را در هر المانش حساب میکنه
        که این سیگنال میتونه دو بعدی(تصویر) باشه....
        در تاریخ 19 فرورین اضافه شد:
        چیزی که شما دنبالش هستین کلید واژه اش
        Pattern Matching in the Frequency Domain
        هست که با جستجو در اینترنت میتونید مطالب مفیدی پیدا کنید





        object tracking: http://www.eca.ir/forum2/index.php?topic=88447.msg547644#msg547644

        any help or opinion on robot mapping will be welcome

        دیدگاه


          #5
          پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

          ممنون از لطفتون
          ما با استفاده از تبدیل فوریه یک شکل مثلا عدد صفر یک فیلتر می سازیم
          حال با استفاده از یک setup جدید،می اییم شکل های جدید رو با اون تطبیق میدیم
          در ادامه مثالم اگر عددهای دیگر رو وارد این سیستم کتیم می بایست تبدیل فوریه آن ها متفاوت باشه از فیلتر ما
          که همان تبدیل فوریه عدد صفر هست باشه
          این اساس یک نمونه از آرایش عدسی ها است
          البته همونطور که شما میدونید میشه روشهای دیگر رو بکار برد که بعضا انها راحتتر باشند
          اما برای این گونه میخوام که این روند رو انجام بدم
          شاید حق با شما باشه،بنده با correlation در حد تعریف اصلیش+اون تعریفش که تو help هست آشنا هستم
          بله،مطالعم رو باید بیشتر کنم
          پایین برنامه ای هست که نوشتم
          clc
          clear
          a=imread('0.jpg'
          imshow(a)
          figure
          a1=im2bw(a);
          b=fft2(a1);
          imshow(b)
          figure
          c=imread('5.jpg'
          imshow(c)
          figure
          c1=im2bw(c);
          d=fft2(c1);
          imshow(d)
          figure
          e=normxcorr2(abs(b),abs(d));
          surf(e),shading flat
          متاسفانه فقط اندازه رو نشون میده و در کل اونی نیست که من میخوام

          دیدگاه


            #6
            پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

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

            کد:
            % Image Processing Matlab Assignment
            % Correlation
            % Hadi ******
            clear;clc;close all
            % Image #1 & Image #2 are both number 1
            I1_1 = imread('1-1.bmp');I1_1 = not(I1_1);
            [M N] = size(I1_1);
            I1_2 = imread('1-2.bmp');%I1_2 = not(I1_2);
            [MT NT] = size(I1_2);
            I1_1 = double(I1_1);I1_2=double(I1_2);
            Mx = max(M , MT); Nx = max(N , NT);
            F = fft2(I1_1,Mx,Nx);
            Fc = conj(F);
            H = fft2(I1_2,Mx,Nx);
            HF = H .* Fc;
            HF = fliplr(HF);
            hf = ifft2(HF);
            hf = abs(hf);
            subplot(2,2,1);imshow(I1_1);title('Image #1 : Spatial')
            subplot(2,2,2);imshow(abs(fftshift(F)),[]);title('Image #1 : Frequency')
            subplot(2,2,3);imshow(I1_2);title('Image #2 : Spatial')
            subplot(2,2,4);imshow(abs(fftshift(H)),[]);title('Image #2 : Frequency')
            figure(2);surf(hf);title('Correlation of Images #1 & #2')
            % Image #3 is number 5 (Persian)
            I5_2 = imread('5-2.bmp');%I5_2 = not(I5_2);
            [MT NT] = size(I5_2);
            I5_2=double(I5_2);
            Mx = max(M , MT); Nx = max(N , NT);
            F = fft2(I1_1,Mx,Nx);
            Fc = conj(F);
            H = fft2(I5_2,Mx,Nx);
            HF = H .* Fc;
            HF = fliplr(HF);
            hf = ifft2(HF);
            hf = abs(hf);
            figure(3);subplot(2,2,1);imshow(I1_1);title('Image #1 : Spatial')
            subplot(2,2,2);imshow(abs(fftshift(F)),[]);title('Image #1 : Frequency')
            subplot(2,2,3);imshow(I5_2);title('Image #3 : Spatial')
            subplot(2,2,4);imshow(abs(fftshift(H)),[]);title('Image #3 : Frequency')
            figure(4);surf(hf);title('Correlation of Images #1 & #3')

            نتایج برنامه:








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

            دیدگاه


              #7
              پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

              سلام. من سعیآ‌ کردم کد شما رو run کنم اما این error و داد:

              Undefined function 'imshow' for input arguments of type
              'double'.


              "ver" و توی command window تایپ کردم، به نظر میرسه که image processing toolbox و میشناسه..شما میدونین اشکال از کجاست؟

              دیدگاه


                #8
                پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                نوشته اصلی توسط negin-bahadori
                سلام. من سعیآ‌ کردم کد شما رو run کنم اما این error و داد:

                Undefined function 'imshow' for input arguments of type
                'double'.


                "ver" و توی command window تایپ کردم، به نظر میرسه که image processing toolbox و میشناسه..شما میدونین اشکال از کجاست؟
                من از ورژن 2010b متلب استفاده می کنم. قسمتی که خطا می گیره، متغیر داخل imshow رو با دستور unit8 تبدیل کنید و علامت های [], رو هم بردارید. در ضمن برای نمایش تبدیل فوریه تصویر (SPF) اگه در قسمت imshow، یک log قبل متغیر بذارید تصویر واضحتری می گیرید.
                لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
                لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
                با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
                اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
                يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

                دیدگاه


                  #9
                  پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                  سلام "هادی" جان
                  ممنون از راهنمایی عالیت.یه سری سوال برام پیش اومده.
                  1-شما عکس اول رو not کردین و به عنوان فیلتر استفاده کردین
                  من اون دستور رو حذف کردم و دیدم که کیفیت ر. پایین آورد و به نوعی سبب شد طیف در صفحه فرکانسی گسترده شود
                  آیا این تنها دلیلی هست که از این دستور استفاده کردید؟
                  2-شما از این دو دستور برای همبستگی استفاده کردین:
                  ;
                  HF = H .* Fc
                  HF = fliplr(HF);
                  که همین کار رو تابع corr2 انجام میده با این تفاوت که این تابع به real بودن حساسه.آیا راه دیگه ای برای این کار هست؟
                  3-تابع conj چه فرقی با حالتی که این تابع نوشته نشده باشد دارد که شکل موج خروجی یک مقدار متفاوت می شود؟
                  عذر میخوام سوالام زیاد شدن

                  دیدگاه


                    #10
                    پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                    نوشته اصلی توسط orcid
                    سلام "هادی" جان
                    ممنون از راهنمایی عالیت.یه سری سوال برام پیش اومده.
                    1-شما عکس اول رو not کردین و به عنوان فیلتر استفاده کردین
                    من اون دستور رو حذف کردم و دیدم که کیفیت ر. پایین آورد و به نوعی سبب شد طیف در صفحه فرکانسی گسترده شود
                    آیا این تنها دلیلی هست که از این دستور استفاده کردید؟
                    2-شما از این دو دستور برای همبستگی استفاده کردین:
                    ;
                    HF = H .* Fc
                    HF = fliplr(HF);
                    که همین کار رو تابع corr2 انجام میده با این تفاوت که این تابع به real بودن حساسه.آیا راه دیگه ای برای این کار هست؟
                    3-تابع conj چه فرقی با حالتی که این تابع نوشته نشده باشد دارد که شکل موج خروجی یک مقدار متفاوت می شود؟
                    عذر میخوام سوالام زیاد شدن
                    1- Not اینجا کار خاصی نمی کنه و فقط به خاطر نوع عکس هاست که در عکس شماره 1، قسمت های مشکی 1 و قسمت های سفید 0 هستند که باید برعکس باشه (به خاطر colormap عکس).
                    در ضمن فرقی نمی کنه کدوم تصویر فیلتر باشه چون عمل correlation قابلیت جابجایی داره.
                    2- طبق تعریف correlation این کار انجام شده. نمیدونم شاید تابع دیگه ای هم در متلب باشه.
                    3- طبق تعریف correlation یکی از مقادیر، مزدوجش توی فرمول هست.
                    لطفاً برای انجام پروژه های دانشجویی پیام خصوصی نفرستید.
                    لطفاً سؤالاتی که در انجمن قابل طرح شدن هستند پیام خصوصی نکنید.
                    با تمام وجود گناه کرديم اما نه نعمتش را از ما گرفت نه گناهان ما را فاش کرد اطاعتش کنيم چه مي کند؟"دکتر شريعتي"
                    اگر جايي که ايستاده ايد را نمي پسنديد، عوضش کنيد شما درخت نيستيد!! "پاسكال"
                    يا به اندازه ي آرزوهايت تلاش کن يا به اندازه تلاشت آرزو کن. "شکسپير"

                    دیدگاه


                      #11
                      پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                      سلام ..

                      شاید مطالبی که در این پست مطرح میشن؛ به نوعی به پست های خوب بالا ارتباط مستقیم نداشته باشن؛ امــا در راستای موضوع اصلی این تاپیک هستن و بهتر اینکه در این بخش به اونها بپردازیم با این امید و هدف که به جمعبندی مطالب کمک کنیم .. یکی از مسائلی که در پردازش تصویر و بخصوص تصویربرداری دیجیتال، بسیار مورد توجه و اهمیت هست؛ این موضوعه که تصویر یا تصاویری که در دو وضعیت مختلف از یک جسم گرفته شدن؛ تا چه میزان از نظر کیفیت، به تصویر حقیقی نزدیک هستن .. این تفاوت میتونه به دلیل نویزی بودن یکی از سیگنال ها (تصاویر) یا Distort شدن یکی از تصاویر به هنگام فشرده سازی تصویر با الگوریتم های مختلف (JPEG و یا SPIHT و یا ...) و مواردی از این قبیل باشه .. یکی از متدهای پرطرفداری که در سال 2004 برای این موضوع مطرح شد؛ الگوریتمی بود با نام SSIM یا Structural SIMilarity .. کاری که این الگوریتم انجام میده این هست که با توجه به فرضیه ی خطای وجود داشته در تصویر مقصد؛ از الگوریتم (دیاگرام شهودی) زیر برای بدست آوردن میزان تشابه دو تصویر (تصویر اصلی یا سیگنال X و تصویر مقصد یا سیگنال Y) استفاده میکنه ..


                      با استفاده از الگوریتم بالا بر روی تصویر اصلی نمونه ی زیر و تصویر نویزی مقصد؛ میتونیم میزان تشابه اونها رو به دست بیاریم ..


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

                      دیدگاه


                        #12
                        پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                        سلام ..

                        یکی از موارد پرکاربرد دیگه ای که در راستای مطالب این تاپیک میتونه مورد دسته بندی قرار بگیره؛ محاسبه ی خطای تصاویر یا به عبارت بهتر؛ میزان کیفیت دو تصویری که یکی از اونها تخریب شده به هر دلیلی، هست (--موردی مشابه پست قبل--) .. در کد ضمیمه شده ی انتهایی این پست؛ معروف ترین و پرکاربردترین این الگوریتم ها در نرم افزار MATLAB پیاده سازی شدن که امیدوارانه میتونن به جمعبندی مطالب این تاپیک کمک کنن .. موفق و سلامت و شاد باشید ..
                        فایل های پیوست شده
                        دوستان! مدتی کمتر به سایت میام ..

                        دیدگاه


                          #13
                          پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                          ممنون واقعا. هر 2 پست قبلیتون خیلیآ‌ مفید بود. راستش یه بخشش برای من نامفهوم بود..میآ‌شه بگید منظور از structure comparison یا structural content چیه؟

                          دیدگاه


                            #14
                            پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                            سلام ..

                            منظور از ماهیت های ساختاری (Structural)؛ همه ی اون خصوصیاتی از تصویر هستن که جدای از ویژگی های ظاهری تصاویر و آبجکت ها (شدت رنگ؛ میزان روشنایی و ...)، به درک بهتر اینکه: "این تصویر چه چیزی هست"؛ کمک میکنن .. در سیستم عصبی انسان هم این ویژگی به صورت قابل ملاحظه ای انجام وظیفه میکنه و به تشخیص نوع اجسام کمک شایانی میکنه .. نکته ی کوتاه در مورد پست شماره ی 11 اینکه؛ این الگوریتم ها؛ همون طور هم که اشاره کردیم؛ متدهای پایه، امــا پرکاربرد در مقایسه ی دو سیگنال مبداء و مقصد با هم هستن و الگوریتم SSIM به نوعی تلاش میکنه تا این متدها رو بهینه (Improve) کنه .. بعلاوه؛ در ایـن آدرس؛ یک پیاده سازی بسیار خوب و قابل اعتماد از الگوریتم SSIM در محیط OpenCV انجام شده (به همراه توضیحات) که امیدوارانه میتونن به جمعبندی مطالب این تاپیک کمک کنن .. موفق و سلامت و شاد باشید ..
                            دوستان! مدتی کمتر به سایت میام ..

                            دیدگاه


                              #15
                              پاسخ : انتخاب تابع مناسب برای برنامه (شباهت دو عکس)

                              سلام به همه. لطفا اگه کد برای محاسیه ی PSNR دارید (++C) در اختیارم بذارید. ممنون

                              دیدگاه

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