机器视觉学习-day01

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

像素

像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不同,每个像素可以用不同的二进制数表示。

常见的的图像是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.红色:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值