簡體   English   中英

使用 OpenCV Python 進行霍夫變換的裁剪圓

[英]Cropping Circle with Hough Transform using OpenCV Python

我想從下面的虹膜圖像中裁剪圓圈:

使用霍夫圓的虹膜圖像檢測示例

這是我的圓檢測代碼:

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()

但是,我不知道如何裁剪這個圓圈(虹膜定位)。 我一直在使用 OpenCV python 從圖像中跟蹤此代碼參考裁剪圓 這是我下面的裁剪圖像代碼:

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()

但是,當我嘗試此代碼(例如上面的參考)時,出現如下錯誤:

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

誰能幫我解決這個問題? 我只想使用openCV python裁剪這個圓圈(虹膜定位),謝謝

解釋


findContours方法使用Suzuki算法從給定的二進制圖像中檢索輪廓。 輪廓可用於形狀分析、對象檢測和識別。

findContour方法返回兩個變量: contourshierarchy 在原始代碼中,您執行了contours = cv2.findContour(...)在其中組合了contourshierarchy變量。 因此你有一個錯誤。 我們根本不需要hieararchy變量,因此我們放置了_ 於是錯誤就解決了。

解決方案


findContours行替換為以下內容:

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

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM