使用 OpenCV 实现 Hough 圆检测可以通过以下步骤实现:
1. 导入必要的库和图像。
```python
import cv2
import numpy as np
# 加载图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
```
2. 对图像进行预处理。
```python
# 高斯模糊
img = cv2.GaussianBlur(img, (5, 5), 0)
# Canny 边缘检测
edges = cv2.Canny(img, 100, 200)
```
3. 运行 Hough 圆检测算法。
```python
# 运行 Hough 圆检测算法
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# 将圆心和半径转换为整数
circles = np.uint16(np.around(circles))
```
其中,参数解释如下:
- `edges`:边缘检测后的图像。
- `cv2.HOUGH_GRADIENT`:使用梯度法检测圆形。
- `1`:表示检测图像的分辨率。
- `20`:表示两个圆之间的最小距离。
- `param1=50`:表示 Canny 边缘检测的高阈值。
- `param2=30`:表示圆心的累加器阈值。
- `minRadius=0`:表示圆的最小半径。
- `maxRadius=0`:表示圆的最大半径。
4. 在图像上绘制检测到的圆。
```python
# 绘制检测到的圆
for i in circles[0, :]:
# 绘制圆
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
# 绘制圆心
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)
# 显示图像
cv2.imshow('Hough Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`circles[0, :]` 存储检测到的所有圆的参数,包括圆心坐标和半径。在绘制圆时,`cv2.circle()` 函数的参数解释如下:
- `(i[0], i[1])`:圆心坐标。
- `i[2]`:圆的半径。
- `(0, 255, 0)`:圆的颜色。
- `2`:圆的线宽。
- `(0, 0, 255)`:圆心的颜色。
- `3`:圆心的大小。
完整代码如下:
```python
import cv2
import numpy as np
# 加载图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 高斯模糊
img = cv2.GaussianBlur(img, (5, 5), 0)
# Canny 边缘检测
edges = cv2.Canny(img, 100, 200)
# 运行 Hough 圆检测算法
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
# 将圆心和半径转换为整数
circles = np.uint16(np.around(circles))
# 绘制检测到的圆
for i in circles[0, :]:
# 绘制圆
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
# 绘制圆心
cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)
# 显示图像
cv2.imshow('Hough Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```