Opencv - 灰度模式与灰色转换

时间:2016-05-13 07:35:23

标签: python opencv

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

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()

当我查看差异图像时,我可以看到左边的像素而不是黑色的喷射图像。你能说出任何理由吗?使用灰度图像的正确方法是什么。

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

1 个答案:

答案 0 :(得分:28)

注意:这不是重复的,因为OP意识到来自<div><button></button><button></button><button></button></div>的图像是BGR格式(不同于建议的重复问题,假设它是RGB因此,所提供的答案仅解决该问题)

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

enter image description here

一旦使用转化

cv2.imread

和另一个用灰度模式加载

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

就像你记录的那样,两幅图像之间的差异并不完全是0,我可以看到左边和底部的差异像素

enter image description here

我也总结了差异

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

我尝试了所有import numpy as np np.sum(diff) # I got 6143, on a 494 x 750 image 模式

cv2.imread()的所有IMREAD_模式中,只有cv2.imread()IMREAD_COLOR可以使用IMREAD_ANYCOLOR转换,并且两者都给了我相同的差异针对在COLOR_BGR2GRAY

中打开的图片

差异似乎并不大。我的猜测是来自两种方法中数值计算的差异(加载灰度与转换为灰度)

当然,您要避免的是在特定版本的图像上微调您的代码,以发现来自不同来源的图像不是最理想的。

简而言之,我们不要混合处理渠道中的版本和类型。

所以我保持图像源是同质的,例如如果您从BGR中的摄像机捕获图像,那么我将使用BGR作为源,并将BGR转换为灰度转换IMREAD_GRAYSCALE

反之亦然如果我的最终来源是灰度,那么我将以灰度cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

打开文件和视频捕获