[英]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')
当我绘制它们时,我分别以蓝色刻度、绿色刻度、绿色刻度和灰色绘制它们。 我应该什么时候使用每一种?
您遇到过 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)
然后显示结果。
不是灰色的图像是静止的 3d 阵列,也就是说它们仍然以某种方式保留颜色信息,您看到蓝色和绿色的原因是因为在这些 3d 阵列中,第一种情况下的红色和绿色通道以及蓝色和第二个中的红色通道已减少到 0,只留下您看到的蓝色和绿色。
为了将图像读取为灰度,您将使用
img_gray=cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
这将产生一个二维数组,其值在 0 到 255 之间,对应于像素应该有多亮,而不是像素的 3 个颜色通道中的每一个应该有多亮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.