【问题标题】:Remove green screen from image从图像中删除绿屏
【发布时间】:2019-01-14 02:41:55
【问题描述】:

所以我在下面有这张图片:

如您所见,图像中有一些嘈杂的绿色轮廓。到目前为止,这是我使用 Python 使用 OpenCV 的最新输出。而且我还是个初学者,所以我需要你的帮助。

假设我要创建一个全新的脚本并提供此图像并“清理”该图像,我将如何做?

编辑: 这是原始图像:

【问题讨论】:

  • 绿色部分是在对象边框的内部还是外部?恕我直言,物体表面可能有绿光反射。例如在脸上看起来像倒影,在手指上看起来更像绿色来自坏面具

标签: python opencv


【解决方案1】:

在您的图片上使用Canny Edge Detection。然后根据它的外观使用Morphological Dilation (cv.dilate()) 使边缘更厚一些。然后从图像的绿色通道中去除边缘或降低绿色通道的亮度。或者使像素透明。

This post 声明了以下方法:

1.) 将绿色像素转换为透明度。基本上是在 HSV 颜色空间中使用过滤规则。

2.) 在头发和一些边界像素上混合绿色。为了减少这个问题,这些像素被过滤和平衡以减少它们的绿色比例。

3.) 对所有边界像素应用渐变透明度。

【讨论】:

  • 嗨@Joe,感谢您与我们联系。我想知道,如果我再次拥有原始绿色图像并“正确”处理它会更好(即不是我这样做的方式导致我在上面分享的那个图像)?我分享了上面的原图
  • 这似乎是同一个问题:stackoverflow.com/questions/2810970/…
  • 是的,已经看到那个帖子了。不幸的是,除了那个 Java 解决方案之外没有真正的答案,而且我对 Java 不是很熟悉。
  • 那里描述的方法可能更好,他只在通道上工作,根本没有边缘。
  • 这里描述的所有操作都在 OpenCV 中可用。它只是按颜色挑选像素并使它们透明。
【解决方案2】:

尝试自定义阈值,例如:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多