OpenCV如何提取人眼区域的眼球位置

本文详细介绍了使用OpenCV进行图像处理,包括灰度转换、二值化、形态学操作及轮廓检测,以实现精确的眼球区域检测。通过合理选择结构元素,去除噪声,最终准确定位并填充眼球轮廓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

待检测图像:
在这里插入图片描述
期望的检测结果如下:
在这里插入图片描述
代码实现如下:
第一步先将原图像转换为灰度图像,然后来个二值化

#coding=utf-8
import cv2 as cv
import numpy as np

src = cv.imread("/home/jon/code/python/img/eye_area.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("gray image", gray)
ret,binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("binary image", binary)

结果如下:
在这里插入图片描述
先看下这张二值化的图片,要想得到眼球,我们可以通过一个圆形的结构元素,对这张图像做个开操作(先腐蚀再膨胀),但是还存在一个问题,中心的圆形区域还存在噪声,需要先把这个噪声剔除

element1 = cv.getStructuringElement(cv.MORPH_RECT,(3,3),(-1,-1))
tmp = cv.morphologyEx(binary,cv.MORPH_CLOSE,element1,None,(-1,-1),1)
cv.imshow("tmp image", tmp)

在这里插入图片描述
这样图像就干净了,去除了噪声后,我们也就可以通过圆形的结构元素提取眼球位置
注意:这里的矩形结构元素不能太大了,不然会把里面的2个大黑点当作噪声去除了,从而导致找不到眼球

element2 = cv.getStructuringElement(cv.MORPH_ELLIPSE,(16,16),(-1,-1))
dst = cv.morphologyEx(tmp,cv.MORPH_OPEN,element2)
cv.imshow("eye image", dst)

在这里插入图片描述
如上我们得到了眼球,下面只需要来个轮廓发现并填充颜色即可
注意:这里的圆形区域的大小需要适当大点,或许需要根据不同的图片坐下微调以达到理想的效果

cloneImage, contours, hierarchy = cv.findContours(dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE, None, None, (0, 0))
for i, contour in enumerate(contours):
    print "find "
    cv.drawContours(src, contours, i, (255, 0, 0), -1)

cv.imshow("dst image", src)

在这里插入图片描述

完整的代码如下:

#coding=utf-8
import cv2 as cv
import numpy as np

src = cv.imread("/home/jon/code/python/img/tpl.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("gray image", gray)
ret,binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("binary image", binary)

element1 = cv.getStructuringElement(cv.MORPH_RECT,(3,3),(-1,-1))
tmp = cv.morphologyEx(binary,cv.MORPH_CLOSE,element1,None,(-1,-1),1)
cv.imshow("tmp image", tmp)

element2 = cv.getStructuringElement(cv.MORPH_ELLIPSE,(16,16),(-1,-1))
dst = cv.morphologyEx(tmp,cv.MORPH_OPEN,element2)
cv.imshow("eye image", dst)

cloneImage, contours, hierarchy = cv.findContours(dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE, None, None, (0, 0))
for i, contour in enumerate(contours):
    print "find "
    cv.drawContours(src, contours, i, (255, 0, 0), -1)

cv.imshow("dst image", src)

cv.waitKey(0)
cv.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值