【发布时间】:2019-01-14 02:41:55
【问题描述】:
如您所见,图像中有一些嘈杂的绿色轮廓。到目前为止,这是我使用 Python 使用 OpenCV 的最新输出。而且我还是个初学者,所以我需要你的帮助。
假设我要创建一个全新的脚本并提供此图像并“清理”该图像,我将如何做?
【问题讨论】:
-
绿色部分是在对象边框的内部还是外部?恕我直言,物体表面可能有绿光反射。例如在脸上看起来像倒影,在手指上看起来更像绿色来自坏面具
如您所见,图像中有一些嘈杂的绿色轮廓。到目前为止,这是我使用 Python 使用 OpenCV 的最新输出。而且我还是个初学者,所以我需要你的帮助。
假设我要创建一个全新的脚本并提供此图像并“清理”该图像,我将如何做?
【问题讨论】:
在您的图片上使用Canny Edge Detection。然后根据它的外观使用Morphological Dilation (cv.dilate()) 使边缘更厚一些。然后从图像的绿色通道中去除边缘或降低绿色通道的亮度。或者使像素透明。
This post 声明了以下方法:
1.) 将绿色像素转换为透明度。基本上是在 HSV 颜色空间中使用过滤规则。
2.) 在头发和一些边界像素上混合绿色。为了减少这个问题,这些像素被过滤和平衡以减少它们的绿色比例。
3.) 对所有边界像素应用渐变透明度。
【讨论】:
尝试自定义阈值,例如:
def color_filter(img, r, g, b):
colors = [b, g, r]
result = np.zeros(img.shape, dtype=np.uint8)
for i in range(3):
result[:, :, i] = np.where(img[:, :, i] < colors[i], 0, 255)
return result.astype(np.uint8)
更新:这里有另一个解决方案https://codereview.stackexchange.com/a/184059/15056
为每个颜色通道设置不同的值。
您可以找到最适合您的配置
def test_colors(img):
cv.imshow("test_colors", img)
r = 100
g = 100
b = 100
while True:
k = chr(cv.waitKey(0))
if k == 'a':
r += 1
elif k == 'q':
r -= 1
elif k == 's':
g += 1
elif k == 'w':
g -= 1
elif k == 'd':
b += 1
elif k == 'e':
b -= 1
elif k == 't':
r += 1
g += 1
b += 1
elif k == 'g':
r -= 1
g -= 1
b -= 1
elif k == 'r':
r = 100
g = 100
b = 100
cv.imshow("test_colors", img)
continue
elif k == 'x':
cv.destroyAllWindows()
print("The RGB is ", (r, g, b))
break
else:
continue
cv.imshow("test_colors", color_filter(img, r, g, b))
【讨论】: