我在 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 图片:
一次使用转换
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
另一个以灰度模式加载
img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
正如您记录的那样,两幅图像之间的差异并不完全为 0,我可以看到左侧和底部的差异像素
我也总结了不同之处
import numpy as np
np.sum(diff)
# I got 6143, on a 494 x 750 image
我尝试了所有的cv2.imread()
模式
在cv2.imread()
的所有IMREAD_
模式中,只有IMREAD_COLOR
和IMREAD_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/