2016-08-24 62 views

回答

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

使用霍夫圆变换来查找分隔眼睛和灰色区域的圆。

其基本思想是运行Hough circle transfor,然后找到圈子内部与外部之间值最大的圆圈。

结果: enter image description here

代码:

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)