2024-06-17 12:03:04 发布
网友
有没有一个好的基于大小的粒子检测算法?例如,我有下图,我想检测并计算下图中高亮显示的粒子:
基本上是根据大小来定的。左边的第三个圆大约是20微米,我要计算所有符合这个阈值的粒子。你知道吗
我该怎么做呢?我要拍一万张照片?你知道吗
谢谢
如果您想自己编写代码,可以从一个简单的阈值开始:_,bin_img= cv2.threshold(img, 33,255,cv2.THRESH_BINARY)。使用from skimage.measure import label可以标记连接的组件。按大小对它们设置阈值会得到所需的结果。你知道吗
_,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)
在油漆中裁剪后
现在,它的面积可以作为其他人的参考。现在重新读取原始图像和提取的恒星图像,并为后一图像计算最大轮廓的面积。在对原始图像进行阈值化处理后,计算出原始图像的轮廓线,并进行循环。根据参考区域进行测量。(我已将获得的面积减半。在确定最佳值之前,您可能还需要在其他图像之后对此进行参数调整。)满足给定条件的任何轮廓都将绘制在使用np.ones创建的结果白色图像上,并且与原始图像具有相同的大小,并且计数器变量将递增。cv2.bitwise_and仅用于获取接受的轮廓,并显示总计数。你知道吗
np.ones
cv2.bitwise_and
源代码-:
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。你知道吗
total count is = 3
如果您想自己编写代码,可以从一个简单的阈值开始:
_,bin_img= cv2.threshold(img, 33,255,cv2.THRESH_BINARY)
。使用from skimage.measure import label
可以标记连接的组件。按大小对它们设置阈值会得到所需的结果。你知道吗正如马克·塞切尔在评论中所说,没有参考图像,我们无法测量20微米。然而,你已经说过,我们可以采取第三个轮廓作为参考,所以我有所有的裁剪后,首先阈值图像使用
在油漆中裁剪后
现在,它的面积可以作为其他人的参考。现在重新读取原始图像和提取的恒星图像,并为后一图像计算最大轮廓的面积。在对原始图像进行阈值化处理后,计算出原始图像的轮廓线,并进行循环。根据参考区域进行测量。(我已将获得的面积减半。在确定最佳值之前,您可能还需要在其他图像之后对此进行参数调整。)满足给定条件的任何轮廓都将绘制在使用
np.ones
创建的结果白色图像上,并且与原始图像具有相同的大小,并且计数器变量将递增。cv2.bitwise_and
仅用于获取接受的轮廓,并显示总计数。你知道吗源代码-:
这就产生了输出
total count is = 3
。你知道吗相关问题 更多 >
编程相关推荐