我正在尝试使用Python在OpenCV中过滤图像,但是在蒙版应用后得到的是蓝色区域,而不是黑色。
不久,代码将图像的色彩空间从BGR更改为LAB,然后使用函数cv2.inRange
创建遮罩,并使用cv2.bitwise_not
将其反转。之后,将使用函数cv2.bitwise_and
来应用掩码。这是原始的和过滤后的帧:
一开始,我认为这可能是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)
答案 0 :(得分:0)
LAB颜色空间具有3个通道,L
的范围是0-100%,a
的范围是-128至128,b
的范围是-128至128。OpenCV值在LAB中获取uint8图像的方法如下:
您的问题是,在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