将图像转换为灰度

时间:2018-11-01 13:49:37

标签: python python-3.x python-imaging-library scikit-image cv2

我想将任何图像转换为灰度,但是我不理解这些实现之间的区别。

image = cv2.imread('lenna.jpg')
gray = cv2.cvtColor(image, cv2.IMREAD_GRAYSCALE)

gray1 = rgb2gray(image)

gray2 = cv2.imread('lenna.jpg', cv2.IMREAD_GRAYSCALE)

image1 = Image.open('lenna.jpg', 'r')
gray3 = image1.convert('L')

绘制它们时,分别以蓝色,绿色,绿色和灰色显示它们。什么时候应该使用每个?

2 个答案:

答案 0 :(得分:3)

您已经遇到了Python的类型系统无法像C ++那样保护您的情况。

cv2.IMREAD_GRAYSCALEcv2.COLOR_BGR2GRAY是来自不同枚举的值。数值为0的前者适用于cv2.imread()。后者的值为6,适用于cv2.cvtColor()。 C ++会告诉您cv2.IMREAD_GRAYSCALE无法传递给cv2.cvtColor()。 Python悄悄地接受相应的int值。

因此,您认为您是在要求cv2将彩色图像转换为灰色,但是通过传递cv2.IMREAD_GRAYSCALEcv2.cvtColor()会看到值0,并认为您是重新传递cv2.COLOR_BGR2BGRA。您会获得原始图像,而不是灰度图像,而是添加了Alpha通道。

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

而是您需要的。

假设使用的是Jupyter笔记本,您遇到的另一个问题是cv2以BGR顺序而不是RGB分层颜色平面。要正确显示它们,首先要做

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

然后显示结果。

答案 1 :(得分:0)

非灰色的图像仍然是3d阵列,也就是说它们仍然以某种方式保留了颜色信息,您看到蓝色和绿色的原因是,在那些3d阵列中,第一种情况是红色和绿色通道,第二个通道中的蓝色和红色通道已减少为0,只剩下您看到的蓝色和绿色。

要使用灰度读取图像,请使用

img_gray=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

这将产生一个2d数组,其值在0到255之间,对应于像素应具有的亮度,而不是像素的3个彩色通道应具有的亮度。