【python】OpenCV—Hough Circle Transform

文章目录


更多有趣的代码示例,可参考【Programming】


1、功能描述

2、代码实现

载入必要的库

python 复制代码
import sys
import cv2 as cv
import numpy as np

函数入口

python 复制代码
if __name__ == "__main__":
    main(sys.argv[1:])

读取图片,判断图片读取是否成功

python 复制代码
    default_file = '1.jpg'
    filename = argv[0] if len(argv) > 0 else default_file

    # Loads an image
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    # Check if image is loaded fine
    if src is None:
        print('Error opening image!')
        print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1

输入图片转成灰度图

python 复制代码
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    cv.imwrite("gray.jpg", gray)

灰度图片进行平滑滤波

python 复制代码
    gray = cv.medianBlur(gray, 5)
    cv.imwrite("medianBlur.jpg", gray)

配置好算法需要的参数

python 复制代码
    rows = gray.shape[0]
    print(rows)

output

python 复制代码
202

调用圆形检测算法

python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=100, param2=30,
                              minRadius=30, maxRadius=100)

根据预测的结果绘制出来圆形,包含圆心和圆

python 复制代码
    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1])
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)

保存结果,可视化结果,退出窗口,退出主函数

python 复制代码
    cv.imwrite("circles.jpg", src)
    cv.imshow("detected circles", src)
    cv.waitKey(0)

    return 0

3、效果展示

python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=150, param2=30,
                              minRadius=70, maxRadius=200)

输入图片

平滑后

检测结果


python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=150, param2=50,
                              minRadius=25, maxRadius=100)

输入图片

平滑后

结果


python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=70, param2=30,
                              minRadius=20, maxRadius=100)

输入图片

灰度图平滑

检测结果


cpp 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=70, param2=45,
                              minRadius=110, maxRadius=200)

输入图片

灰度平滑后

检测结果


python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=70, param2=40,
                              minRadius=20, maxRadius=100)

输入图片

灰度平滑后

检测结果


python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=70, param2=40,
                              minRadius=20, maxRadius=70)

输入图片

灰度平滑后

检测结果


python 复制代码
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=100, param2=35,
                              minRadius=20, maxRadius=70)

输入图片

灰度滤波后

检测结果

4、完整代码

python 复制代码
import sys
import cv2 as cv
import numpy as np

def main(argv):
    default_file = '1.jpg'
    filename = argv[0] if len(argv) > 0 else default_file

    # Loads an image
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    # Check if image is loaded fine
    if src is None:
        print('Error opening image!')
        print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1

    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    cv.imwrite("gray.jpg", gray)

    gray = cv.medianBlur(gray, 5)
    cv.imwrite("medianBlur.jpg", gray)

    rows = gray.shape[0]
    print(rows)
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,
                              param1=100, param2=30,
                              minRadius=30, maxRadius=100)

    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1])
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)
    cv.imwrite("circles.jpg", src)
    cv.imshow("detected circles", src)
    cv.waitKey(0)

    return 0


if __name__ == "__main__":
    main(sys.argv[1:])

5、涉及到的库函数

cv2.HoughCircles 是 OpenCV 库中的一个函数,用于在图像中检测圆形的存在。它基于霍夫变换的圆检测算法,可以在给定的图像中检测并返回所有检测到的圆的信息,如圆的中心坐标和半径。

python 复制代码
circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
  • image:输入的单通道灰度图像。函数将在该图像中进行圆检测。

  • method:霍夫变换的检测方法。常用的有 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALTcv2.HOUGH_GRADIENT_ALTcv2.HOUGH_GRADIENT 的改进方法。

  • dp:图像分辨率与累加器分辨率的比值。例如,dp=1时,累加器和输入图像有相同的分辨率;dp=2时,累加器是输入图像一半大的宽高。

  • minDist:检测到的圆的中心之间的最小距离。如果设置得太小,可能会检测到多个相邻的圆;如果设置得太大,可能会漏掉一些圆。

  • param1:Canny边缘检测的高阈值。对于 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT,这是 Canny 边缘检测的高阈值,低阈值是该参数的一半。

  • param2:累加器阈值。对于 cv2.HOUGH_GRADIENT,它表示检测阶段圆心的累加器阈值,值越小,检测出的圆越多;对于 cv2.HOUGH_GRADIENT_ALT,它表示圆形的"完美性"度量,值越接近1,算法选择的圆形形状越好。

  • minRadius:需要检测的最小圆半径。

  • maxRadius:需要检测的最大圆半径。如果设置为<=0,则使用最大图像尺寸;如果<0,且 method=cv2.HOUGH_GRADIENT时,用来查找圆心而忽略半径的查找,method=cv2.HOUGH_GRADIENT_ALT 不受影响,始终会去找半径。

返回值

  • circles:返回的圆形的点,是一个三维数组。对于 HOUGH_GRADIENTHOUGH_GRADIENT_ALT 两种方法,返回的圆形数组形式有差异。通常,返回的数组中包含了检测到的圆的中心坐标和半径。

注意事项

  • 输入图像的质量对函数的检测效果有很大的影响,通常需要进行适当的预处理,如平滑、边缘检测等。
  • 参数的选择对检测的结果有重要的影响,需要根据具体的应用场景进行调整和优化。
  • 函数返回的圆的信息需要进一步处理和分析,以满足实际应用的需求。

应用场景

  • cv2.HoughCircles 函数在很多领域都有重要的应用,如医学影像分析、工业机器视觉、自动驾驶等。例如,在医学影像分析中,常常需要检测和分析图像中的各种病变和器官,如肿瘤、血管等。使用 cv2.HoughCircles 函数,可以有效地在医学影像中检测出各种形状的病变,为医生的诊断和治疗提供重要的参考依据。

6、参考


更多有趣的代码示例,可参考【Programming】

相关推荐
每次的天空5 分钟前
kotlin中的模块化结构组件
android·开发语言·kotlin
大模型铲屎官5 分钟前
Python桌面应用开发入门:Tkinter+PyQt5实战文件管理器教程
开发语言·人工智能·python·tkinter·pyqt5·桌面应用开发·文件管理器
2301_764441337 分钟前
小说文本分析工具:基于streamlit实现的文本分析
前端·python·信息可视化·数据分析·nlp
栀栀栀栀栀栀10 分钟前
JVM 2015/3/15
java·开发语言·jvm
编程零零七10 分钟前
基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台
python·mysql·信息可视化·flask·python教程·python安装
船长@Quant17 分钟前
tsfresh:时间序列特征自动提取与应用
python·量化策略·sklearn·策略回测·风险控制·tsfresh
尤宸翎34 分钟前
Julia语言的饼图
开发语言·后端·golang
kcarly36 分钟前
使用SetupTools 管理你的项目打包工作
python·setuptools·代码分发
小白学大数据1 小时前
利用Selenium和PhantomJS提升网页内容抓取与分析的效率
爬虫·python·selenium·测试工具
爱分享的淘金达人1 小时前
25年教师资格认定材料及认定详细流程‼
java·python·考研·小程序·tomcat