خوراک پی سی کدنویس

ورود کاربران

آمار سایت

اعضا : 431
محتوا : 74
پیوندها : 6
بازدیدهای محتوا : 245437

حاضرین در سایت

 74 مهمان حاضر

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

firefox icon

Valid XHTML 1.0 Transitional Valid CSS!

خوشه یابی با الگوریتم K میانگین در OpenCV

4 امتیاز
خوشه یابی یکی از مباحث مطرح در حوزه شناسایی الگو است که به عنوان یک طبقه بند بدون نظارت (unsupervised classifier) هم شناخته می شود. وظیفه یک الگوریتم خوشه یابی این است که داده های ورودی را تحلیل کرده و آنها را به تعدادی خوشه تقسیم کند:

خوشه بندی به روش k میانگین

نقاط پراکنده در صفحه دوبعدی به 5 خوشه تقسیم شده اند.
یکی از معروفترین الگوریتمهای خوشه بندی، الگوریتم K میانگین (K-means یا C-means) است. این الگوریتم تلاش می کند که بر اساس یک معیار فاصله، داده ها را به k خوشه تقسیم کند. معمولا هر خوشه توسط بردار میانگین داده های موجود در آن نمایندگی می شود. در روش k همسایگی، روند کار به طور ساده به این صورت است که ابتدا K بردار تصادفی به عنوان مراکز خوشه های اولیه انتخاب می شوند. این بردارها می توانند از فضای داده های ورودی انتخاب شوند یا مقادیر کاملا تصادفی داشته باشند. سپس هر داده ورودی بر اساس یک معیار فاصله (مثل فاصله اقلیدسی یا city block) با بردارهای میانگین اولیه، به یکی از خوشه ها تخصیص داده می شود. در پایان دوره اول، میانگین خوشه ها بر اساس داده هایی که به هر خوشه تخصیص داده شده است، به روز می شوند و فرایند مقایسه و تخصیص تکرار می شود. این فرایند آنقدر ادامه می یابد که بردارهای میانگین خوشه ها دیگر تغییر نکند. تمام

پیاده سازی این الگوریتم خیلی ساده است و هر برنامه نویس متوسطی می تواند پیاده سازی کند لیکن کتابخانه OpenCV این الگوریتم را دارد و شما می توانید به راحتی از آن استفاده کنید.
کد زیر یک برنامه نمونه با استفاده از OpenCV است که البته در مثالهای خود OpenCV هم مشابه آن یافت می شود. جهت استفاده از ساختار جدید OpenCV تغییراتی در آن اعمال شده که استفاده آن در سایر برنامه ها را آسانتر کند. این برنامه چند خوشه با توزیع های گاوسی مختلف تولید می کند و سپس با الگوریتم kmeans آنها را خوشه یابی می کند و در قالب یک تصویر، نتیجه خوشه بندی را نمایش می دهد:
 
#ifdef _CH_
#pragma package 
#endif
 
#define CV_NO_BACKWARD_COMPATIBILITY
 
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include 
#endif
 
#ifdef _DEBUG
#pragma comment (lib, "highguid.lib")
#pragma comment (lib, "cxcored.lib")
#else
#pragma comment (lib, "highgui.lib")
#pragma comment (lib, "cxcore.lib")
#endif
 
int main( int argc, char** argv )
{
#define MAX_CLUSTERS 5
	CvScalar color_tab[MAX_CLUSTERS];
	IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
	CvRNG rng = cvRNG(-1);
	CvPoint ipt;
 
	color_tab[0] = CV_RGB(255,0,0);
	color_tab[1] = CV_RGB(0,255,0);
	color_tab[2] = CV_RGB(100,100,255);
	color_tab[3] = CV_RGB(255,0,255);
	color_tab[4] = CV_RGB(255,255,0);
 
	cvNamedWindow( "clusters", 1 );
 
	for(;;)
	{
  char key;
  int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
  int i, sample_count = cvRandInt(&rng)%1000 + 1;
 
 
  cv::Mat _points (sample_count, 2, CV_32FC1);
  cv::Mat _clusters (sample_count, 1, CV_32SC1);
  //cv::RNG& rng = cv::theRNG();
  //rng.fill(_points, cv::RNG::NORMAL, param1, param2 );
  for(int i = 0; i < sample_count; i++){
   CvPoint center;
   CvMat point_chunk;
   center.x = cvRandInt(&rng)%img->width;
   center.y = cvRandInt(&rng)%img->height;
  }
 
  CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 );
  CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );
  cluster_count = MIN(cluster_count, sample_count);
 
  /* generate random sample from multigaussian distribution */
  for( k = 0; k < cluster_count; k++ )
  {
   CvPoint center;
   CvMat point_chunk;
   center.x = cvRandInt(&rng)%img->width;
   center.y = cvRandInt(&rng)%img->height;
   cvGetRows( points, &point_chunk, k*sample_count/cluster_count,
    k == cluster_count - 1 ? sample_count :
    (k+1)*sample_count/cluster_count, 1 );
 
   cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL,
    cvScalar(center.x,center.y,0,0),
    cvScalar(img->width*0.1,img->height*0.1,0,0));
  }
 
  /* shuffle samples */
  for( i = 0; i < sample_count/2; i++ )
  {
   CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
   CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
   CvPoint2D32f temp;
   CV_SWAP( *pt1, *pt2, temp );
  }
 
 
  for(int i = 0; i < sample_count; i++){   
   _points.at(i, 0) = points->data.fl[i*2];
   _points.at(i, 1) = points->data.fl[i*2+1];
  }
 
 
  //old OpenCV Style
  //cvKMeans2( points, cluster_count, clusters,
  //	cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ),
  //	5, 0, 0, 0, 0 );
 
  //New OpenCV Style
  cv::kmeans( _points, cluster_count, _clusters,
   cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ),
   5, 0, 0);
 
  cvZero( img );
 
  for( i = 0; i < sample_count; i++ )
  {
   //int cluster_idx = clusters->data.i[i];
   //ipt.x = (int)points->data.fl[i*2];
   //ipt.y = (int)points->data.fl[i*2+1];
 
   int cluster_idx = _clusters.at(i, 0);
   ipt.x = (int)_points.at (i, 0);
   ipt.y = (int)_points.at (i, 1);
 
   cvCircle( img, ipt, 2, color_tab[cluster_idx], CV_FILLED, CV_AA, 0 );
  }
 
  cvReleaseMat( &points );
  cvReleaseMat( &clusters );
 
  cvShowImage( "clusters", img );
 
  key = (char) cvWaitKey(0);
  if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
   break;
	}
 
	cvDestroyWindow( "clusters" );
	return 0;
}
 
#ifdef _EiC
main(1,"kmeans.c");
#endif
 
 
  • آرش  - تشکر
    avatar
    با سلام.
    من کامنتی گذاشتم نمیدونم چرا نیستش شاید هم پاک کرده باشید. به هر حال خواستم از زحماتتوت تشکر کنم و عرض حسته نباشید داشته باشم و اینکه شما غیر از کلاسهای دانشگاه که تدریس میکنید جایی دیگه هم فعالیت دارید؟ من دنبال جایی هستم که برنامه نویسی رو به صورت حرفه ای آموزش بده. اگه خودتون هستید یا کسی و جایی میشناسید ممنون میشم راهنماییم کنید.
    با تشکر
    آرش
  • مدیر سایت
    avatar
    سلام
    خیر جای دیگری فعالیت ندارم.
    اگر ساکن تهران هستید که دوره های آموزشی حرفه ای زیادی هست که با جستجوی ساده در اینترنت می توانید بیابید. لیکن جای خاصی مد نظر ندارم.

    موفق باشید
  • محمد زارع  - درخواست
    avatar
    سلام استاد من یک مدیر پروژه (مهندس مکانیک)هستم و در حال حاضر نیاز به متخصص نرم افزار برای توسعه یک روبات دارم با بررسی هایی که انجام داده ام فکر میکنم استفاده از زبان ++C برای طراحی و ساخت کنترلر ها مناسب است درصورتی که وقت کافی برای همکاری داشته باشید خوشحال میشوم مراتب را برای تفاهم بیشتر توضیح دهم.با احترام MHK
  • مدیر سایت
    avatar
    سلام
    متاسفانه خود من وقت ندارم، لیکن اگر کسی از دانشجویانم تمایل داشت به شما معرفی خواهم کرد.
  • محمد امین  - آماده همکاری هستم
    avatar
    سلام من دانشجوی فوق لیسانس هوش مصنوعی هستم از دانشگاه صنعتی امیر کبیر از سایتتون و فضای علمیش خوشم اومده و آماده کمک رسانی به دانشجویان عزیز هستم
    فقط قیلش دوست دارم که مدیر این سایت رو بشناسم
  • مهدي  - خسته نباشيد از طرف دوستان
    avatar
    واقعا به برنامه نويسي علاقه مند شدم ممنون
  • محمد  - clustering
    avatar
    salam .
    neveshte hatoon kheili mofid bood mamnoonam.

    man mikham model based clustering ro baraye ye ghesmat az karam piade konam.modeli ro ke estefade kardam hmme 5 halatas.shoma clustering methode khassi ro be gheir az hiererical mitoonin be man moarrefi konin?
    age code ham dashtin mamnoon misham
  • مدیر سایت
    avatar
    @محمد
    علیک سلام
    از روشهای خوشه یابی، فقط Kمیانگین و سلسله مراتبی را بلدم. متاسفانه در زمینه خوشه یابی مبتنی بر مدل نمی توانم کمکتان کنم. کد هم سراغ ندارم.
    موفق باشید.
  • الهه  - تشریح کد
    avatar
    سلام
    من جاوا بلدم و این کد را خیلی نمی فهمم
    اگه می شه یک انسان خیرخواهی لطف کنه یک اندک توضیحی بده یا اگه می تونه جاوا این کدو بزنه ممنون می شم
  • مدیر سایت
    avatar
    @الهه
    کد جاوای آن را ندارم، تجربه کمی که با جاوا دارم یادم هست که برای جاوا یک کتابخانه پردازش تصویر قدرتمند با نام Java Advanced Imaging یا JAI وجود داشت. می توانید از آن استفاده کنید.
  • مونا
    avatar
    سلام.وقتتون بخیر.موضوع پایان نامه من ارائه مدل جدید RFM بر اساس الگوریتم K-Means است.برای برنامه نویسی میتونین منو کمک کنین؟در مورد هزینه شم با هم به توافق می رسیم.با تشکر
  • ناشناس  - سلام .
    avatar
    نیاز فوری

    چروژه من در مورد الگوریتم های خوشه بندی تصاویر هستش اما به یک مشکل بزرگ برخورد کردم انم نحوه آنالیز تصویر در خوشه بندی هستش که چگونه عکس برای الگوریتم نمایش داده میشه(مثلا به صورت هیستوگرام ، بیتی،...) و همچینین معیار شباهت تصاویر چیه؟
    متشکرم
    امیر
اظهار نظر
مشخصات شما:
گراواتار enabled
نظر:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):s:!::?::idea::arrow:
امنیت
کد آنتی اسپم نمایش داده شده در عکس را وارد کنید.