如何用灰色噪声掩盖图像?

时间:2016-08-24 15:17:16

标签: python opencv image-processing computer-vision

我有以下想要屏蔽的原始图像。我想要将圆形(几乎)橙色/棕色结构遮盖成白色。我该怎么做呢?

http://imgur.com/a/HNmRn

我尝试过阈值处理,但我不希望下限阈值成为变量。

2 个答案:

答案 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,然后找到圆圈内部和外部之间值差异最大的圆圈。

结果: 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)