【问题标题】:Pupil Detection in eye images using python使用python在眼睛图像中检测瞳孔
【发布时间】:2019-04-16 04:49:41
【问题描述】:

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

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

这会产生这样的输出 -

然后我搜索图像中的轮廓,并试图通过这段代码只找到图像中最圆的那个

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 人脸检测会起作用 此代码有效的情况是

感谢您抽出时间帮助我。

【问题讨论】:

    标签: python-3.x opencv


    【解决方案1】:

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

    以下是我将如何执行此操作的示例:

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

    【讨论】:

    • 感谢您的及时回复。问题是眉毛区域和瞳孔具有相同的黑色阈值,即使经过侵蚀和扩张,大部分眉毛仍然存在,导致轮廓中的圆形检测问题。
    • 在上述情况下使用此方法。眉毛又出现误报了。
    猜你喜欢
    • 2018-10-04
    • 2011-05-29
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2017-04-15
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多