基于OpenCV的圆斑检测方法

从一副图像中检测出含有的圆形斑点(类似镂空),斑点内部均匀。检测条件是圆斑与背景有明显的对比度差异。

尝试了三种方法:

      方法一:基于LoG算子的圆斑检测。

这是常用的斑点检测方法,可参考http://doc.okbase.net/ronny/archive/102540.html。

此方法的问题是,图像中不是圆形的斑点也会检测出来,还需要进一步的判断,这使得算法的效率不高。

      方法二:使用opencv自带的SimpleBlobDetector类,同样可参考http://doc.okbase.net/ronny/archive/102540.html

      这种方法可以设置多重筛选条件,能检测出圆斑。它的思路是,使用多个阈值分别对图像进行二值化、检测轮廓,继而根据设置的筛选条件检测出圆斑。       这种方法的缺点是,执行效率低。而且检测出来的圆斑半径不准,不知道为什么。。

    方法三:基于轮廓特征进行检测

      针对方法二多层阈值迭代的缺陷,考虑实时性和当前项目只需要对一种尺寸的圆斑进行检测,所以采取了简化方法二的方法。方法思路是,使用otsu方法计算出阈值,对图像进行二值化。然后检测二值化图像的闭合轮廓,计算每个的弧长和包围面积,继而计算出该轮廓的圆形率,以此判定圆斑。

         注:在调试中发现,二值化图像在使用findContours检测轮廓后,图像本身会发生变化。这个有点奇怪。。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤来获取圆形区域内的亮斑并用圆标记: 1. 使用cv2.HoughCircles函数来检测图像中所有的圆形区域,返回的结果是一个圆心坐标和半径的列表。 2. 对于每一个圆形区域,使用cv2.mean函数来计算该区域的平均亮度值。 3. 对于所有平均亮度值超过阈值的圆形区域,使用cv2.circle函数在图像上画一个圆形,并标记该区域。 下面是一个示例代码,你可以参考一下: ``` import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 设置圆形区域半径和阈值 radius = 50 threshold = 200 # 使用cv2.HoughCircles函数检测圆形区域 circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, dp=1, minDist=radius, param1=50, param2=30, minRadius=0, maxRadius=radius) if circles is not None: # 将圆形区域的坐标和半径转换成整数 circles = np.round(circles[0, :]).astype("int") # 遍历所有圆形区域 for (x, y, r) in circles: # 计算圆形区域的平均亮度值 mean = cv2.mean(img[y-r:y+r, x-r:x+r])[0] # 如果平均亮度值超过阈值,就在图像上画一个圆形 if mean > threshold: cv2.circle(img, (x, y), r, (0, 255, 0), 2) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例代码中,我们读取了一张灰度图像,并使用cv2.HoughCircles函数检测图像中的圆形区域。然后,对于每一个圆形区域,我们计算了该区域的平均亮度值,并根据阈值来判断是否在图像上画一个圆形。最后,我们使用cv2.imshow函数显示图像,并等待按下任意键后关闭窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值