python - 为什么 python openCV 没有按照我期望的方式改变颜色?

标签 python python-3.x opencv

我刚开始使用 python3(或与此相关的任何语言)中的 opencv。我在 Windows 10 上。这是我的 pip 卡住:

numpy==1.16.0
opencv-python==4.0.0.21
Wand==0.5.0

我正在尝试将除(BGR 符号)[255,142,0] 之外的每个颜色像素更改为黑色。 这是我的测试代码

import cv2
import numpy as np
img=cv2.imread('referenceFont.png')
cv2.imshow('original',img)
img[np.where((img!=[255,142,0]).all(axis=2))]=[0,0,0]
cv2.imshow('remove other colors',img)
img[np.where((img==[255,255,255]).all(axis=2))]=[0,0,0]
cv2.imshow('explicit remove white',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

请注意,图像最初确实具有透明度,如果这很重要的话。我认为不加载透明度会有助于简化事情。 这是输出:

output

如您所见,仅尝试更改不匹配的颜色会导致图像几乎不可读,即使我明确删除白色,仍然存在“光晕效果”。我基本上喜欢原始图像,但背景是黑色的。感谢您的帮助。

更新 1

根据要求,这是原始文件。

original file

最佳答案

建议在 HSV 颜色范围而不是 BGR 颜色范围内执行颜色分割操作。另外值得注意的是,您的输入图像具有抗锯齿颜色,这意味着它包含一些具有漫射白色和蓝色值的像素。为了处理这些类型的输入图像,我们可以使用 cv2.inRange() 方法来代替对给定颜色的单个 == 操作。

import cv2
import numpy as np

img = cv2.imread("/path/to/img.png")

mask = cv2.inRange(img, np.array([200,100,0]), np.array([255, 170, 255]))
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
final = cv2.min(img, mask)

enter image description here

要进一步改进结果,您可以使用 HSV 颜色范围而不是 BGR 颜色范围。

关于python - 为什么 python openCV 没有按照我期望的方式改变颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54433371/

相关文章:

python - 如何截断小数类型并保留为小数类型而不四舍五入?

python - 具有多个输出列的 Pandas 聚合函数

python - 在 Python 中 Hook 每个函数调用

python - 当我在内部使用两个循环时,如何提高算法的效率?

python - 键盘控制 Python

python - 在黑白图片中的特定颜色周围添加边框

python - 具有相同哈希值的不同python frozensets

python - 将函数作为命名参数传递以进行条件检查

image - 高级椭圆检测算法的 C++ 实现在哪里?

opencv - 如何在 bash 中通过 opencv 访问网络摄像头?