分水嶺分割算法(watershed segmentation)的C++實現(法1)


運行環境:ubuntu16.04+Qt+opencv2.4.13

參考鏈接:http://blog.csdn.net/u010741471/article/details/45193521

watershedsegmenter.h

#ifndef WATERSHEDSEGMENTER #define WATERSHEDSEGMENTER #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp>

class WatershedSegmenter { private: //用來表示標記(圖)
 cv::Mat markers; public: //設置標記圖
      void setMarkers(const cv::Mat& markerImage) { //watershed()的輸入參數必須為一個32位有符號的標記,所以要先進行轉換
 markerImage.convertTo(markers,CV_32S); } //執行watershed()
      cv::Mat process(const cv::Mat &image) { // Apply watershed
 cv::watershed(image,markers); return markers; } // 以圖像形式返回結果
 cv::Mat getSegmentation() { cv::Mat tmp; // 從32S到8U(0-255)會進行飽和運算,所以像素高於255的一律復制為255
        markers.convertTo(tmp,CV_8U);// 
        return tmp; } // 以圖像形式返回分水嶺(我理解的是分割線)
 cv::Mat getWatersheds() { cv::Mat tmp; //在設置標記圖像,即執行setMarkers()后,邊緣的像素會被賦值為-1,其他的用正整數表示 //下面的這個轉換可以讓邊緣像素變為-1*255+255=0,即黑色,其余的溢出,賦值為255,即白色。
        markers.convertTo(tmp,CV_8U,255,255); return tmp; } }; #endif // WATERSHEDSEGMENTER

main.cpp

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include "watershedsegmenter.h"

using namespace std; using namespace cv; int main() { // Read input image 原圖
    Mat image= imread("/home/osksh/skin_c/dulani_anuradha4.jpg"); if (!image.data) return 0; // Display the image
    namedWindow("Original Image"); imshow("Original Image",image); Mat binary,fg,bg; cvtColor(image,binary,CV_RGBA2GRAY); //Display the binary image
    namedWindow("Binary Image"); imshow("Binary Image",binary); // 由二值圖像獲得前景。腐蝕。移除噪點與微小物體
 erode(binary,fg,cv::Mat(),cv::Point(-1,-1),6); // Display the foreground image
    namedWindow("Foreground Image"); imshow("Foreground Image",fg); //膨脹二值圖來獲取背景(只有草地,沒有樹林)
    dilate(binary,bg,cv::Mat(),cv::Point(-1,-1),6); threshold(bg,bg,150,128,cv::THRESH_BINARY_INV); //最后一個參數的表示 ifsrc>1,dst=0,else dst=128。這樣就使背景全為灰色(128) // Display the background image
    namedWindow("Background Image"); imshow("Background Image",bg); // Show markers image
    Mat markers(binary.size(),CV_8U,cv::Scalar(0)); markers= fg+bg;//使用重載操作符+
    namedWindow("Markers"); imshow("Markers",markers); // Create watershed segmentation object
 WatershedSegmenter segmenter; // Set markers and process
 segmenter.setMarkers(markers); segmenter.process(image); // Display segmentation result
    namedWindow("Segmentation"); imshow("Segmentation",segmenter.getSegmentation()); // Display watersheds
    namedWindow("Watersheds"); imshow("Watersheds",segmenter.getWatersheds()); waitKey(0); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM