待检测图像:
期望的检测结果如下:
代码实现如下:
第一步先将原图像转换为灰度图像,然后来个二值化
#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()