importsysimportpickleimportcv2importmatplotlib.pyplotaspltimportglobimportosimportnumpyasnpimportpandasaspddeffind_circles(image,dp=1.7,minDist=100,param1=50,param2=50,minRadius=0,maxRadius=0):""" finds the center of circular objects in image using hough circle transform
Keyword arguments
image -- uint8: numpy ndarray of a single image (no default).
dp -- Inverse ratio of the accumulator resolution to the image resolution (default 1.7).
minDist -- Minimum distance in pixel distance between the centers of the detected circles (default 100).
param1 -- First method-specific parameter (default = 50).
param2 -- Second method-specific parameter (default = 50).
minRadius -- Minimum circle radius in pixel distance (default = 0).
maxRadius -- Maximum circle radius in pixel distance (default = 0).
Output
center -- tuple: (x,y).
radius -- int : radius.
ERROR if circle is not detected. returns(-1) in this case
"""circles=cv2.HoughCircles(image,cv2.HOUGH_GRADIENT,dp=dp,minDist=minDist,param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)ifcirclesisnotNone:circles=circles.reshape(circles.shape[1],circles.shape[2])return(circles)else:raiseValueError("ERROR!!!!!! circle not detected try tweaking the parameters or the min and max radius")deffind_od(image_path_list):image_path_list.sort()print(len(image_path_list))result_df=pd.DataFrame(columns=["component_name","measured_dia_pixels","center_in_pixels"])fori,nameinenumerate(image_path_list):img=cv2.imread(name,0)# read the image in grayscaleret,thresh_img=cv2.threshold(img,50,255,cv2.THRESH_BINARY_INV)thresh_img=cv2.bilateralFilter(thresh_img,5,91,91)#smoothingedges=cv2.Canny(thresh_img,100,200)circles=find_circles(edges,dp=1.7,minDist=100,param1=50,param2=30,minRadius=685,maxRadius=700)circles=np.squeeze(circles)result_df.loc[i]=os.path.basename(name),circles[2]*2,(circles[0],circles[1])result_df.sort_values("component_name",inplace=True)result_df.reset_index(drop=True,inplace=True)return(result_df)df=find_od(glob.glob("./images/*"))mean_d=df.measured_dia_pixels.mean()std_deviation=np.sqrt(np.mean(np.square([abs(x-mean_d)forxindf.measured_dia_pixels])))mm_per_pixel=0.042print(std_deviation*mm_per_pixel)