【问题标题】:Using OpenCV Contours in Python to Analyze fluorescent cell image在 Python 中使用 OpenCV 轮廓分析荧光细胞图像
【发布时间】:2020-07-03 20:07:03
【问题描述】:

我正在尝试使用 OpenCV 中的 Contours 来计数荧光细胞并计算总荧光面积。在探索了 Scikit Image 中的选项并尝试了 blob 检测之后,这似乎是我的图像类型最简单的方法。不幸的是,我似乎无法在细胞周围绘制轮廓。知道我做错了什么吗?

import cv2
import numpy as np

#import image
image = cv2.imread('Microcystis1.png')
cv2.imshow('image',image)
cv2.waitKey(0)

#Convert image to Grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('grayscale',gray)
cv2.waitKey(0)

#Threshold Binary
ret,thresh1 = cv2.threshold(gray,45,255,cv2.THRESH_BINARY)
cv2.imshow('binary',thresh1)
cv2.waitKey(0)

#Detect contours
contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

#Draw contours
img = cv2.drawContours(thresh1, contours, -1, (0,255,0), 3)
cv2.imshow('contours',img)
cv2.waitKey(0)

#Analyze and Report Contours
cnt = contours[0]
area = cv2.contourArea(cnt)
print("Total Area: ", area)
print("Cell Count: ", len(cnt))

这是处理图像的方式...

我的输出:

Total Area:  16.0
Cell Count:  14

【问题讨论】:

    标签: python opencv image-processing contour


    【解决方案1】:

    您不需要获取轮廓。您可以在 Python/OpenCV 中简单地计算阈值图像中非零像素(白色像素)的数量。见

    area = cv2.countNonZero(thresh)
    

    https://docs.opencv.org/4.1.1/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914

    【讨论】:

      【解决方案2】:

      您正在灰度图像上绘制轮廓。如果您仔细放大,您会看到它们正在被绘制。要完整查看它们,您可以使用两个选项:

      1. 如果您只想按照问题所示在thresh1 上绘制它们,请将颜色从(0, 255, 0) 更改为(255、255、255)。这将确保轮廓为白色。
      2. 如果您希望它们具有其他颜色,例如使用 (0, 255, 0) 获得的绿色,那么您可以创建一个 NumPy 零数组并在其上绘制轮廓。
      h, w = thresh1.shape
      img = np.zeros((w, h), dtype=np.uint8)
      cv2.drawContours(img, contours, -1, (0,255,0), 3)
      

      现在显示img,它应该有绿色轮廓。

      【讨论】:

      • 谢谢。改变颜色有帮助,但它低估了我的细胞数量和面积(与以前的输出相同)。看起来使用 img 数组的长度可以让我计数,但我也可以用它来计算面积吗?
      • 有一个函数叫做cv2.contourArea。我想你可以通过它找出所有轮廓的面积并总结出来。
      • 另一个我可以建议的是,要获得确切的区域,不需要使用轮廓。由于您已经对灰度图像中的所有粒子进行了阈值处理,因此您可以简单地找出数组 thresh1 的总和并将其除以 255。这将起作用,因为您的粒子的值为 255,而背景的值为 0 . 但是,这不会只计算面积。
      【解决方案3】:

      为了找到轮廓的总数及其各自的区域,您需要获取轮廓的平面列表,而不是分层列表:https://docs.opencv.org/4.3.0/d3/dc0/group__imgproc__shape.html#ga819779b9857cc2f8601e6526a3a5bc71

      cv2.RETR_TREE 告诉算法将事物组合在一起。

      cv2.RETR_LIST 告诉 aglo 给你一个包含所有单个点的平面列表。

      我相信这就是为什么您看到 14 个单元的总面积为 16.0。

      【讨论】:

        猜你喜欢
        • 2011-07-30
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 2023-03-24
        • 2019-02-12
        • 2021-12-23
        相关资源
        最近更新 更多