1. 程式人生 > 其它 >OpenCV使用GMM實現影象分割

OpenCV使用GMM實現影象分割

一、概述

  案例:使用GMM機器學習演算法實現影象分割

  相關API介紹:

Ptr<EM> emModel = EM::create();//建立EM例項
emModel->setClustersNumber(numCluster);//設定分類個數
emModel->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);//設定協方差矩陣模型
emModel->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));//設定停止條件
emModel->trainEM(points,noArray(),labels,noArray());//
訓練,其中labels中存放的是訓練好後的分類標籤,同一個分類標籤相同

  實現分割演算法的步驟:

    1.載入影象

    2.準備訓練樣本資料:將載入的影象轉為CV_32FC或者CV_64FC1型別的

    3.建立EM例項並訓練樣本是資料,訓練好後輸出分類標籤

    4.建立一個CV_8UC3通道的型別的Mat用於存放,標記後的畫素點

    5.根據labels將分類後的畫素存入第4步中的mat中

    6.輸出影象

二、程式碼演示

  Mat src = imread(filePath);
    if(src.empty()){
        qDebug()<<"
載入影象為空"; return; } imshow("src",src); //獲取原始影象的寬、高、通道數 int width = src.cols; int height = src.rows; int dims = src.channels(); //將原始影象資料轉為double型別 int numSamples = width*height;//總共的畫素點個數 Mat points(numSamples,dims,CV_64FC1);//儲存轉換後浮點資料的容器 Mat labels;//分類標籤
//填充樣本畫素資料 int index = 0; for(int row = 0;row<height;row++){ for(int col = 0;col<width;col++){ index = width*row+col; Vec3b rgb = src.at<Vec3b>(row,col); points.at<double>(index,0)= static_cast<int>(rgb[0]); points.at<double>(index,1)= static_cast<int>(rgb[1]); points.at<double>(index,2)= static_cast<int>(rgb[2]); } } // int numCluster = 3;//3分類 Scalar clolors[] = { Scalar(255, 0, 0), Scalar(0, 255, 0), Scalar(0, 0, 255), Scalar(255, 255, 0) }; //使用emm分類模型進行分類 Ptr<EM> emModel = EM::create(); emModel->setClustersNumber(numCluster);//設定分類個數 emModel->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);//設定協方差矩陣模型 emModel->setTermCriteria(TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 100, 0.1));//設定停止條件 emModel->trainEM(points,noArray(),labels,noArray());//訓練 //根據標籤分類 Mat result = Mat::zeros(src.size(),CV_8UC3); for(int row=0;row<height;row++){ for(int col=0;col<width;col++){ index = row*width+col; int label = labels.at<int>(index,0); Scalar color = clolors[label]; result.at<Vec3b>(row,col)[0] = color[0]; result.at<Vec3b>(row,col)[1] = color[1]; result.at<Vec3b>(row,col)[2] = color[2]; } } imshow("result",result);

 

三、示例圖片