简体   繁体   English

使用 OpenCV Python 进行霍夫变换的裁剪圆

[英]Cropping Circle with Hough Transform using OpenCV Python

I want to crop circle from iris image in following below:我想从下面的虹膜图像中裁剪圆圈:

使用霍夫圆的虹膜图像检测示例

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 .我一直在使用 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我只想使用openCV python裁剪这个圆圈(虹膜定位),谢谢

Explanation解释


findContours method retrieves the contours from the given binary image using Suzuki's algorithm. findContours方法使用Suzuki算法从给定的二进制图像中检索轮廓。 Contours are useful for shape analysis, object detection and recognition.轮廓可用于形状分析、对象检测和识别。

The findContour method returns two variables: contours and hierarchy . findContour方法返回两个变量: contourshierarchy In the original code you did contours = cv2.findContour(...) in which you combines both contours and hierarchy variables.在原始代码中,您执行了contours = cv2.findContour(...)在其中组合了contourshierarchy变量。 Therefore you had an error.因此你有一个错误。 We simply don't need hieararchy variable, therefore we placed _ .我们根本不需要hieararchy变量,因此我们放置了_ So the error was resolved.于是错误就解决了。

Solution解决方案


Replace the findContours line with the below:findContours行替换为以下内容:

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

Result:结果:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM