# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > پردازش تصویر (Image Processing) >  مومنت ( moment ) چیست و چگونه پیاده سازی آن در پردازش تصویر ؟؟؟

## crackestan

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

----------


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

به این لینک نگاه کنید
بستگی داره که شما برای چه کاربردی بخاید hu moment , central moment چیز خاصی ندارند.
 moment  هایی که پیچیده تره zernik هستش

----------


## crackestan

> به این لینک نگاه کنید
> بستگی داره که شما برای چه کاربردی بخاید hu moment , central moment چیز خاصی ندارند.
>  moment  هایی که پیچیده تره zernik هستش


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

----------


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

از او لینکی که گذاشتم spatial moment رو محاسبه می کنه یعنی مقدار pnt
جهت بدست آوردن central moment مقدار pnt را با اون کد محاسبه کرده  و در کد زیر استفاده کنید 

float centalMoment(int p,int q)
{
 float result = 0;
for(int y=0;y< image->height;y++)
  for(int x=0;x <image->width;x++)
  {
      result +=  pow((x - pnt.x) ,p) + pow((y- pnt.y),q) * image->pixels(x,y);   
  }
return result;
}

----------


## crackestan

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

واقعا معذرت میخوام که سئوالاتم اینجوریه . میدونم که خیلی سئوالاتم تابلو هست . باور کنید خیلی تلاش کردم برای فهم مامنت ولی خود مامنت رو هم درست متوجه نشدم .

----------


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

دوست عزیز اگر واقعاً می بینید که اینقدر مشکل دارید باید یه خورده مطالعه  خودتونو بیشتر کنید.کلاً moment یه مبحث آماریه .که بیشترین کاربردش در پردازش تصویر هستش.
شما تصویری دارید به فرض مثال یک تصویر باینری مایلید مرکز ثقل این شی رو پیدا کنید نه مرکز مستطیلی که در اون احاطه شده برای بدست آوردن این مرکز از central moment مرتبه اول در جهت x و y استفاده می کنند.
برای عملیات preprocessing همچون نرمال سازی تصویر با استفاده از مرکز ثقل این نرمال سازی صورت می گیره

----------


## crackestan

با تشکر از لطف تمامیه دوستان عزیز خصوصا جناب mostafa.sataki
من تونستم سنترال مامنت رو پیاده سازی کنم .
حالا یه سوال برام پیش اومده :
معنی خروجی ای که سنترال مامنت به ما میده چیه ؟؟
من سنترال مامنت رو روی یه تصویر وقتی اعمال میکنم ، یه آرایه به من میده که من هیچی ازش نمیفهمم . امکان داره درباره ی خروجی سنترال مامنت بهم توضیح بدید ؟؟؟

----------


## en-keramat

اگر با نرم افزار Matlab کار می کنید . من یه کد که hu moments پیادسازی کرده که بر اساس فرمول که در اینجا هستش نوشته است
http://en.wikipedia.org/wiki/Image_moment
اینم سورس Matlab


% This function calculates hu moments acording to the formulas given in 
% http://en.wikipedia.org/wiki/Image_moment

% First of all the central moments(mu(i,j)) and center of mass(x_bar,y_bar)
% of the image are calculated according to the formulas given in the link 
% then hu moments are calculated and saved in a vector as an output



function  hu_moments_vector  = hu_moments( image )

[height, width] = size(image);

% define a co-ordinate system for image 
xgrid = repmat((-floor(height/2):1:ceil(height/2)-1)',1,width);
ygrid = repmat(-floor(width/2):1:ceil(width/2)-1,height,1);

[x_bar, y_bar] = centerOfMass(image,xgrid,ygrid);

% normalize coordinate system by subtracting mean
xnorm = x_bar - xgrid;
ynorm = y_bar - ygrid;

% central moments
mu_11 = central_moments( image ,xnorm,ynorm,1,1);
mu_20 = central_moments( image ,xnorm,ynorm,2,0);
mu_02 = central_moments( image ,xnorm,ynorm,0,2);
mu_21 = central_moments( image ,xnorm,ynorm,2,1);
mu_12 = central_moments( image ,xnorm,ynorm,1,2);
mu_03 = central_moments( image ,xnorm,ynorm,0,3);
mu_30 = central_moments( image ,xnorm,ynorm,3,0);


%calculate first 8 hu moments of order 3
I_one   = mu_20 + mu_02;
I_two   = (mu_20 - mu_02)^2 + 4*mu_11;
I_three = (mu_30 - 3*mu_12)^2 + (mu_03 - 3*mu_21)^2;
I_four  = (mu_30 + mu_12)^2 + (mu_03 + mu_21)^2;
I_five  = (mu_30 - 3*mu_12)*(mu_30 + mu_12)*((mu_30 + mu_12)^2 - 3*(mu_21 + mu_03)^2) + (3*mu_21 - mu_03)*(mu_21 + mu_03)*(3*(mu_30 + mu_12)^2 - (mu_03 + mu_21)^2);
I_six   = (mu_20 - mu_02)*((mu_30 + mu_12)^2 - (mu_21 + mu_03)^2) + 4*(mu_30 + mu_12)*(mu_21 + mu_03);
I_seven = (3*mu_21 - mu_03)*(mu_30 + mu_12)*((mu_30 + mu_12)^2 - 3*(mu_21 + mu_03)^2) + (mu_30 - 3*mu_12)*(mu_21 + mu_03)*(3*(mu_30 + mu_12)^2 - (mu_03 + mu_21)^2);
I_eight = mu_11*(mu_30 + mu_12)^2 - (mu_03 + mu_21)^2 - (mu_20 - mu_02)*(mu_30 + mu_12)*(mu_21 + mu_03);

hu_moments_vector = [I_one, I_two, I_three,I_four,I_five,I_six,I_seven,I_eight];

end

% calculate scale invariant central moments
function cm = central_moments( image ,xnorm,ynorm,p,q)
    
    cm = sum(sum((xnorm.^p).*(ynorm.^q).*image));
    cm_00 = sum(sum(image)); %this is same as mu(0,0);
    % normalise moments for scale invariance
    cm = cm/(cm_00^(1+(p+q)/2));
    
end

% calculate center of mass
function [x_bar, y_bar] = centerOfMass(image,xgrid,ygrid)

    eps = 10^(-6); % very small constant 
    
    x_bar = sum(sum((xgrid.*image)))/(sum(image(:))+eps);
    y_bar = sum(sum((ygrid.*image)))/(sum(image(:))+eps);

end



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

----------


## ali_reza_nazari

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

----------


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

برای نوشتن ocr نمی تونید از Hu momemnt استفاده کنید چون اطلاعات خاصی رو به شما نمی ده فقط 7 تا مقدار هستش که تو حالت آزمایشگاهی و کاملاً بدون نویز هم نمی تونه کلاسیفای کنه.
ولی اگر از مومنت های پیچیده تری  مثل Legendre Moments، Zernike Momentsو pseudo Zernike Moments استفاده کنید براحتی می تونند تو مرتبه های بالا عمل reconstruction رو انجام بدن حتی scale و rotation invariant نیز هستند.

----------


## ali_reza_nazari

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

اگه ممکنه در مورد پیاده سازی زرنیک و توصیفگر فوریه هم راهنمایی بفرمایید
ممنونم

----------


## akbariz

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

----------


## farshidshd

> اگر با نرم افزار Matlab کار می کنید . من یه کد که hu moments پیادسازی کرده که بر اساس فرمول که در اینجا هستش نوشته است
> http://en.wikipedia.org/wiki/Image_moment
> اینم سورس Matlab
> 
> 
> % This function calculates hu moments acording to the formulas given in 
> % http://en.wikipedia.org/wiki/Image_moment
> 
> % First of all the central moments(mu(i,j)) and center of mass(x_bar,y_bar)
> ...



این چطوری باید اجرا بشه؟

----------


## manafzade

> از او لینکی که گذاشتم spatial moment رو محاسبه می کنه یعنی مقدار pnt
> جهت بدست آوردن central moment مقدار pnt را با اون کد محاسبه کرده  و در کد زیر استفاده کنید 
> 
> float centalMoment(int p,int q)
> {
>  float result = 0;
> for(int y=0;y< image->height;y++)
>   for(int x=0;x <image->width;x++)
>   {
> ...


آقای ساتکی یه اشتباهیو کردن. 
      result +=  pow((x - pnt.x) ,p) *+* pow((y- pnt.y),q) * image->pixels(x,y);   
جمع نیست بلکه ضربه
      result +=  pow((x - pnt.x) ,p) *** pow((y- pnt.y),q) * image->pixels(x,y);

----------


## manafzade

بزارین من یه توضیحی بدم. 
ابتدا از حالت ساده شروع میکنیم. 
ما دو پارامتر p,q داریم که مرتبه های گشتاور یا همون ممنتوم رو مشخص میکنن. این پارامترها که یکی بر روی x (ستون) و دیگری بر روی y (سطر) عمل میکنند.
فرض کنید p=0 , q=1 باشد و تصویر ما باینری است یعنی تنها تشکیل شده از صفر و یک است. حال ما میخواهیم گشتاور مرتبه یک را برای آن به دست آوریم (p=0,q=1)
خوب بنا به فرمول  داریم:


res=res+(y)*f(x,y)

به دلیل اینکه f یا صفر است (اگر پس زمینه باشد) و یا یک (که نشان دهنده شی است)، محاسبه این گشتاورمرتبه یک به معنای محاسبه  مجموع مختصات y نقاط مربوط به شی است که اگر بر تعداد آنها (گشتاور مرتبه صفر) تقسیم کنیم همان میانگین نقاط شی در جهت y خواهد بود.
همین طور برای گشتاور مرتبه یک حالت  (p=1,q=0) در جهت x خواهد بود.



res=res+(x)*f(x,y)


منظور از گشتاور مرتبه صفر همان تعداد نقاط شی است : (p=0,q=0) 



res=res+f(x,y)


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

----------


## manafzade

گشتاور با حالت p=1 , q=1 خواهد شد:
res=res+x*y*f(x,y)
برای اینکه گشتاورها مستقل از جابجایی باشند، یعنی با جابجاشدن تصویر مقدار نهایی آن تفاوتی نکند، بجای استفاده از x از x-x0 و بجای y از y-y0 استفاده میکنند.
که x0 , y0 همان مختصات مرکز ثقل شی می باشند. همان طوری که آقای ساتکی فرمول اولیه رو بر این اساس نوشتند.
برای مستقل کردن گشتاورها نسبت به چرخش نیز تغییراتی بر روی این فرمولها حاصل میشود تا با تغییر زاویه تصویر عدد نهایی گشتاورها تغییری نکند.

----------


## عباس65

سلام.
من دانشجوی نرم افزارم.واسه پروژه ام (در مورد پردازش تصویر) به مومنت زرنیک برای استخراج ویژگی نیاز دارم.
متاسفانه هیچ اطلاعاتی در این مورد ندارم و در اینترنت مطلب مفیدی پیدا نکردم.
خواهش میکنم کمکم کنید. :اشتباه:

----------


## ZiRa000

*سلام من در پردازش تصویر و بینایی تقریبا صفرم. اما من تعدادی ماتریس دارم که مقادیری دارند که این مقادیر تا ده‌‌‌ هزار هم میرسه.حالا من می‌خواهم یک سری بررسیها روی این مقادیر انجام بدهم. حالا روی هر ماتریس یا روی تعدادی از این ماتریسها؟ حالا این بررسیها میتواند برسی‌ واریانس باشه یا بررسیهای دیگه. �?‌من در جائی‌ دیدم که مومنت تصویر استفاده کرده. کلا تکنیک‌های ویژن برای این نوع �?‌بررسیها چیه و مومنت تصویر چیه؟ببخشید من دانشی �?‌در این زمینه ندارم*

----------


## gelecek

با سلام
آیا گشتاور زرنیک همان مومنت زرنیک است؟
من باید گشتاور زرنیک را یاد بگیرم.از کجا و چه مبحثی باید شروع به خواندن کنم؟
ممنون

----------

