Opencv - 灰度模式与灰色转换

Gag*_*ngh 32 python opencv python-2.7

我在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()
Run Code Online (Sandbox Code Playgroud)

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

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

bak*_*kal 34

注意:这不是重复,因为OP知道图像来自cv2.imreadBGR格式(不像建议的重复问题,假设它是RGB,因此提供的答案只解决该问题)

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

在此输入图像描述

一旦使用转换

img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)

另一种是以灰度模式加载它

img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我也总结了差异

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

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

在所有IMREAD_模式中cv2.imread(),只有IMREAD_COLORIMREAD_ANYCOLOR可以使用转换COLOR_BGR2GRAY,并且它们都给了我与打开的图像相同的差异IMREAD_GRAYSCALE

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

当然,您要避免的是在特定版本的图像上微调您的代码,以发现它对于来自不同来源的图像来说是次优的.

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

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

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

  • 原因是灰度转换有多种实现方式。`cvtColor`() 是 opencv 实现,并且跨平台一致。当您使用 imread() 转换为灰度时,您会受到特定于平台的 imread() 实现的支配。如果“imread”() 在每个平台上返回略有不同的灰度值,我不会感到惊讶。我想不出任何理由在“imread”中转换为灰度。 (7认同)