1 像素
像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。
常见的的图像是RGB三原色图。红(R)、绿(G)、蓝(B)。
RGB每个通道的范围是0-255,8位(每个通道256颜色,即2的8次方),255表示颜色打满,0表示黑色,(255,0,0)表示纯红色,(0,255,0)表示纯绿色,(0,0,255)表示纯蓝色,(255,255,255)表示纯白色,(0,0,0)表示纯黑色。
2 计算机中图像的存储
一个RGB图像放在内存中是一个三维数组,其中第一维存储的是图像的高度height(行数rows),第二维存储的是图像的宽度width(列数cols),第三维存储的是每个像素点RGB的数值,计算机中处理图像的本质就是对三维数组进行计算。
使用下面的图片,拆分为三通道显示。
提示:读取图片使用OpenCV的imread函数,返回值三维数组。

# 图片名称为1.jpg
"""读取图片使用OpenCV的imread函数,返回值三维数组。"""
import cv2
import numpy as np
if __name__ == '__main__':
# 1.图片输入
path = '1.jpg' # 图片文件路径
image_np = cv2.imread(path) # 使用OpenCV读取图片,读取图片为NumPy数组
"""
cv2.imread()函数:
参数:图片路径
返回值:NumPy数组,包含图像的像素数据:三维NumPy数组(高度×宽度×通道数)
格式:BGR顺序(不是常见的RGB顺序)
形状:(高度, 宽度, 通道数)
"""
# 获取图像尺寸
image_shape = image_np.shape # 获取图像的形状(尺寸信息:高度, 宽度, 通道数)
print(image_shape) # (512, 512, 3)
# 2.分离颜色通道
b, g, r = cv2.split(image_np) # 分离BGR通道为三个二维数组,
# 拆分出来的数据不能直接用,因为少了一个维度
print(b.shape)
"""
注意:分离后的单通道数组不能直接显示为彩色图像,
需要转换为三通道格式(通过将其他两个通道置零)
"""
# 3. 创建全黑的三通道图像(用于单通道可视化)
blue_channel = np.zeros((image_shape[0], image_shape[1], 3), dtype=np.uint8) # 蓝色
green_channel = np.zeros((image_shape[0], image_shape[1], 3), dtype=np.uint8) # 绿色
red_channel = np.zeros((image_shape[0], image_shape[1], 3), dtype=np.uint8) # 红色
# 也可以这样写
# blue_channel = np.zeros((image_shape[0], image_shape[1], 3), dtype=np.uint8)
# green_channel = np.zeros_like(blue_channel) # 创建相同尺寸的全黑图像
# red_channel = np.zeros_like(blue_channel)
# np.zeros_like(blue_channel) 是 NumPy 库中的一个非常有用的函数,
# 它的作用是:创建一个与输入数组 blue_channel 具有相同形状(shape)和数据类型(dtype)的新数组,
# 并将所有元素初始化为 0
# 蓝色数组
blue_channel[:, :, 0] = b # 只保留蓝色通道(索引0),其他通道为0
print(blue_channel)
# 绿色数组
green_channel[:, :, 1] = g # 只保留绿色通道(索引1)
# print(green_channel)
# 红色数组
red_channel[:, :, 2] = r # 只保留红色通道(索引2)
# print(red_channel)
# *********显示图片*************
# BGR vs RGB:
# OpenCV默认使用BGR顺序,而Matplotlib使用RGB顺序
# 显示时需要转换:cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# """ 在matplotlib中显示,常用格式需转换(BGR转RGB)"""
# # 将OpenCV的BGR转换成RBG以便于matplotlib显示
# # 返回值是转换之后的RGB图像
# image_blue = cv2.cvtColor(
# blue_channel, # 原始图像
# cv2.COLOR_BGR2RGB # BGR到RGB
# )
# plt.imshow(image_blue)
# plt.title('Blue')
# plt.axis('off') # 取消坐标轴显示
# plt.show()
# 蓝色
"""5. OpenCV方式显示图像,不需要改传入b,g,r位置,cv2:BGR,常用为:RGB"""
# 显示处理后的灰度图像
# 蓝色
cv2.imshow('Blue Channel', blue_channel) # 第一个参数是窗口标题,必须输入
cv2.waitKey(0) # 等待用户按下任意键(参数0表示无限等待)关闭弹窗
# 保存结果
cv2.imwrite('blue_channel.png', blue_channel)
"""
cv2.imwrite()函数:
参数1:保存的文件名(包括扩展名)
参数2:要保存的图像数据
"""
# 绿色
cv2.imshow('Green_channel', green_channel) # 第一个参数是窗口标题,必须输入
cv2.waitKey(0) # 等待用户按下任意键(参数0表示无限等待)关闭弹窗
# 保存结果
cv2.imwrite('green_channel.png', green_channel)
# 红色
cv2.imshow('Red_channel', red_channel) # 第一个参数是窗口标题,必须输入
cv2.waitKey(0) # 等待用户按下任意键(参数0表示无限等待)关闭弹窗
# 保存结果
cv2.imwrite('red_channel.png', red_channel)
代码运行效果:1.蓝色

2.绿色:

3.红色:

机器视觉基础:像素与图像存储
959

被折叠的 条评论
为什么被折叠?



