python - Opencv - 灰度模式与灰度颜色转换

标签 python python-2.7 opencv

我在 opencv(2.4.11) python(2.7) 中工作,正在玩灰度图像。在以灰度模式加载图像并将图像从 BGR 转换为 GRAY 时,我发现了异常行为。以下是我的实验代码:

import cv2

path = 'some/path/to/color/image.jpg'

# Load color image (BGR) and convert to gray
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Load in grayscale mode
img_gray_mode = cv2.imread(path, 0)

# diff = img_gray_mode - img_gray
diff = cv2.bitwise_xor(img_gray,img_gray_mode)

cv2.imshow('diff', diff)
cv2.waitKey()

当我查看差异图像时,我可以看到遗漏的像素而不是漆黑的图像。你能提出任何理由吗?处理灰色图像的正确方法是什么。

附言当我在 SIFT 中使用这两个图像时,关键点不同,这可能会导致不同的结果,特别是在处理质量较差的图像时。

最佳答案

注意:这不是重复,因为 OP 知道 cv2.imread 中的图像是 BGR 格式(与建议的重复问题不同假定它是 RGB,因此提供的答案仅解决该问题)

为了说明,我打开了这张相同颜色的 JPEG 图片:

enter image description here

一次使用转换

img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

另一个以灰度模式加载

img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

正如您记录的那样,两幅图像之间的差异并不完全为 0,我可以看到左侧和底部的差异像素

enter image description here

我也总结了不同之处

import numpy as np
np.sum(diff)
# I got 6143, on a 494 x 750 image

我尝试了所有的cv2.imread() 模式

cv2.imread()的所有IMREAD_模式中,只有IMREAD_COLORIMREAD_ANYCOLOR可以转换使用 COLOR_BGR2GRAY,它们都给了我与在 IMREAD_GRAYSCALE

中打开的图像相同的差异

区别似乎没有那么大。我的猜测来自于两种方法(加载灰度与转换为灰度)在数值计算上的差异

自然地,您要避免的是在图像的特定版本上微调您的代码,只是为了发现它对于来自不同来源的图像不是最佳的。

简而言之,我们不要在处理管道中混用版本和类型。

所以我会保持图像源的同质性,例如如果您在 BGR 中从摄像机捕获图像,那么我会使用 BGR 作为源,并将 BGR 转换为灰度 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

反之亦然,如果我的最终来源是灰度,那么我将以灰度打开文件和视频捕获 cv2.imread(path, cv2.IMREAD_GRAYSCALE)

关于python - Opencv - 灰度模式与灰度颜色转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972289/

相关文章:

python - 在Python中加载两个动态库实例

python-2.7 - keras 中的错误 - 名称 'Dense' 未定义

c++ - 快速可靠的反射球检测方法

python-2.7 - Python Opencv\检测并删除图像上的一行

python-3.x - 使用PIL加载图像时,是否可以忽略EXIF方向数据?

python - 安装 `dulwich` 给出 `error: command ' clang' failed with exit status 1`

Python:优先级队列不保持相同优先级元素的顺序

python - 从子进程实时打印标准输出

python - 为什么 list(xrange) 比 range() 慢?

python - 仅对列表中包含的数字求和