使用OpenCV Python使用Hough变换裁剪圆

问题描述

我想从下面的虹膜图像中裁剪出圆圈:

Example of iris image detection using hough circle

这是我的圈子检测代码

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,2,255),3)

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

但是,我不知道如何裁剪该圆圈(虹膜局部化)。我一直在关注此代码参考Cropping circle from the image using OpenCV python。这是我下面的裁剪图像代码

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

gambar1 =cv2.imread('tes2.jpg') 
gambar = cv2.imread('tes2.jpg',cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(cimg,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,minRadius=0,maxRadius=0)


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

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

# Apply Threshold
_,thresh = cv2.threshold(mask,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()

但是,当我尝试上述代码(例如上面的参考)时,出现如下错误

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,struct cv::impl::A0xe227985e::Set<0,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

有人可以帮助我解决此问题吗?我只想使用openCV python裁剪此圆圈(虹膜本地化),谢谢

解决方法

说明


findContours方法使用Suzuki's算法从给定的二进制图像中检索轮廓。轮廓对于形状分析,物体检测和识别很有用。

findContour方法返回两个变量:contourshierarchy。在原始代码中,您进行了contours = cv2.findContour(...)合并了contourshierarchy变量的操作。因此,您有一个错误。我们根本不需要hieararchy变量,因此我们放置了_。因此错误得以解决。

解决方案


用以下内容替换findContours行:

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

结果:

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...