首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高CV2型HoughCircles的精度

如何提高CV2型HoughCircles的精度
EN

Stack Overflow用户
提问于 2022-01-10 23:23:53
回答 1查看 630关注 0票数 1

为了学习一些新的东西,我一直在尝试OpenCV,我建议自己做的一个项目(如一位朋友所建议的)是在抗生素敏感性测试中确定这些药丸产生的圆圈的直径。一个例子可以在这里找到。在探索如何做到这一点的同时,我发现了CV2的HoughCircles的存在,所以我开始了一段漫长的阅读之旅,同时也只是尝试和错误地尝试着获得某种不错的结果。到现在为止,我想说我对这个函数是如何工作的有一个“不错”的理解,但是,我肯定不知道如何充分利用它。

输入我到目前为止拥有的代码:

代码语言:javascript
运行
复制
import numpy
import cv2

image = cv2.imread("antibiograma.png")
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.blur(gray, (20,30), cv2.BORDER_DEFAULT)
height, width = blur.shape[:2]

minR = round(width/65)
maxR = round(width/11)
minDis = round(width/7)

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.3, minDis, param1=23, param2=72, minRadius=minR, maxRadius=maxR)

if circles is not None:
    circles = numpy.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(output, (x, y), r, (0, 255, 0), 2)
        cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.imshow("result", numpy.hstack([image, output]))
cv2.waitKey()

其中大部分是从我查到的一些资源中复制出来的,当时我正试图将它的工作方式包装在脑中,大多数参数都经过修改,以便更好地适应我正在处理的图像。

结果是..。不太好。它似乎标志着圆圈的大致位置,但不太准确。大多数圆圈都有一些令人讨厌的偏移,比它们应该的要大一些,尤其是其中一个(最左边的)几乎是完全错误的。更不用说其中的一些数字(特别是dp和param2)也可能是魔术数字,我对此并不太满意,我很肯定,当我决定将它应用到不同的抗生素敏感性测试中时,我编写的代码就会消亡(我必须补充一点,我打算这么做)。

编辑:我还决定稍微处理一下图像,并应用以下转换:

代码语言:javascript
运行
复制
im4 = 255.0 * (im/255.0)**2

获取MatPlotLib生成的图形,并通过HoughCircles (具有不同参数)运行该图形:

代码语言:javascript
运行
复制
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2.3, minDis, param1=1250, param2=50, maxRadius=maxR)

这给了我这个结果。然而,更准确的是,除了忽略最左边的药丸之外,还有神奇的数字问题。

因此,它归结为两件事:

  1. 如何才能更好地提高函数的精度?
  2. 如何确定一组将适用于多个图像的参数?

如果这些看起来是愚蠢和基本的,我很抱歉,我对这件事很陌生,所以我很感谢你的帮助。

干杯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-10 23:59:39

这个测试示例对于OpenCV开箱即用的算法结果来说是可行的。总有改进的余地。

以下是我所能做的:

代码语言:javascript
运行
复制
import numpy
import cv2

image = cv2.imread("bact.png")
output = image.copy()

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

hist = cv2.equalizeHist(gray)

blur = cv2.GaussianBlur(hist, (31,31), cv2.BORDER_DEFAULT)
height, width = blur.shape[:2]

minR = round(width/65)
maxR = round(width/11)
minDis = round(width/7)

circles = cv2.HoughCircles(blur, cv2.HOUGH_GRADIENT, 1, minDis, param1=14, param2=25, minRadius=minR, maxRadius=maxR)

if circles is not None:
    circles = numpy.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv2.circle(output, (x, y), r, (0, 255, 0), 2)
        cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.imshow("result", numpy.hstack([image, output]))
cv2.waitKey()

为了帮助改进或找到更好的配对关系,我可以想到几个建议:

  1. 将模糊图像传递给HoughCircles函数。目前,您正在传递的是图像的灰度版本,而不是模糊版本。
  2. 模糊的大小和类型。模糊图像可以帮助下游算法。。对于内核,大小也趋向于相同的形状,例如(20,20),使用(20,30)可能会给出不同的结果。
  3. 考虑对比校正equalizeHist或CLAHE -它可以帮助边缘检测的图像,当你有低对比度或褪色的边缘。
  4. 神奇的数字。根据医生的说法,param2可以更大的去除假阳性,所以用它来做实验。至于param1和dp,您可能需要改变一些组合,看看什么是最好的。如果你要把多个图像集和不同的照明条件进行比较,你可能得先考虑将图像标准化。魔术数字似乎是没有开箱即用的算法的一部分,所以最好的方法是改变输入,同时输出图像,看什么工作,然后微调。

祝您在与生物学相关的OpenCV旅途中好运:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70659992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档