python-圆形检测-封闭轮廓检测

圆形检测

通过python做圆形检测,基本都是一个套路,利用霍夫检测的思路,借用cv包的HoughCircles进行检测,这里要注意该函数的参数,不同的参数应对不同的业务场景,参数说明如下表
在这里插入图片描述
我经常修改的参数为minDist,param2,minRadius,maxRadius。一定不要犯懒,都挨个去理解,去试。
贴上我的代码和业务数据:代码也是我在别的地方抄的,随便百度就能找到
在这里插入图片描述

import cv2

img = cv2.imread('O:/work/circleimg/1009/yuan4.png')
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

th2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, \
                            cv2.THRESH_BINARY, 11, 2)

ret, thresh1 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)

canny = cv2.Canny(thresh1, 40, 80)

canny = cv2.blur(canny, (3, 3))

# 霍夫变换圆检测
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 1000, param1=10, param2=35, minRadius=40, maxRadius=150)
# 输出检测到圆的个数
print(len(circles[0]))

for circle in circles[0]:
    if (circle[2] >= 100):
        continue
    x = int(circle[0])
    y = int(circle[1])
    r = int(circle[2])
    img = cv2.circle(img, (x, y), r, (0, 0, 255), -1)
cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

闭合轮廓检测

因为业务场景要求不一定是圆形可以当作圆,闭合的曲线也可以作为圆,所以就探索了新的思路。这里我贴一个链接,应该能给你一些启发思路
我的思路来源于对cv.findContours函数的参数和返回值的发现。

  1. 该函数的第个参数(轮廓的检索方式)可选很多,参数说明,因为考虑到实际的场景,封闭的圆一定在轮廓上存在层级关系的,所以我这里选择了cv.RETR_TREE,这样该函数的第二个返回值hierarchy就会保存层级关系,层级关系解释
  2. 通过层级关系以及轮廓数量,就可以筛选掉很多图片了,但是也有特例,就是数字6和9通过图片可以看到,这两张图片和封闭的轮廓一毛一样,而且层级关系也是相同的,于是通过第三参数(轮廓的近似办法)cv.CHAIN_APPROX_SIMPLE参数说明cv.findContours函数的第一个返回值进行判断。我判断的依据是:如果是曲线是闭合轮廓且没有其他的分支(反例,6和9),那么拟合该曲线的内外轮廓的坐标数差值相比于其他的曲线是更小的。经过实际证明确实是这样,不同的业务有不同的思路。上代码:
import cv2 as cv
import os
import numpy as np
# 定义圆形轮廓层级结构
x = [[[-1, -1, 1,-1], [-1, -1, 2,0], [-1, -1, -1,1]]]
x = np.array(x)
def circle(j):
    src = cv.imread('O:/work/circleimg/1009/'+str(j))
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    _, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
    contours, hierarchy = cv.findContours(gray, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    # 轮廓数量为3 且符合x标准
    print(j)
    if len(contours)==3 and (hierarchy == x).all():
        if abs(len(contours[1])-len(contours[2]))<40:
            print("有缘")
        else:
            print("无缘")
    else:
        print("无缘")
    cv.drawContours(src,contours,-1,(0,0,255),2)
    cv.imshow("edged", src)
    cv.waitKey(0)
    cv.destroyAllWindows()

for i in os.listdir('O:/work/circleimg/1009/'):
    circle(i)

简要说明:

  • 变量x是我的数据图像取得固定圆形封闭轮廓层级关系,你的可能有所不同需要调试一番
  • 图像预处理也需要注意,如果有需要可进行7x7的中值滤波
#最后欢迎邮箱讨论:zhangmaoker@163.com
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用OpenCV进行轮廓检测、斑点检测圆形检测可以使用以下代码: 首先,导入必要的库和读取图像: ```python import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 接下来,使用阈值处理将图像转换为二进制图像: ```python ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) ``` 接着,使用形态学操作去除噪点: ```python kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2) ``` 对于轮廓检测,可以使用`cv2.findContours()`函数: ```python contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) ``` 对于斑点检测圆形检测,可以使用`cv2.HoughCircles()`函数: ```python circles = cv2.HoughCircles(opening,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) ``` 最后,可以将检测结果可视化: ```python cv2.drawContours(img, contours, -1, (0,0,255), 2) for i in circles[0,:]: cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 完整代码如下: ```python import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2) contours, hierarchy = cv2.findContours(opening,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) circles = cv2.HoughCircles(opening,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) cv2.drawContours(img, contours, -1, (0,0,255), 2) for i in circles[0,:]: cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2) cv2.imshow('image',img) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值