python - 应用蒙版时颜色显示错误
问题描述
我正在尝试在 OpenCV(使用 Python)中过滤图像,但在应用蒙版后我得到一个蓝色区域而不是黑色。
很快,代码将图像的颜色空间从 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)
解决方案
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
推荐阅读
- google-sheets - 如何使用 ARRAYFORMULA 计算每行单词的 nb
- macos - 如何运行在 Visual Studio for MAC 上创建的 .exe
- android - BLE 未在 Chrome 浏览器中检测到
- java - 如何计算Java中两个城市之间的距离
- javascript - 如何在客户端 javascript 中使用 node.js 缓冲区库
- python - 用于python错误的cython包装器中的AttributeError
- powershell - 从 powershell 输出更新 .bat 文件上的变量值(在相同的 .bat 上调用)
- c# - 如何在组合框中添加一些图像作为下拉菜单?
- php - 在数据表中执行操作后返回上一页
- python - 无论 K 值如何,KNN 都提供相同的结果