用Python中的OpenCV轮廓分析荧光细胞图像

2024-06-17 07:59:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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))

这里是如何处理图像的

enter image description here

以及我的输出:

Total Area:  16.0
Cell Count:  14

Tags: 图像imageimportimgareacv2轮廓细胞
3条回答

您不需要获得轮廓。您只需在Python/OpenCV中计算阈值图像中非零像素(白色像素)的数量。看

area = cv2.countNonZero(thresh)

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

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

cv2.RETR_树告诉算法将事物分组在一起

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

我相信这就是为什么14个细胞的总面积是16.0

您正在灰度图像上绘制轮廓。如果您近距离缩放,您将看到它们正在被绘制。要完全查看它们,您可以选择两个选项:

  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,它应该有绿色的轮廓

相关问题 更多 >