图像相关的基础知识【RGB和RGBA】—附python代码实现

news2024/9/22 1:30:52

文章目录

  • 1、图像基础知识
  • 2、像素和通道的理解
  • 3、RGB和RGBA
    • RGB (Red, Green, Blue)
    • RGBA (Red, Green, Blue, Alpha)
    • 应用场景
  • 4、H,W,C
  • 5、小结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、图像基础知识

  • 知道像素、通道等概念
  • 掌握使用matplotlib加载图片方法

我们在进行图像任务时,需要了解图像的基础知识。
图像是由像素点组成的,每个像素点的值范围为 [0, 255],像素值越大意味着较亮
比如一张200x200的图像,则是由40000个像素点组成,如果每个像素点都是0的话,意味着这是一张全黑的图像。
我们看到的彩色图一般都是多通道的图像,所谓多通道可以理解为图像由多个不同的图像层叠加而成,例如我们看到的彩色图像一般都是由RGB三个通道组成的,还有一些图像具有RGBA四个通道,最后一个通道为透明通道,该值越小,则图像越透明。

2、像素和通道的理解

接下来,我们使用 matplotlib 库来实际理解下上面讲解的图像知识。
示例代码:

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/31 23:38

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image


# 1. 图像基本理解
def test01():
    # 创建一个200x200的全零数组(黑色图像)
    img = np.zeros([200, 200])
    # 打印图像数据
    print(img)
    # 显示图像,使用灰度颜色映射,值范围0到255
    # plt.figure(figsize=(12, 6))
    # TODO 同一图形窗口内创建多个子图的函数, 参数: 行数、列数、当前子图索引(从1开始)
    plt.subplot(1, 2, 1)
    plt.imshow(img, cmap='gray', vmin=0, vmax=255)

    # 创建一个255x255的全255数组(白色图像)
    img = np.full([255, 255], 255)
    # 打印图像数据
    print(img)
    # 显示图像,使用灰度颜色映射,值范围0到255
    plt.subplot(1, 2, 2)

    plt.imshow(img, cmap='gray', vmin=0, vmax=255)
    # 显示图像窗口
    plt.show()


# 2. 图像的通道
def test02():
    # 读取彩色图像
    # img = plt.imread('data/彩色图片.png')
    img = np.array(Image.open('data/彩色图片RGBA.png'))
    # 修改数据的维度,从(H, W, C)到(C, H, W)
    img = np.transpose(img, [2, 0, 1])
    print(img.size)
    print(img.shape[0])
    print(img)
    # 打印所有通道
    forNumber = img.shape[0]
    for i in range(forNumber):
        channel = img[i]
        # 打印当前通道的数据
        print(channel)
        if forNumber / 2 >= i:
            plt.subplot(2, 2, i + 1)
            plt.imshow(channel, cmap='gray')
        # 显示当前通道的图像
        plt.subplot(2, 2, i + 1)
        plt.imshow(channel)

    # 自适应布局
    plt.tight_layout()
    plt.show()

    # 修改透明度通道,设为0.05
    img[3] = 1
    print("-" * 50)
    print(img)
    # 将图像数据维度从(C, H, W)改回(H, W, C)
    img = np.transpose(img, [1, 2, 0])
    # 显示修改后的图像
    plt.imshow(img)
    # 显示图像窗口
    plt.show()


# 主函数入口
if __name__ == '__main__':
    # 调用test01函数
    test01()
    # 调用test02函数
    test02()

程序中的彩色图片为:
彩色图片.png
程序输出结果:
image.png
image.png
程序解释:
**test01**** 函数:**

  1. 创建一个 200x200 的全零数组(黑色图像)。
  2. 使用 plt.subplot(1, 2, 1) 创建一个 1 行 2 列的子图布局,并选择第一个子图。
  3. 显示黑色图像,使用灰度颜色映射。
  4. 创建一个 255x255 的全 255 数组(白色图像)。
  5. 使用 plt.subplot(1, 2, 2) 创建第二个子图。
  6. 显示白色图像,使用灰度颜色映射。
  7. 使用 plt.show() 显示图像窗口。

**test02**** 函数:**

  1. 使用 PIL.Image.open 读取 data/彩色图片RGBA.png 图像。
  2. 使用 np.transpose(img, [2, 0, 1]) 将图像数据维度从 (H, W, C) 转换为 (C, H, W)。
  3. 打印图像数据的大小和形状。
  4. 遍历每个通道,打印通道数据,并在 2 行 2 列的子图布局中显示每个通道。
  5. 使用 plt.tight_layout() 调整子图布局。
  6. 使用 plt.show() 显示通道图像。
  7. 修改 Alpha 通道为 0.05。
  8. 使用 np.transpose(img, [1, 2, 0]) 将图像数据维度从 (C, H, W) 转换回 (H, W, C)。
  9. 显示修改后的图像,使用 plt.show() 显示图像窗口。

下面补充几个重要的知识点!

3、RGB和RGBA

RGB和RGBA是两种常见的颜色模型,广泛应用于计算机图形学和图像处理领域。它们之间的主要区别在于是否包含透明度信息。

RGB (Red, Green, Blue)

RGB颜色模型由三种基本颜色组成:红色(Red)、绿色(Green)和蓝色(Blue)。每种颜色的强度通常用0到255之间的整数表示。在RGB模型中,通过不同强度的红、绿、蓝组合,可以表示出各种颜色。例如:

  • (255, 0, 0) 表示纯红色。
  • (0, 255, 0) 表示纯绿色。
  • (0, 0, 255) 表示纯蓝色。
  • (255, 255, 255) 表示白色。
  • (0, 0, 0) 表示黑色。

RGBA (Red, Green, Blue, Alpha)

RGBA颜色模型在RGB的基础上增加了一个Alpha通道,用于表示透明度。Alpha通道的值通常也是0到255之间的整数,0表示完全透明,255表示完全不透明。通过Alpha通道,可以在颜色的基础上控制其透明度,这对于图像的叠加和透明效果非常重要。例如:

  • (255, 0, 0, 128) 表示半透明的红色。
  • (0, 255, 0, 255) 表示完全不透明的绿色。
  • (0, 0, 255, 0) 表示完全透明的蓝色。

应用场景

  1. RGB 常用于需要精确控制颜色的场景,如计算机显示器、电视屏幕、数码相机等。
  2. RGBA 通常用于图形设计和图像处理,如PNG图像格式支持透明背景、Web设计中的图像叠加效果等。

4、H,W,C

在图像处理中,图像数据可以以不同的维度顺序存储和处理。常见的维度顺序有两种:
①(H, W, C):代表图像的高度(Height),宽度(Width),以及通道数(Channels);
这种格式通常用于图像存储和显示;
例如:

一个 RGB 图像的形状可能是 (256, 256, 3),
表示图像的高度为 256 像素,宽度为 256 像素,有 3 个颜色通道(红色、绿色和蓝色)

②(C, H, W):代表图像的通道数(Channels),高度(Height),以及宽度(Width);
这种格式常用于深度学习框架中,因为这样可以更方便地批量处理数据;
例如:

一个 RGB 图像的形状可能是 (3, 256, 256),
表示有 3 个颜色通道,每个通道的高度为 256 像素,宽度为 256 像素

为什么需要转换维度:
转换维度是为了适应不同库或算法的需求。
例如:

  • 在深度学习中,通常需要将图像数据转换为 (C, H, W) 格式以输入到神经网络中。
  • 在显示图像或保存图像时,通常需要将数据转换回 (H, W, C) 格式。

5、小结

这里了解了图像的像素、通道相关概念。
图像是由像素点组成的,像素值的范围 [0, 255] 值越小表示亮度越小,值越大,表名亮度值越大。
一个全0的图像就是一副全黑图像。 一个复杂的图像则是由多个通道组合在一起形成的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1977174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aurora8b10b ip的使用(framing接口下的数据回环测试)

文章目录 一、Aurora8B/10B协议二、时钟、复位与状态指示1、时钟2、复位3、状态指示 三、数据发送、接受接口(1)AXI4-Stream位排序(2)Streaming接口(3)Framing接口(帧传输接口) 四、…

C++ | Leetcode C++题解之第319题灯泡开关

题目: 题解: class Solution { public:int bulbSwitch(int n) {return sqrt(n 0.5);} };

Python | Leetcode Python题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution:def maxProduct(self, words: List[str]) -> int:masks defaultdict(int)for word in words:mask reduce(lambda a, b: a | (1 << (ord(b) - ord(a))), word, 0)masks[mask] max(masks[mask], len(word))return…

索引:SpringCloudAlibaba分布式组件全部框架笔记

索引&#xff1a;SpringCloudAlibaba分布式组件全部框架笔记 一推荐一套分布式微服务的版本管理父工程pom模板&#xff1a;Springcloud、SpringCloudAlibaba、Springboot二SpringBoot、SpringCloud、SpringCloudAlibaba等各种组件的版本匹配图&#xff1a;三SpringBoot 3.x.x版…

字符串相关函数

文章目录 &#x1f34a;自我介绍&#x1f34a;strcpy 字符串拷贝函数&#x1f34a;strcat 字符串连接函数&#x1f34a;strlen 字符串长度计算函数&#x1f34a;strcmp 字符串比较函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&…

C++ | Leetcode C++题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProduct(vector<string>& words) {unordered_map<int,int> map;int length words.size();for (int i 0; i < length; i) {int mask 0;string word words[i];int wordLength word.s…

[Git][基本操作]详细讲解

目录 1.创建本地仓库2.配置 Git3.添加文件1.添加文件2.提交文件3.其他 && 说明 4.删除文件5.跟踪修改文件6.版本回退7.撤销修改0.前言1.未add2.已add&#xff0c;未commit3.已add&#xff0c;已commit 1.创建本地仓库 创建⼀个Git本地仓库&#xff1a;git init运行该命…

模型 ESBI(财富四象限)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。财富自由之路的4个阶段。 1 ESBI模型的应用 1.1 一名工程师的财富自由之路 有一个名叫张伟的软件工程师&#xff0c;他在一家大型科技公司工作&#xff08;E象限&#xff09;。随着时间的推移&#…

模型量化技术综述:揭示大型语言模型压缩的前沿技术

大型语言模型&#xff08;LLMs&#xff09;通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数&#xff0c;通常需要配备大量显存的GPU来加速推理过程。 因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中&am…

electron-updater实现electron全量更新和增量更新——渲染进程交互部分

同学们可以私信我加入学习群&#xff01; 正文开始 前言更新功能所有文章汇总一、监听页面渲染完毕1.1 myApi.handleCheckPcUpdate检查更新1.2myApi.onPcUpdateProgress接收下载信息1.3myApi.onPcDownloaded监听下载完毕事件 二、立即更新三、跳过更新四、打开更新模块总结 前言…

打卡第32天------动态规划

坚持了一个月了,骑马找马,要坚持不懈呀✊ 一、动态规划理论基础 1、什么是动态规划?英文:Dynamic Programming,简称DP。 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有…

JVM—虚拟机类加载时机与过程

参考资料&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明 1. 类加载的时机 一个类型从被加载到虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;它的生命周期会经历加载、验证、准备、解析、初始化、使用、卸载…

netapp内网穿透

1. 注册netapp账号 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 2. 购买隧道&#xff0c;要求不高的话可以使用这个免费的 3.设置隧道 主要设置你想通过公网访问你的本地端口号 4.点击我的隧道&#xff0c;注意这里的authtoken&#xff0c;后面会用到 5.本地下载netap…

[E二叉树] lc572. 另一棵树的子树(dfs+前中序判断+树哈希+树上KMP+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;572. 另一棵树的子树 2. 题目解析 看到这个题目就感觉不简单&#xff0c;因为写了写 dfs 版本的&#xff0c;发现好像不太会… 还是简单粗暴一点&#xff0c;直接搞一个 前序中序&#xff0c;进行判断即可。我…

应急响应-Web3

打开虚拟机之后&#xff0c;运行解题系统&#xff1a; 共有三个问题&#xff01; 攻击者的两个IP地址 首先我们看到机器的桌面上还是存在phpstudy&#xff0c;那就还是先去看看是不是从web层面进行的攻击&#xff0c;上传webshell从而getshell。 利用D盾尝试对phpstudy目录进…

Python | Leetcode Python题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution:def bulbSwitch(self, n: int) -> int:return int(sqrt(n 0.5))

redis面试(四)持久化

什么是持久化&#xff1f; 由于redis是基于内存操作的轻量型数据库&#xff0c;所以如果发生宕机重启这种事情&#xff0c;存储的数据就会直接丢失&#xff0c;如果在里面存储了没有备份的数据&#xff0c;那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段&a…

Java中interrupted()与isInterrupted()的区别

Java中interrupted&#xff08;&#xff09;与isInterrupted&#xff08;&#xff09;的区别 1、interrupted()方法1.1 示例 2、isInterrupted() 方法2.1 示例 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java多线程编程中&a…

手持式气象站:科技赋能精准气象观测

在自然界与人类社会的交织中&#xff0c;气象条件始终扮演着至关重要的角色。无论是农业生产、城市建设&#xff0c;还是日常生活、户外活动&#xff0c;都离不开对天气变化的准确预测和及时响应。随着科技的飞速发展&#xff0c;气象观测设备也迎来了变化&#xff0c;其中&…