使用python在眼睛图像中检测瞳孔

问题描述 投票:0回答:1

我需要在像这样的眼睛中标记瞳孔。我写了这段代码Eye Image

img_name='6.jpg'
image = cv2.imread(img_name)
image_copy_new=cv2.imread(img_name)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retval, thresholded = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY_INV)
plt.imshow(thresholded,cmap="gray")

这会产生这样的输出 -

Threshold

然后我搜索了图像中的轮廓,并尝试通过此代码在图像中找到最圆形的轮廓

contours, hierarchy = cv2.findContours(thresholded, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image_copy = np.zeros_like(image)  # create a new emtpy image
for cnt in contours:
    peri = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
    (x, y, w, h) = cv2.boundingRect(cnt)
    ar = w / float(h)
    if w*h > 20 and 0.9 < ar < 1.1:  # filtering condition
        cv2.drawContours(image, [cnt], 0, 255, -1)

虽然这在某些情况下会产生很好的效果,但是在某些情况下,眼睛面向前方,但在其他情况下(如此),它会完全失效。我尝试了许多其他的东西,如“霍夫变换,不同的变形”,但我无法解决这个问题。图像只是眼睛,而不是整个脸,否则dlibs面部检测将会工作这个代码工作的情况是Working case

感谢您抽出宝贵时间帮助我。

python-3.x opencv
1个回答
0
投票

增加一些模糊,侵蚀和扩张可能会有所帮助。腐蚀将消除非常小的特征,如睫毛周围的噪音,并且扩张将使任何幸存点恢复到大小。通过调整侵蚀和扩张尺寸,您应该能够摆脱大部分噪音并使中心瞳孔看起来更好。

这是我如何做到这一点的一个例子:

    gray = cv2.cvtColor(frame_in, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    thresh = cv2.threshold(blurred, 30, 255, cv2.THRESH_BINARY)[1]
    erosion_size = 10
    dilate_size = 8
    thresh = cv2.erode(thresh, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (erosion_size, erosion_size)))
    thresh = cv2.dilate(thresh, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (dilate_size, dilate_size)))
© www.soinside.com 2019 - 2024. All rights reserved.