我想将任何图像转换为灰度,但是我不理解这些实现之间的区别。
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')
绘制它们时,分别以蓝色,绿色,绿色和灰色显示它们。什么时候应该使用每个?
答案 0 :(得分:3)
您已经遇到了Python的类型系统无法像C ++那样保护您的情况。
cv2.IMREAD_GRAYSCALE
和cv2.COLOR_BGR2GRAY
是来自不同枚举的值。数值为0的前者适用于cv2.imread()
。后者的值为6,适用于cv2.cvtColor()
。 C ++会告诉您cv2.IMREAD_GRAYSCALE
无法传递给cv2.cvtColor()
。 Python悄悄地接受相应的int值。
因此,您认为您是在要求cv2将彩色图像转换为灰色,但是通过传递cv2.IMREAD_GRAYSCALE
,cv2.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个彩色通道应具有的亮度。