使用 OpenCV 计数细胞

问题描述 投票:0回答:1

我愿意相信我已经能够计算细胞数了,但我也知道我错过了一些东西。

我有这张图

Original image with cells

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)

边缘输出:

Image of edges.

阈值输出:

Image after threshold

据我所知,阈值图像很好地捕获了细胞,并且 Canny 在获取边缘方面做得非常好。我尝试过使用轮廓,但无法产生任何好的结果。

任何有关如何改进的帮助或想法将不胜感激。谢谢!

python opencv computer-vision
1个回答
4
投票

我数了一下,有 286 个斑点。这取决于一些可调整的因素,因为一些可以单独计数的斑点实际上非常接近。

result

方法:

  • 您的输入在右下角有一些灰色背景。为了补偿,我使用较大的中值模糊(内核大小约为 100)来估计背景,然后减去该值(饱和数学)。

  • 接下来,我对整个事物进行模糊处理,以充分抑制噪声,使每个斑点都平滑(只有一个局部最大值,没有驼峰或更糟)

  • 然后我使用

    image == cv.dilate(image, iterations=15)
    来计算 局部极值的掩码。

  • 然后我将其与 peaks 的掩模结合起来,这就是

    image > threshold

  • &
    (和)两个面具在一起。

  • 形态学关闭/扩张操作,用于合并由于数字而出现的一些峰值(任何平滑度不够平滑以至于扩张和等式只能看到一个峰值的情况)

  • 然后我使用

    connectedComponentsWithStats
    找到所有这些斑点及其质心。

我对其他方法的看法:

  • 精明,完全没有任何意义。会让你陷入更糟糕的境地。
  • 颜色空间转换...毫无意义,因为您的输入基本上是单色的,我也这样对待它。
© www.soinside.com 2019 - 2024. All rights reserved.