我愿意相信我已经能够计算细胞数了,但我也知道我错过了一些东西。
我有这张图
image = cv2.imread('/cells.png',
cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (1000, 600))
th, threshedImg = cv2.threshold(image, 30, 255,cv2.THRESH_TOZERO_INV)
img_blur = cv2.GaussianBlur(threshedImg, (3,3), 0)
sobelxy = cv2.Sobel(src=img_blur,
ddepth=cv2.CV_64F,
dx=1, dy=1, ksize=5)
edges = cv2.Canny(image=img_blur,
threshold1=20,
threshold2=65)
cv2.imshow('thresh', threshedImg)
cv2.imshow('Canny Edge Detection', edges)
cv2.waitKey(0)
边缘输出:
阈值输出:
据我所知,阈值图像很好地捕获了细胞,并且 Canny 在获取边缘方面做得非常好。我尝试过使用轮廓,但无法产生任何好的结果。
任何有关如何改进的帮助或想法将不胜感激。谢谢!
我数了一下,有 286 个斑点。这取决于一些可调整的因素,因为一些可以单独计数的斑点实际上非常接近。
方法:
您的输入在右下角有一些灰色背景。为了补偿,我使用较大的中值模糊(内核大小约为 100)来估计背景,然后减去该值(饱和数学)。
接下来,我对整个事物进行模糊处理,以充分抑制噪声,使每个斑点都平滑(只有一个局部最大值,没有驼峰或更糟)
然后我使用
image == cv.dilate(image, iterations=15)
来计算 局部极值的掩码。
然后我将其与 peaks 的掩模结合起来,这就是
image > threshold
。
我
&
(和)两个面具在一起。
形态学关闭/扩张操作,用于合并由于数字而出现的一些峰值(任何平滑度不够平滑以至于扩张和等式只能看到一个峰值的情况)
然后我使用
connectedComponentsWithStats
找到所有这些斑点及其质心。
我对其他方法的看法: