区域分割(不用分水岭(找出图片里所有的圆)C++代码
时间: 2024-01-03 13:03:51 浏览: 72
区域分割是一种基于图像特征的分割方法,常用于图像分割中。下面是一份简单的 C++ 代码,可以用于找出图片中所有的圆形。
```
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("image.jpg", IMREAD_GRAYSCALE);
imshow("Original Image", src);
waitKey(0);
// 阈值分割
Mat thresh;
threshold(src, thresh, 0, 255, THRESH_BINARY + THRESH_OTSU);
imshow("Thresholded Image", thresh);
waitKey(0);
// 查找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
Mat contoursImg = Mat::zeros(src.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
if (area < 100 || area > 1000) // 过滤掉面积不合适的轮廓
continue;
// 判断是否为圆形
vector<Point> hull;
convexHull(contours[i], hull);
double hullArea = contourArea(hull);
double ratio = area / hullArea;
if (ratio < 0.8 || ratio > 1.2) // 过滤掉不符合圆形特征的轮廓
continue;
drawContours(contoursImg, contours, i, Scalar(0, 0, 255), 2);
}
imshow("Contours Image", contoursImg);
waitKey(0);
return 0;
}
```
代码的主要流程如下:
1. 读入灰度图像,并显示原图像。
2. 对图像进行阈值分割,得到二值化图像,并显示。
3. 查找二值化图像中的轮廓。
4. 对每个轮廓进行面积和形状特征的判断,过滤掉不符合条件的轮廓。
5. 绘制符合条件的轮廓,并显示。
需要注意的是,本代码仅适用于简单的圆形分割场景,对于其他类型的图像分割需要根据具体情况进行调整。
阅读全文