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:])