opencv分水岭分割算法C++是

#include #include #include #include #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;}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV 中的分水岭算法可以用于图像分割,将图像分成不同的区域。下面是一个基本的 C++ 代码示例: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("input.png", IMREAD_GRAYSCALE); if (img.empty()) { cerr << "Error: Unable to load image!" << endl; return -1; } // 对图像进行二值化处理 Mat binary; threshold(img, binary, 0, 255, THRESH_BINARY | THRESH_OTSU); // 进行形态学操作 Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); morphologyEx(binary, binary, MORPH_OPEN, kernel); // 计算距离变换 Mat distTransform; distanceTransform(binary, distTransform, DIST_L2, 5); // 构建标签图像 Mat labels; connectedComponents(distTransform > 3, labels, 8); // 将背景标签设为0 labels = labels + 1; // 执行分水岭算法 watershed(img, labels); // 将分割结果可视化 Mat output = Mat::zeros(img.size(), CV_8UC3); for (int i = 0; i < labels.rows; i++) { for (int j = 0; j < labels.cols; j++) { int label = labels.at<int>(i, j); if (label == -1) { output.at<Vec3b>(i, j) = Vec3b(0, 0, 255); // 红色 } else if (label > 0 && label <= 2) { output.at<Vec3b>(i, j) = Vec3b(255, 0, 0); // 蓝色 } else if (label > 2 && label <= 4) { output.at<Vec3b>(i, j) = Vec3b(0, 255, 0); // 绿色 } else if (label > 4 && label <= 6) { output.at<Vec3b>(i, j) = Vec3b(255, 255, 0); // 青色 } else if (label > 6 && label <= 8) { output.at<Vec3b>(i, j) = Vec3b(255, 0, 255); // 洋红色 } else if (label > 8 && label <= 10) { output.at<Vec3b>(i, j) = Vec3b(0, 255, 255); // 黄色 } else { output.at<Vec3b>(i, j) = Vec3b(255, 255, 255); // 白色 } } } imshow("Input", img); imshow("Output", output); waitKey(0); return 0; } ``` 在这个示例中,我们首先加载图像并对其进行二值化处理。然后进行形态学操作和距离变换,以便在后续的分水岭算法中使用。我们使用 `connectedComponents` 函数计算标签图像,然后将背景标签设为0。最后,我们执行分水岭算法,将分割结果可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值