OpenCV blob detector isn't detecting white blobs
Asked Answered
R

1

6

I'm trying to count the number of white dots after thresholding but my code doesn't seem to be detecting anything

Input image

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)

My output is as follows

enter image description here

Roaring answered 11/7, 2019 at 18:44 Comment(1)
parameters.minArea = 1500 is too bigStalag
S
4

image here

Instead of using blob detector, here's a potentially better approach

  • Convert to grayscale and median blur to smooth image
  • Threshold image
  • Find contours
  • Iterate through contours and filter using contour area

You can filter using a minimum threshold area to count the number of white dots. By decreasing the threshold area, you can include the smaller dots. Increasing the area isolates only the larger white blobs. If the contour passes this filter, you can add it to a list of white dots

Number of white dots

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()
Salamone answered 11/7, 2019 at 20:49 Comment(2)
What is the function of cnts = cnts[0] if len(cnts) == 2 else cnts[1]?Roaring
Thanks. You've saved me.Roaring

© 2022 - 2024 — McMap. All rights reserved.