python - 如何用 Opencv Python 计算图像中有多少个白色“球”?
问题描述
我有这张图片,我正在尝试计算有多少个白色“球”
我在下面尝试这段代码并得到这个结果
import cv2
import numpy as np
img = cv2.imread('MASK.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img,(700,700))
img = cv2.subtract(255, img)
detector = cv2.SimpleBlobDetector_create()
# Detect the blobs in the image
keypoints = detector.detect(img)
print(len(keypoints))
imgKeyPoints = cv2.drawKeypoints(img, keypoints, np.array([]), (0,0,255),
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Keypoints", imgKeyPoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
解决方案
一些用于隔离 blob 的预处理变为对它们进行计数会有所帮助。这是一种方法:
- 将图像转换为灰度
- 大津的门槛
- 变形打开以消除噪音
- 查找轮廓和求和 blob
转换为灰度后,我们用Otsu的阈值得到二值图像
接下来,我们使用内核进行变形cv2.MORPH_ELLIPSE
以消除噪音并更好地分离斑点
接下来我们找到轮廓并对斑点求和。请注意,变形关闭并没有“分离”所有连接的斑点,因此我们使用轮廓区域进行过滤。如果 blob 大于某个最小阈值,我们将 blob 计为双而不是单。这是检测到的斑点
结果
斑点:325
import cv2
import numpy as np
image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=5)
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
blobs = 0
for c in cnts:
area = cv2.contourArea(c)
cv2.drawContours(mask, [c], -1, (36,255,12), -1)
if area > 13000:
blobs += 2
else:
blobs += 1
print('blobs:', blobs)
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.imshow('mask', mask)
cv2.waitKey()
推荐阅读
- r - 仅当 R 中的其他列相同时才使用其他行替换缺失值
- python - Tensorflow,神经网络的多个分支与 tf.where
- flutter - 颤振:如何访问/操作gridview的单元格值
- c# - 奇怪的属性行为
- python - 从 api 到 CSV 的字典
- jquery - 使用 laravel 使用 ajax 获取数据时未定义的变量
- python - 为 NetCDF 文件中的部分域赋值
- python - 如何从拥抱脸使用 deberta 模型并使用 .compile() 和 . summary() 用它
- c# - 渐进式 ASP Web 应用程序中的多个 Azure AD B2C 登录屏幕
- openjdk-11 - JFR 活动开始时间