遮罩时出现彩色显示错误

时间:2019-07-11 08:42:29

标签: python opencv

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

不久,代码将图像的色彩空间从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)

1 个答案:

答案 0 :(得分:0)

LAB颜色空间具有3个通道,L的范围是0-100%,a的范围是-128至128,b的范围是-128至128。OpenCV值在LAB中获取uint8图像的方法如下:

enter image description here

您的问题是,在OpenCV中,LAB中的值(0,0,0实际上是(0, -128, -128),您可以在在线colorpicker中查看该值,并且它是蓝色的。

应用遮罩时,遮罩中不存在的内容将保持“黑色”(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