将图像转换为灰度

Converting image to grayscale

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

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

当我绘制它们时,我分别以蓝色比例、绿色比例、绿色比例和灰色比例获得它们。我应该什么时候使用它们?

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

为了将图像读取为灰度,您可以使用

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

这将生成一个二维数组,其值介于 0 到 255 之间,对应于像素的亮度,而不是像素的 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)

然后显示结果。