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

چگونه می شود از گرادیان تصویر به عنوان ویژگی استفاده کرد؟

0 امتیاز

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

-------------------------------------------------------

من سوالم رو اینطوری بپرسم بهتره در واقع من میخواهم کاری رو که در عکس زیر امده است انجام بدم. یک کدی هم نوشتم اما بنظرم کد مشکل داره اگه کسی اونو چک کنه ممنون میشم. کجای کد مشکل داره؟؟؟؟؟

clc;

clear all;

close all;

% [~,~,im] = imread('Glyph171.png');

im=imread('coins.png');

[Edges, Gdir] = imgradient(im,'Sobel');

 Theta= wrapTo360(Gdir);

[height width R]=size(im);

f= zeros(1,16); % phase value

for i=1:height

    for j=1:width

     

      if(Theta(i,j)>=0)&&(Theta(i,j)<22.5)

        f(1) = f(1)+Edges(i,j);

       elseif(Theta(i,j)>=22.5)&&(Theta(i,j)<45)

         f(2) = f(2)+Edges(i,j);  

       elseif(Theta(i,j)>=45)&&(Theta(i,j)<67.5)

         f(3) = f(3)+Edges(i,j);

       elseif(Theta(i,j)>=67.5)&&(Theta(i,j)<90)

         f(4) = f(4)+Edges(i,j);

       elseif(Theta(i,j)>=90)&&(Theta(i,j)<112.5)

         f(5) = f(5)+Edges(i,j);

       elseif(Theta(i,j)>=112.5)&&(Theta(i,j)<135)

         f(6) = f(6)+Edges(i,j);

       elseif(Theta(i,j)>=135)&&(Theta(i,j)<157.5)

         f(7) = f(7)+Edges(i,j);

       elseif(Theta(i,j)>=157.5)&&(Theta(i,j)<180)

         f(8) = f(8)+Edges(i,j); 

       elseif(Theta(i,j)>=180)&&(Theta(i,j)<202.5)

         f(9) = f(9)+Edges(i,j);

       elseif(Theta(i,j)>=202.5)&&(Theta(i,j)<225)

         f(10) = f(10)+Edges(i,j);

       elseif(Theta(i,j)>=225)&&(Theta(i,j)<247.5)

         f(11) = f(11)+Edges(i,j);

       elseif(Theta(i,j)>=247.5)&&(Theta(i,j)<270)

         f(12) = f(12)+Edges(i,j);

       elseif(Theta(i,j)>=270)&&(Theta(i,j)<292.5)

         f(13) = f(13)+Edges(i,j);

       elseif(Theta(i,j)>=292.5)&&(Theta(i,j)<315)

         f(14) = f(14)+Edges(i,j);

       elseif(Theta(i,j)>=315)&&(Theta(i,j)<337.5)

         f(15) = f(15)+Edges(i,j);

       elseif(Theta(i,j)>=337.5)&&(Theta(i,j)<360)

         f(16) = f(16)+Edges(i,j);

       end



   

    end

end

لطفا منو راهنمایی بفرمایید

سوال شده مهر 3, 1396  بوسیله ی کیوانی (امتیاز 25)   6 7 9
ویرایش شده مهر 5, 1396 بوسیله ی کیوانی

1 پاسخ

0 امتیاز

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

I = imread('coins.png');
[Gmag, Gdir] = imgradient(I,'prewitt');
figure
imshowpair(Gmag, Gdir, 'montage');
title('Gradient Magnitude, Gmag (left), and Gradient Direction, Gdir (right), using Prewitt method')

 

پاسخ داده شده مهر 3, 1396 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
ویژگی گرادیان از هر پیکسل کاراکتر تصویراستخراج می شود.و مقادیری که بدست می اید به صورت یک ارایه است. من میخواهم بدونم چجوری میتوان از این مقادیر بدست امده استفاده کرد و یک ویژگی یا بردار ویژگی ایجاد کرد؟؟؟؟؟
اگر دقت می کردید در پاسخ جواب تون را دادم .ویژگی در هر نقطه 2 عدد اعشاری است یکی برای جهت و دیگری برای شدت. وقتی روی کل شدت در یک کاراکتر آستانه گیری می کنیم یک سری نقاط باقی می مانند که از کل این نقاط هم می توان ویژگی شدت آنها را در یک آرایه ریخت و هم ویژگی جهت در این نقاط را.پس شما اکنون دو بردار ویژگی دارید یکی برای جهت و دیگری برای شدت.
میشه لطفا ب کد بالا ی نگاهی بندازین؟!!!
چرا مقادیر f که بدست میارم به صورت 1.0e+05 *
 هستش. ایا جایی از کد رو دارم اشتباه محاسبه میکنم؟
دوست عزیز با این همه if که شما نوشتید ...
با عملیات تقسیم ساده هم می تونه کار این همه if را انجام بده کلا تصویر جهت را تقسیم بر 16 کنید یک تصویر جهت کوانتایز شده بدست میاد.
حالا یک انباشتگر همانند هیستوگرام در نظر بگیرید کل مقادیر تصویر کوانتایز شده را پیمایش کنید
hist[qimg[i,j]] = hist[qimg[i,j]] +1;
...