Cropping Circle with Hough Transform using OpenCV Python

2.3k views Asked by At

I want to crop circle from iris image in following below:

Example of iris image detection using hough circle

and this is my code for circle detection:

from matplotlib import pyplot as plt
import numpy as np
import cv2

gambar = cv2.imread('tes2.jpg',0)
cimg = cv2.cvtColor(gambar,cv2.COLOR_GRAY2BGR)
canny = cv2.Canny(cimg,50,50)

circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,10000,
                    param1=50,param2=30,minRadius=50,maxRadius=200)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[2]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[2]),2,(0,0,255),3)

plt.imshow(cimg,cmap = 'gray')
plt.show()

but, I don't know how to crop this circle (iris localization). I have been following this code reference Cropping circle from the image using OpenCV python. And this is my code below for crop image:

from matplotlib import pyplot as plt
import numpy as np
import cv2

gambar1 =cv2.imread('tes2.jpg') 
gambar = cv2.imread('tes2.jpg',0)
cimg = cv2.cvtColor(gambar,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(cimg, 50, 255, cv2.THRESH_BINARY)

# Create mask
height,width = gambar.shape
mask = np.zeros((height,width), np.uint8)

canny = cv2.Canny(thresh,100,200)


gray = cv2.cvtColor(gambar,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,10000,
                    param1=50,param2=30,minRadius=0,maxRadius=0)


for i in circles[0,:]:
    cv2.circle(mask,(i[0],i[1]),i[2],(255,255,255),thickness=-1)

masked_data = cv2.bitwise_and(gambar1, gambar1, mask=mask)

# Apply Threshold
_,thresh = cv2.threshold(mask,1,255,cv2.THRESH_BINARY)

# Find Contour
contours = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
x,y,w,h = cv2.boundingRect(contours[0])

# Crop masked_data
crop = masked_data[y:y+h,x:x+w]

plt.imshow(gambar1,cmap = 'gray')
plt.imshow(crop, cmap='gray')
plt.show()

but, when I try this code such as reference above, I get an error like this:

File "C:/Users/zurri/spyder/masktes.py", line 14, in <module>
cimg = cv2.cvtColor(gambar,cv2.COLOR_BGR2GRAY)
error: OpenCV(4.2.0) c:\projects\opencv-python\opencv\modules\imgproc\src\color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<3,4,-1>,struct cv::impl::A0xe227985e::Set<1,-1,-1>,struct cv::impl::A0xe227985e::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
Invalid number of channels in input image:
     'VScn::contains(scn)'
 where
     'scn' is 1

anyone can help me to fix this problem? I just want to crop this circle (iris localization) using openCV python, thank you

1

There are 1 answers

2
Ahx On BEST ANSWER

Explanation


findContours method retrieves the contours from the given binary image using Suzuki's algorithm. Contours are useful for shape analysis, object detection and recognition.

The findContour method returns two variables: contours and hierarchy. In the original code you did contours = cv2.findContour(...) in which you combines both contours and hierarchy variables. Therefore you had an error. We simply don't need hieararchy variable, therefore we placed _. So the error was resolved.

Solution


Replace the findContours line with the below:

contours, _ = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

Result:

enter image description here