答案 0 :(得分:1)
您可以尝试转换为HSV颜色空间和颜色阈值。但您可能无法将阈值作为变量删除,因为每个图像的光照都有轻微变化。根据经验,我可以告诉你,有时你可以慷慨地扩展门槛,以适应你想要的大部分东西。但更通用的解决方案将采用更复杂的算法。
来自opencv文档:
11 # Convert BGR to HSV
12 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
13
14 # define range of blue color in HSV
15 lower_blue = np.array([110,50,50])
16 upper_blue = np.array([130,255,255])
17
18 # Threshold the HSV image to get only blue colors
19 mask = cv2.inRange(hsv, lower_blue, upper_blue)
对于那里的黄色调,你必须调整参数。
答案 1 :(得分:1)
使用霍夫圆变换找到将眼睛和灰色区域分开的圆圈。
基本思路是运行Hough circle transfor,然后找到圆圈内部和外部之间值差异最大的圆圈。
代码:
import cv2
import numpy as np
# Read image
Irgb = cv2.imread('eye.jpg')
# Take the first channel ( No specifc reason just good contrast between inside the eye and outside)
Igray = Irgb[:,:,0]
# Run median filter to reduce noise
IgrayFilter = cv2.medianBlur(Igray,101)
# Find circles using hough circles
minRadius = np.floor(np.min(Igray.shape)/2)
circles = cv2.HoughCircles(IgrayFilter, cv2.HOUGH_GRADIENT, dp=0.5,param1=100,param2=50,minRadius=int(minRadius),minDist=100)
circles = np.uint16(np.around(circles))
cimg = Irgb
# For each circle that we found find the intinestiy values inside the circle and outside.
# We eould take the circle that as the biggest difference between inside and outside
diff = []
for i in circles[0, :]:
# Create mask from circel identity
mask = np.zeros_like(Igray)
maskInverse = np.ones_like(Igray)
cv2.circle(mask, (i[0], i[1]), i[2], 1, cv2.FILLED)
cv2.circle(maskInverse, (i[0], i[1]), i[2], 0, cv2.FILLED)
# Find values inside mask and outside
insideMeanValues = np.mean(np.multiply(mask,Igray))
outsideMeanValues = np.mean(np.multiply(maskInverse, Igray))
# Save differnses
diff.append(abs(insideMeanValues-outsideMeanValues))
# Take the circle with the biggest difference in color as the border circle
circleID = np.argmax(diff)
circleInfo = circles[0, circleID]
# Create mask from final image
mask = np.zeros_like(Igray)
cv2.circle(mask, (i[0], i[1]), i[2], 1, cv2.FILLED)
# Show final image only in the mask
finalImage = Irgb
finalImage[:,:,0] = np.multiply(finalImage[:,:,0],mask)
finalImage[:,:,1] = np.multiply(finalImage[:,:,1],mask)
finalImage[:,:,2] = np.multiply(finalImage[:,:,2],mask)
cv2.imwrite('circle.jpg',finalImage)