Может помочь некоторая предварительная обработка, чтобы выделить капли, считая их.Вот подход:
- Преобразование изображения в оттенки серого
- Порог Оцу
- Морфинг, открытый для удаления шума
- Поиск контуров и сумм сгустков
После преобразования в оттенки серого мы используем порог Оцу, чтобы получить двоичное изображение
Затем мы преобразуем ядро cv2.MORPH_ELLIPSE
для удаления шума.и лучше разбить капли
Далее мы найдем контуры и суммируем капли.Обратите внимание, что закрытие морфа не «отсоединило» все связанные капли, поэтому мы фильтруем, используя область контура.Если BLOB-объект больше минимального порогового значения, мы считаем двоичный объект двойным, а не единичным.Вот обнаруженные 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()