如何计算图像中一定大小的粒子数?

2024-06-17 12:03:04 发布

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

有没有一个好的基于大小的粒子检测算法?例如,我有下图,我想检测并计算下图中高亮显示的粒子: enter image description here

enter image description here

基本上是根据大小来定的。左边的第三个圆大约是20微米,我要计算所有符合这个阈值的粒子。你知道吗

我该怎么做呢?我要拍一万张照片?你知道吗

谢谢


Tags: 算法粒子阈值照片
2条回答

如果您想自己编写代码,可以从一个简单的阈值开始:_,bin_img= cv2.threshold(img, 33,255,cv2.THRESH_BINARY)。使用from skimage.measure import label可以标记连接的组件。按大小对它们设置阈值会得到所需的结果。你知道吗

正如马克·塞切尔在评论中所说,没有参考图像,我们无法测量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)

这就产生了输出total count is = 3。你知道吗

相关问题 更多 >