I'm trying to count the number of white dots after thresholding but my code doesn't seem to be detecting anything
Input image
#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
Instead of using blob detector, here's a potentially better approach
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With