بخش بندی تصویر با EXPECTATION MAXIMIZATION - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

بخش بندی تصویر با EXPECTATION MAXIMIZATION

+1 امتیاز

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

cv::Mat img("d:/sample1.bmp");
EM em( 2);
em.train( img);

 

سوال شده آبان 11, 1396  بوسیله ی ابید (امتیاز 781)   19 89 106

1 پاسخ

+1 امتیاز
 
بهترین پاسخ
ابتدا تصویر خود را به vector of vec3b تبدیل کنید(تبدیل 2 بعدی به یک بعدی). سپس از em استفاده کنید و نهایت vector را به تصویر تبدیل کنید.
 


/**
* Create a sample vector out of RGB image
*/
Mat asSamplesVectors( Mat& img ) {
    Mat float_img;
    img.convertTo( float_img, CV_32F );
 
    Mat samples( img.rows * img.cols, 3, CV_32FC1 );
 
    /* Flatten  */
    int index = 0;
    for( int y = 0; y < img.rows; y++ ) {
        Vec3f * row = float_img.ptr(y);
        for( int x = 0; x < img.cols; x++ )
            samples.at<Vec3f>(index++, 0) = row[x];
        }
        return samples;
    }
 
/**
Perform segmentation (clustering) using EM algorithm
**/
vector EMSegmentation( Mat& image, int no_of_clusters = 2 ){
    Mat samples = asSamplesVectors( image );
 
    cout << "Starting EM training" << endl;
    EM em( no_of_clusters );
    em.train( samples );
    cout << "Finished training EM" << endl;
 
    vector<Mat> segmented;
    for( int i = 0; i < no_of_clusters; i++ )
        segmented.push_back( Mat::zeros( image.rows, image.cols, CV_8UC3 ) );
 
    int index = 0;
    for( int y = 0; y < image.rows; y++ ) {
        for( int x = 0; x < image.cols; x++ ) {
            int result = em.predict( samples.row(index++) )[1];
            segmented[result].at<Point3i>(y, x, 0) = image.at<Point3i>(y, x, 0);
        }
    }
 
    return segmented;
}

 

 

 

 

 

 

 

 

 

پاسخ داده شده آبان 11, 1396 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد دی 17, 1396 بوسیله ی ابید
...