gpt4 book ai didi

python - 如何统计图像中特定尺寸的粒子数量?

转载 作者:行者123 更新时间:2023-11-30 21:54:18 25 4
gpt4 key购买 nike

有没有一种好的算法可以根据大小检测颗粒?例如,我有以下图像,我想检测并计算下图中突出显示的粒子: enter image description here

enter image description here

这基本上是基于大小。左边第三个圆圈大约是 20 微米,我想计算所有满足该阈值的粒子。

我怎样才能做到这一点?我需要对 10,000 张图像执行此操作?

谢谢

最佳答案

正如 Mark Setchell 的评论中所述,如果没有引用图像,我们无法测量 20 微米。但是,您已经说过我们可以将第三个轮廓作为引用,因此我首先使用

对图像进行阈值处理后将其裁剪掉
import cv2

img = cv2.imread('stars.png', 0)
ret, img = cv2.threshold(img,100,255,cv2.THRESH_BINARY)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('star.png', img)

在油漆中裁剪后

star extracted

现在,它的面积可以为其他人提供引用。现在再次读取原始图像和提取的星图像,并计算后一个图像的最大轮廓面积。然后在对原始图像进行阈值处理后计算其轮廓并将其循环。它们是根据引用面积进行测量的。 (我取了获得的面积的一半。在决定最佳值之前,您可能还必须在其他图像之后执行参数调整。)满足给定条件的任何轮廓都绘制在使用以下命令创建的结果白色图像上np.ones 与原始图像具有相同的大小,并且计数器变量会递增。 cv2.bitwise_and 用于仅获取接受的轮廓并显示总数。

image after thresholding

Final result

源代码-:

import cv2
import numpy as np

img = cv2.imread('stars.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
match = cv2.imread('star.png', 0)
h, w = img.shape[:2]
res = np.ones((h, w), np.uint8)*255
ret, thresh = cv2.threshold(gray,64,255,cv2.THRESH_BINARY)
_, cnts, _ = cv2.findContours(match, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = max(cnts, key = cv2.contourArea)
area = cv2.contourArea(cnt)
_, cnts, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
count = 0
for cnt in cnts:
if cv2.contourArea(cnt)>=area/2:
cv2.drawContours(res, cnt, -1, 0, 2)
count += 1
res = cv2.bitwise_and(img, img, mask = cv2.bitwise_not(res))
cv2.imshow("res", res)
cv2.imshow("star", match)
cv2.imshow("image", img)
cv2.imshow("result", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
print("total count is =", count)

这给出了输出总计数= 3

关于python - 如何统计图像中特定尺寸的粒子数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com