因为细胞的可见度似乎与细胞核不同(深紫色)
背景(浅粉色),颜色阈值应该在这里工作。这个主意
是将图像转换为HSV格式,然后使用上下颜色
隔离细胞的阈值。这将给我们一个二进制掩码,我们可以
用于计算单元格数。
我们首先将图像转换为HSV格式,然后使用上/下颜色
创建二进制掩码的阈值。从这里我们表演形态学
平滑图像和去除少量噪声的操作。
现在我们有了遮罩,我们找到了带有“cv2.RETRu”的轮廓`
参数,以确保我们只采取外轮廓。我们定义了几个
过滤单元格的区域阈值
minimum_area = 200average_cell_area = 650connected_cell_area = 1000
“最小面积”阈值确保我们不计算
牢房。由于某些单元格是连接的,因此某些轮廓可能有多个
将连接的单元表示为单个轮廓,以便估计单元
更好的方法是,我们定义一个“averageu cellu area”参数来估计
一间牢房。“connectedu cellu area”参数检测连接的单元格
在哪里使用
数学.ceil()在连通单元轮廓上估计
轮廓上的细胞。为了计算单元格的数量,我们遍历
等高线,并根据它们的面积求出等高线。这是检测到的
以绿色突出显示的单元格
Cells: 75
Code
import cv2import numpy as npimport mathimage = cv2.imread("1.jpg")original = image.copy()hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)hsv_lower = np.array([156,60,0])hsv_upper = np.array([179,115,255])mask = cv2.inRange(hsv, hsv_lower, hsv_upper)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations=2)cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]minimum_area = 200average_cell_area = 650connected_cell_area = 1000cells = 0for c in cnts: area = cv2.contourArea(c) if area > minimum_area: cv2.drawContours(original, [c], -1, (36,255,12), 2) if area > connected_cell_area: cells += math.ceil(area / average_cell_area) else: cells += 1print('Cells: {}'.format(cells))cv2.imshow('close', close)cv2.imshow('original', original)cv2.waitKey()


