'Detect very small circle and get their information (Opencv)

I am trying to detect each small circle (it is the bead part of the radial tires from the cross-sectional image)located as shown in the image and get their information(optional). To improve the detection process I have performed a few image processing steps including median blurring and binary thresholding (the general binary thresholding and inverse binary thresholding). I am using HoughCicle transform to detect the circles however I stucked and couldn't be able to detect it yet.

Please, any suggestions? Thank you very much.

This is the original image

Cropped image (it is the area where the circle I want to detect appear)

This is the binary image output and cropped it to remove the unnecessary part

As such, I'm trying to detect each circle from the binary image shown in the image below like marked in red. Final preprocessed image

I used the following code

import cv2
import numpy as np
import os
import matplotlib.pyplot as plt

############# preprocessing ##################


img = cv2.imread('BD-2021.png')
median_5 = cv2.medianBlur(img, 5)  # median filtering 
image_masked = cv2.cvtColor(median_5, cv2.COLOR_BGR2GRAY)   # converting to grayscael
res,thresh_img=cv2.threshold(image_masked,230,255,cv2.THRESH_BINARY_INV)  # inverse binary 
# res,thresh_img_b=cv2.threshold(image_masked,200,255,cv2.THRESH_BINARY)   # global binary 

height, width = thresh_img.shape
img_crop = thresh_img[int(0.7*height):height,:width] 

# reverse_thresh = cv2.cvtColor(thresh_img,cv2.COLOR_GRAY2BGR)

############# Hough circle detection ##################

c = cv2.HoughCircles(img_crop, cv2.HOUGH_GRADIENT,
                     minDist=2, dp=1, param1=70, 
                      param2=12, minRadius=0,maxRadius=5)
c = np.uint16(np.around(c))

for i in c[0,:]:
    # draw the outer circle
    cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
#     cv2.circle(reverse_thresh,(i[0],i[1]),i[2],(0,255,0),2)

    # draw the center of the circle
    cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
#     cv2.circle(reverse_thresh,(i[0],i[1]),2,(0,0,255),3)



cv2.imshow('circle detected',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

I would appreciate for any recommendation ? Thank you once again.



Solution 1:[1]

I would recommend using the Blob Detection Algorithm. This algorithm is the first part of the SIFT descriptor and is fairly easy to implement. The blob detection algorithm involves finding blobs in the picture using the Laplacian of Gaussian convolution (LoG) which can be approximated as a difference of gaussians. A good explanation on the scale space and how to implement the blob detection is given here.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tomer Geva