为了学习一些新的东西,我一直在尝试OpenCV,我建议自己做的一个项目(如一位朋友所建议的)是在抗生素敏感性测试中确定这些药丸产生的圆圈的直径。一个例子可以在这里找到。在探索如何做到这一点的同时,我发现了CV2的HoughCircles的存在,所以我开始了一段漫长的阅读之旅,同时也只是尝试和错误地尝试着获得某种不错的结果。到现在为止,我想说我对这个函数是如何工作的有一个“不错”的理解,但是,我肯定不知道如何充分利用它。
输入我到目前为止拥有的代码:
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)也可能是魔术数字,我对此并不太满意,我很肯定,当我决定将它应用到不同的抗生素敏感性测试中时,我编写的代码就会消亡(我必须补充一点,我打算这么做)。
编辑:我还决定稍微处理一下图像,并应用以下转换:
im4 = 255.0 * (im/255.0)**2
获取MatPlotLib生成的图形,并通过HoughCircles (具有不同参数)运行该图形:
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2.3, minDis, param1=1250, param2=50, maxRadius=maxR)
这给了我这个结果。然而,更准确的是,除了忽略最左边的药丸之外,还有神奇的数字问题。
因此,它归结为两件事:
如果这些看起来是愚蠢和基本的,我很抱歉,我对这件事很陌生,所以我很感谢你的帮助。
干杯!
发布于 2022-01-10 23:59:39
这个测试示例对于OpenCV开箱即用的算法结果来说是可行的。总有改进的余地。
以下是我所能做的:
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()
为了帮助改进或找到更好的配对关系,我可以想到几个建议:
HoughCircles
函数。目前,您正在传递的是图像的灰度版本,而不是模糊版本。equalizeHist
或CLAHE -它可以帮助边缘检测的图像,当你有低对比度或褪色的边缘。祝您在与生物学相关的OpenCV旅途中好运:)
https://stackoverflow.com/questions/70659992
复制相似问题