日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

分水岭分割算法(watershed segmentation)的C++实现(法1)

發(fā)布時間:2024/8/22 c/c++ 32 如意码农
生活随笔 收集整理的這篇文章主要介紹了 分水岭分割算法(watershed segmentation)的C++实现(法1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

運行環(huán)境: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:
//用來表示標(biāo)記(圖)
cv::Mat markers; public:
//設(shè)置標(biāo)記圖
void setMarkers(const cv::Mat& markerImage) { //watershed()的輸入?yún)?shù)必須為一個32位有符號的標(biāo)記,所以要先進(jìn)行轉(zhuǎn)換
markerImage.convertTo(markers,CV_32S);
}
//執(zhí)行watershed()
cv::Mat process(const cv::Mat &image) { // Apply watershed
cv::watershed(image,markers); return markers;
} // 以圖像形式返回結(jié)果
cv::Mat getSegmentation() { cv::Mat tmp;
// 從32S到8U(0-255)會進(jìn)行飽和運算,所以像素高于255的一律復(fù)制為255
markers.convertTo(tmp,CV_8U);// return tmp;
} // 以圖像形式返回分水嶺(我理解的是分割線)
cv::Mat getWatersheds() { cv::Mat tmp;
//在設(shè)置標(biāo)記圖像,即執(zhí)行setMarkers()后,邊緣的像素會被賦值為-1,其他的用正整數(shù)表示
//下面的這個轉(zhuǎn)換可以讓邊緣像素變?yōu)?1*255+255=0,即黑色,其余的溢出,賦值為255,即白色。
markers.convertTo(tmp,CV_8U,,);
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 ; // 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(-,-),); // Display the foreground image
namedWindow("Foreground Image");
imshow("Foreground Image",fg); //膨脹二值圖來獲取背景(只有草地,沒有樹林)
dilate(binary,bg,cv::Mat(),cv::Point(-,-),);
threshold(bg,bg,,,cv::THRESH_BINARY_INV);
//最后一個參數(shù)的表示 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());
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();
return ;
}

總結(jié)

以上是生活随笔為你收集整理的分水岭分割算法(watershed segmentation)的C++实现(法1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。