Детектор капель OpenCV не обнаруживает белые капли - PullRequest
5 голосов
/ 11 июля 2019

Я пытаюсь подсчитать количество белых точек после определения порога, но мой код, похоже, ничего не обнаруживает

Входное изображение

enter image description here

#Standard imports
#!/usr/bin/python

# Standard imports
import cv2
import numpy as np;

# Read and threshold image
im = cv2.imread("CopperSEM.tif", cv2.IMREAD_GRAYSCALE)
ret2, LocalTH1 = cv2.threshold(im,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #Without Filtering

# Set up the detector with default parameters.
parameters = cv2.SimpleBlobDetector_Params()

#change Colors to White
parameters.filterByColor = True
parameters.blobColor = 255
parameters.filterByArea = True
parameters.minArea = 1500
parameters.filterByCircularity = True
parameters.minCircularity = 0.1
parameters.filterByConvexity = True
parameters.minConvexity = 0.87


#reset the detector
detector = cv2.SimpleBlobDetector_create(parameters)

# Detect blobs.
keypoints = detector.detect(LocalTH1)
print(len(keypoints)) #will print out the number of objects that were found since keypoints is a list?
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob
im_with_keypoints = cv2.drawKeypoints(LocalTH1, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# Show keypoints
cv2.imshow("Keypoints", im_with_keypoints)
cv2.waitKey(0)

Мой вывод выглядит следующим образом

enter image description here

1 Ответ

2 голосов
/ 11 июля 2019

image here

Вместо того, чтобы использовать детектор капли, вот потенциально лучший подход

  • Преобразование в оттенки серого и медианное размытие для сглаживания изображения
  • Пороговое изображение
  • Поиск контуров
  • Итерация по контурам и фильтрация с использованием области контура

Вы можете фильтровать, используя минимальную область порога для подсчета количества белыхточек.Уменьшая область порога, вы можете включить меньшие точки.Увеличение площади изолирует только большие белые пятна.Если контур проходит этот фильтр, вы можете добавить его в список белых точек

Количество белых точек

91

import cv2

image = cv2.imread('1.png')

blur = cv2.medianBlur(image, 5)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,180,255, cv2.THRESH_BINARY)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 50
white_dots = []
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area:
        cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
        white_dots.append(c)

print(len(white_dots))
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()
...