上一篇文章中,解释了像素是计算机视觉任务中的原材料。
很多图像处理任务以像素的局部性为基础,在不同尺度下完成图像特征的提取,这些特征,小则为图像细节,大则为图像轮廓。
现在继续了解一种十分简洁但很高效的图像表示——灰度图,灰度图是一种只包含亮度信息而不包含颜色信息的图像。
在灰度图中,每个像素的亮度通过一个灰度级别来表示,通常用整数值表示,范围从0(黑色)到 255(白色)。
这里解释一下为什么是 0 - 255。
因为任何数据在计算机中都是以数值的形式存储的,不论是图像还是音频。
在计算机的基本数据类型中,一个基本的数据类型为 char 或 Byte,也就是占 1 个字节、8 个 bits 的数据类型。而无符号 char 类型可以表示的数据范围刚好就在 0 - 255 之间,因此像素的灰度级别也就采用了 0 - 255 这个范围。
这些等级的灰度基本可以很好的表示丰富的图像细节。
为什么要使用灰度图
使用灰度图会有很多好处,比如:
简化处理
灰度图只包含亮度信息,相比彩色图像更加简单,因此在图像处理任务中更容易处理。
这对于一些基础任务,如图像的边缘检测和轮廓分析,非常有利;在后续的章节中,便会使用灰度图做图像的分割,主要看中的就是灰度图对于轮廓的表现更加友好。
减小存储和传输成本
灰度图像的存储空间(占用内存大小)远远小于彩色图像,因为每个像素只需要一个灰度级别的值,无论是图像传输还是存储,灰度图都具有明显的优势。
强调结构和纹理
灰度图突出了图像的结构和纹理,使得在一些特定的图像分析任务中更加有效。例如,在医学影像中比如拍胸片CT等,灰度图会用于强调组织的密度和结构。
下面来了解一下如何生成一张灰度图。
灰度图如何生成?
我用 AI 软件画了一张猫咪坐在公园长椅
上的照片,下面是 AI 生成的彩色图片。
你可以用以下的 python 代码完成彩色图片到灰度图片的转换:
from PIL import Image
# 打开彩色图像
color_image = Image.open('./cat.png')
# 转换为灰度图
gray_image = color_image.convert('L')
# 保存灰度图
gray_image.save('./gray_cat.jpg')
print("彩色图片格式: " + color_image.mode)
print("灰度图片格式: " + gray_image.mode)
通过以上代码,便可以把上述彩色图片转换为灰度图。
在 python 代码中,使用 color_image.mode
可以查看图像的 mode 属性,从而获得图像的格式。
比如那张彩色图片,获取的格式是:RGBA 格式。RGBA 代表红(Red)、绿(Green)、蓝(Blue)和透明度(Alpha)四个通道。
在 RGBA 格式的图像中,每个像素包含四个值,分别表示其在红、绿、蓝三个颜色通道上的强度,以及透明度通道上的值(0 表示完全透明,255 表示完全不透明)。
转换为灰度图之后,获取的格式是:L 格式,L 代表灰度(Luminance)模式。在 L 格式的图像中,每个像素只包含一个灰度值,表示图像中该点的亮度。例如,一个 L 像素可以表示为 150,表示该像素的亮度为中等灰度。
总的来说:灰度图和彩色图相比,更加简洁和高效。在很多领域比如医学影像成像,或者印刷出版,灰度图都有着它独一无二的用途。
后面也会使用灰度图做一次图像分割的实战练习。