首页 > 解决方案 > 应用蒙版时颜色显示错误

问题描述

我正在尝试在 OpenCV(使用 Python)中过滤图像,但在应用蒙版后我得到一个蓝色区域而不是黑色。

很快,代码将图像的颜色空间从 BGR 更改为 LAB,然后使用该函数创建一个蒙版cv2.inRange并使用cv2.bitwise_not. 之后,使用函数应用掩码cv2.bitwise_and。以下是原始帧和过滤帧:

https://i.stack.imgur.com/6pGym.png

一开始,我认为这可能是 BGR/RGB 图像表示之间的问题,但排除了蓝色区域,图像的颜色是正确的。

这是代码:

# Parameter "frame": BGR image.
# Parameter "min": min LAB val.
# Parameter "max": max LAB val.
# Return filtered frame in BGR.
def applyFilter(frame, min, max):

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

    mask = cv2.inRange(frame, min, max)
    mask = cv2.bitwise_not(mask)

    filtered_frame = cv2.bitwise_and(frame, frame, mask=mask)

    return cv2.cvtColor(filtered_frame, cv2.COLOR_LAB2BGR)

标签: pythonopencv

解决方案


LAB 颜色空间有 3 个通道,L从 0-100%,a从 -128 到 128,b从 -128 到 128。 LAB 中 uint8 图像的 OpenCV 值如下:

在此处输入图像描述

您的问题是,在 OpenCV(0,0,0中,LAB 中的值 ) 实际上(0, -128, -128)是可以在在线颜色选择器中查看并看到它是蓝色的。

当您应用遮罩时,遮罩中没有的东西会保持“黑色”(0,0,0),一旦它从 LAB 转换为 BGR,它就会变成蓝色。如果想法是将未选择的内容保留为黑色,则有两种解决方案:

1)将蒙版应用于原始图像

2)将0,0,0像素转换为0,128,128

对于 1) 代码将如下所示:

# Parameter "frame": BGR image.
# Parameter "min": min LAB val.
# Parameter "max": max LAB val.
# Return filtered frame in BGR.
def applyFilter(frame, min, max):

    tempFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

    mask = cv2.inRange(tempFrame, min, max)
    mask = cv2.bitwise_not(mask)

    filtered_frame = cv2.bitwise_and(frame, frame, mask=mask)

    return filtered_frame

推荐阅读