cv2联通区域的内接圆
时间: 2023-06-24 12:04:49 浏览: 191
机器视觉-opencv-区域最大内接圆
要找到联通区域的内接圆,可以按照以下步骤进行:
1. 使用OpenCV的cv2.connectedComponents函数找到联通区域,并用cv2.circle函数画出每个区域的外接圆。
2. 对于每个区域,计算其外接圆的半径。
3. 对于每个区域,计算其面积,并根据面积和半径的关系确定是否要绘制内接圆。
4. 如果要绘制内接圆,则计算出该区域的质心,并使用cv2.circle函数在质心处画出半径为内接圆半径的圆。
以下是示例代码:
```python
import cv2
import numpy as np
# 读入图像
img = cv2.imread('input.png', 0)
# 二值化图像
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 找到联通区域
output = cv2.connectedComponentsWithStats(thresh, 8, cv2.CV_32S)
num_labels = output[0]
labels = output[1]
stats = output[2]
# 循环遍历每个区域
for i in range(1, num_labels):
# 计算外接圆的半径
radius = int(np.sqrt(stats[i, cv2.CC_STAT_AREA] / np.pi))
# 获取外接圆的中心坐标和半径
(x, y), _ = cv2.minEnclosingCircle(np.argwhere(labels == i))
# 计算该区域的质心
m = cv2.moments((labels == i).astype(np.uint8))
cx = int(m['m10'] / m['m00'])
cy = int(m['m01'] / m['m00'])
# 计算内接圆的半径
if stats[i, cv2.CC_STAT_AREA] / np.pi > radius ** 2:
inner_radius = radius
else:
inner_radius = int(np.sqrt(stats[i, cv2.CC_STAT_AREA] / np.pi))
# 绘制外接圆和内接圆
cv2.circle(img, (int(x), int(y)), radius, (0, 255, 0), 2)
cv2.circle(img, (cx, cy), inner_radius, (0, 0, 255), 2)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,输入图像为二值化图像,如下所示:
![input](https://img-blog.csdn.net/20180709160632751?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BhcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
运行结果如下所示:
![output](https://img-blog.csdn.net/20180709160650356?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BhcGVy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
阅读全文