Visualizing edge image and accumulator in Hough Circle Transform

Hello,
I am using the Hough Circle Transform to detected circles in images (see script below). I would like to display the corresponding edge images and the accumulator matrix. How can I do that?

import sys
import cv2 as cv
import numpy as np
import pdb
import matplotlib.pyplot as plt
import re


def main(argv):
    
    default_file = 'image.png'
    filename = argv[0] if len(argv) > 0 else default_file
    
    # Loads an image:
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    # Print the dimensions of the images:
    dimensions = src.shape
    print('Image dimensions:', dimensions, 'pixel')

    # Check if image is loaded fine:
    if src is None:
        print ('Error opening image!')
        print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1
    
    # Convert image to grayscale:
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

    # Delete original image to free memory:
    del src
    
    # Apply a median blur to reduce noise and avoid false circle detection:
    gray = cv.medianBlur(gray, 7)

    # Save the image with circles (original dimensions):
    cv.imwrite('smoothed_'+argv[0], gray) 

    # Apply the Hough Circle detection method:
    r_min = 30
    r_max = 40
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 100,
                               param1=500, param2=30,
                               minRadius=r_min, maxRadius=r_max)

    # Print the number of found circles:
    print('Number of detected circles:', circles.shape[1])

    # Delete smoothed image to free memory:
    del gray
    
    # Reload the image:
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)
    
    # Define array to store the radius info (for histogram plot):
    arr_radii = np.array([])
    
    # Retrieve the coordinates of all found circles:
    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            #print(i)
            center = (i[0], i[1])
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)
            arr_radii = np.append(arr_radii, i[2]) # Already converted into int type.
    arr_radii=arr_radii.astype(int)

    # Save the image with circles (original dimensions):
    cv.imwrite('DetectedCircles_'+argv[0], src) 
    
    # Plot radius histogram:
    bin = np.arange(r_min-0.5, r_max+0.5, 1.0)
    _,_,arr = plt.hist(arr_radii, bins=bin, facecolor='b', alpha=0.75)

    for pp in arr:
       x = (pp._x0 + pp._x1)/2-0.1
       y = pp._y1 + 1
       if pp._y1 != 0:
          plt.text(x, y, int(pp._y1))
    
    plt.xlim(r_min, r_max)
    plt.xlabel('Radius')
    plt.ylabel('Counts')
    plt.title('Histogram of radius distribution')
    plt.savefig("Rad_histo_"+re.sub('\.tif$', '',argv[0])+".png")
    plt.show()

    return 0
if __name__ == "__main__":
    main(sys.argv[1:])

Hello,

In order to see the edge image, I simply call the cv.Canny function with the same parameters I pass to the cv.HoughCircles (the lower threshold is higher_threshold/2):

edges = cv.Canny(my_image, 50, 100)
cv.imwrite('Edges_my_image', edges) #save image into file

For what the accumulator matrix is concerned, someone has any hints on how to visualize it?

unfortunately, you cannot access the accumulator matrix, its hidden in the implementation.

at least from c++, you can get the votes for the returned circles:

see docs

circles Output vector of found circles. Each vector is encoded as 3 or 4 element floating-point vector (x,y,radius) or (x,y,radius,votes) .

in c++, you’d use a vector<Vec4f> to get the votes, but no idea how to do this from python, sorry.