当前位置:   article > 正文

Opencv之图像分割思路及代码实现_图像分割代码

图像分割代码

实现思路:

1、首先对图像进行预处理,包括对图像进行高斯滤波、边缘检测和二值化等操作;

2、使用分水岭算法对图像进行分割,它将图片分割成不同的区域;

3、最后,根据分割后的区域,我们可以绘制出属于不同区域的轮廓,并将其作为分割图像的结果。

C/C++代码实现:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace cv;
  4. using namespace std;
  5. // 预处理:高斯滤波+边缘检测+二值化
  6. Mat preprocess(Mat& img)
  7. {
  8. Mat blur,edge,thresh;
  9. GaussianBlur(img, blur, Size(9, 9), 0);
  10. Canny(blur, edge, 30, 150);
  11. threshold(edge, thresh, 127, 255, 0);
  12. return thresh;
  13. }
  14. // 分水岭算法分割
  15. Mat segmentation(Mat& img)
  16. {
  17. Mat markers = Mat::zeros(img.size(), CV_8U);
  18. markers(Rect(1, 1, img.cols - 2, img.rows - 2)) = 255;
  19. WatershedSegmenter segmenter;
  20. segmenter.setMarkers(markers);
  21. segmenter.process(img);
  22. return segmenter.getSegmentation();
  23. }
  24. // 绘制轮廓
  25. void drawContour(Mat& img, Mat& segImg)
  26. {
  27. Mat img_color;
  28. cvtColor(img, img_color, COLOR_GRAY2BGR);
  29. vector<vector<Point>> contours;
  30. findContours(segImg, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
  31. drawContours(img_color, contours, -1, Scalar(0, 0, 255), 3);
  32. imshow("result", img_color);
  33. }
  34. int main(int argc, char** argv)
  35. {
  36. Mat img = imread("image.jpg", 0);
  37. if (img.empty())
  38. {
  39. cout << "Could not open or find the image!\n" << endl;
  40. return -1;
  41. }
  42. imshow("input", img);
  43. Mat thresh = preprocess(img);
  44. Mat segImg = segmentation(thresh);
  45. drawContour(img, segImg);
  46. imwrite("result.jpg", segImg);
  47. waitKey(0);
  48. return 0;
  49. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/604267
推荐阅读
相关标签
  

闽ICP备14008679号