当前位置: 首页 > news >正文

image.convert()函数转换格式及显示图像的RGB三通道图像

引 言 视觉任务处理的图片按照图像通道深度分为单通道图像和多通道图像。单通道图像有grayscale灰度图、binary二值图、PNG图,多通道图像有三通道24位真彩色RGB图,8位伪彩色图像,YCbCr图像等。本文先介绍各种格式图像的特点,随后讲解图像的不同加载方法和格式转换语句,图像数据不同存储方式的维度变化,以及如何提取RGB每个通道的图片。

文章目录

    • 一、常见图像格式介绍
      • 1.1 grayscale灰度图
      • 1.2 二值图像
      • 1.3 PNG格式图像
      • 1.4 RGB格式图像
      • 1.5 RGBA图像
      • 1.6 8位伪彩色图
    • 二、图像加载和格式转换
      • 2.1图像加载方式
        • 2.1.1 调用`Image.open(img_path)`加载图像
        • 2.1.2 调用`cv2.imread(img_path,flags=1)`加载图像
      • 2.2 图像格式转换
        • 2.2.1 grayscale灰度图
        • 2.2.2 二值图像
        • 2.2.3 RGB格式图像
        • 2.2.4 PNG格式图像
        • 2.2.5 RGBA图像
        • 2.2.6 YCbCr图像
    • 三、区分numpy.array和torch.tensor存储图像维度变化
    • 四、RGB各通道图像提取

一、常见图像格式介绍

1.1 grayscale灰度图

灰度图为单通道图像,每个像素值为8bit,像素取值范围:0~255,其中0:黑,255:白,其他像素值表示不同的灰度等级。从RGB图转换成灰度图,像素值转换公式【gray = 0.299R+0.587G+0.114*B】。
示例:模仿灰度图像素值的示例代码及显示效果

img_gray = np.array([[0,120,230],[255,60,150],[100,60,30]])
print('image pixel values:\n',img_gray)
plt.imshow(img_gray,cmap=plt.cm.gray)
plt.title('Display image pixel values')
plt.axis('off')		#取消坐标系
plt.show()###
image pixel values:[[  0 120 230][255  60 150][100  60  30]]

在这里插入图片描述

1.2 二值图像

图像中只有两种像素值黑与白,黑:0,白:1。
示例:将上例中的灰度图像转换成二值图

img_gray = np.array([[0,120,230],[255,60,150],[100,60,30]])
#像素值>127变成1,否则变成0
img_binary = np.where(img_gray>127,1,0)
print('binary image pixel values:\n',img_binary)
plt.imshow(img_binary,cmap='gray')
plt.title('Display binary image pixel values')
plt.show()###
binary image pixel values:[[0 0 1][1 0 1][0 0 0]]

在这里插入图片描述

1.3 PNG格式图像

png格式图像一般为8bit图像,每个像素值对应+的RGB三分量通过查阅调色板获取。调色板数据样式:

索引号RGB
0000
255255255255
  1. 每个png图片都有属于自己的调色板,调色板获取代码如下
img_path = r'F:\pytorch_project\panda.png'
image = Image.open(img_path).convert('P')if image.mode == 'P':palette = image.getpalette()
else:print('picture has no palette')
  1. 打印调色板信息列举了两种常用的方法。方法一:由于调色板每个索引编号对应三个颜色分量,所以可以对调色板列表直接变成ndarray变成最后维度为3的数组后转换成列表,并将结果变成字典{索引号:color元素}。方法二:对列表中相邻3个元素封装成一个颜色元组。
# 方法一:对palette直接变形
palette_reshape = np.reshape(palette, (-1, 3)).tolist()
# 转换成字典子形式
palette_dict = dict((i, color) for i, color in enumerate(palette_reshape))
print(palette_dict)
print('-'*50)
# 方法二:对列表中相邻3个元素封装成一个颜色元组
palette_dict = {}
for i in range(0,len(palette),3):color = (palette[i],palette[i+1],palette[i+2])palette_dict[i//3] = colorprint(palette_dict)
  1. 将字典数据存入json格式文件中。
#将字典写入文件
json_str = json.dumps(pd)
with open("palette.json", "w") as f:f.write(json_str)

1.4 RGB格式图像

传统的红绿蓝三色图有三个通道,每个通道分量用8bit,取值范围:0~255,每个像素值共有24bit。

1.5 RGBA图像

图像为32bit,前24bit存储RGB三通道像素值,最后8bit存储透明度信息。

1.6 8位伪彩色图

每个像素值代表图像像素表的索引地址,在像素表中RGB三分量不完全相同。

索引号RGB
25500
绿02550
2552550

二、图像加载和格式转换

2.1图像加载方式

图像加载可以通过调用PIL库加载,也可以调用cv2库加载图像。

2.1.1 调用Image.open(img_path)加载图像
img_path = r'F:\pytorch_project\plane.jpg'
image = Image.open(img_path)
img = np.array(image)
2.1.2 调用cv2.imread(img_path,flags=1)加载图像

flags属性:flags=0,提取单通道黑白图像。flags=1提取三通道彩色图像。

注意cv2.imread()提取的彩色图像格式为【H,W,C】,最后的通道维度顺序是BGR,在使用过程中需要对最后一个维度的数据进行转置操作变成熟悉的RGB格式(使用列表转置操作list[::-1])。

# 1.提取单通道图片并展示
img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=0)
img = np.array(image)
plt.imshow(img,cmap='gray')
plt.show()# 2.提取彩色图片并展示
img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=1)
img = np.array(image)
plt.imshow(img[:,:,::-1])
plt.show()

也可以使用cv2模块内的imshow()显示图片,但是需要设置关闭窗口的按键响应。

img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=1)	img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('image',img_gray)## 键入esc时退出,s保存退出
k = cv2.waitKey(0)
if k == 27:cv2.destoryAllWindows()
elif k == ord('s'):cv2.imwrite('img_1.jpg', img_gray)cv2.destoryAllWindows()

2.2 图像格式转换

图像转换成项目需要的格式调用函数为:Image.open(img_path).convert(format_str)
format_str参数:**‘RGB’,‘L’, ‘1’,‘P’,‘RGBA’, ‘YCbCr’**等。

2.2.1 grayscale灰度图

可以从RGB图通过提取各通道像素值经过公式运算转换成灰度图,实现公式【gray = 0.299R+0.587G+0.114*B】,也可以直接调用语句img.convert('L')或’'转换格式。

image = Image.open(img_path).convert('L')
plt.imshow(image,cmap='gray')
plt.show()

此外,img.convert('I')表示32位整型灰度图,img.convert('F')表示32为浮点型灰度图。

2.2.2 二值图像
image = Image.open(img_path).convert('1')
2.2.3 RGB格式图像
image = Image.open(img_path).convert('RGB')
2.2.4 PNG格式图像
image = Image.open(img_path).convert('P')
2.2.5 RGBA图像

图像为32bit,前24bit存储RGB三通道像素值,最后8bit存储透明度信息,语法为:

image = Image.open(img_path).convert('RGBA')
2.2.6 YCbCr图像

YCbCr图为24bit彩色图,Y表示亮度通道,Cb和Cr表示两个色度通道,肉眼对亮度通道敏感,对两个色度通道进行下采样。语法为:

image = Image.open(img_path).convert('YCbCr')

除了上面介绍的使用PIL库的convert()函数进行格式转换,也可以使用cv2.cvtColor()函数进行图像格式转换。

三、区分numpy.array和torch.tensor存储图像维度变化

numpy.ndarray存储的图像维度为(宽、高、通道)【W,H,C】,torch.tensor存储的图像维度为(通道、宽、高)【C,W,H】,在使用过程中要根据具体使用需求对图像矩阵进行维度转换。

import numpy as np
from PIL import Image
from torchvision import transformsimg_path = r'F:\pytorch_project\plane.jpg'image = Image.open(img_path).convert('RGB')# image变成numpy.ndarray
img_np = np.array(image)
# image变成torch.tensor
img_tensor = transforms.ToTensor()(image)print("numpy.array shape: {}".format(img_np.shape))
print("torch.tensor shape: {}".format(img_tensor.shape))###
numpy.array shape: (1200, 1920, 3)
torch.tensor shape: torch.Size([3, 1200, 1920])

四、RGB各通道图像提取

对RGB各图层图像提取并展示有利于更直观了解图像的情况。

import numpy as np
from PIL import Image
import matplotlib.pyplot as pltimg_path = r'F:\pytorch_project\plane.jpg'# 获取图像数据
image = Image.open(img_path).convert('RGB')
img = np.array(image)img_list = []# 获取各通道图层数据
for i in range(img.shape[-1]):temp = np.zeros_like(img)temp[...,i] = img[:,:,i]img_list.append(temp)# 图像展示
fig,axes = plt.subplots(1,3)
titles = ['the image of {} channel'.format(channel) for channel in ['R','G','B']]for i in range(len(img_list)):axes[i].imshow(img_list[i])axes[i].set_title(titles[i])plt.show()

在这里插入图片描述

相关文章:

image.convert()函数转换格式及显示图像的RGB三通道图像

引 言 视觉任务处理的图片按照图像通道深度分为单通道图像和多通道图像。单通道图像有grayscale灰度图、binary二值图、PNG图,多通道图像有三通道24位真彩色RGB图,8位伪彩色图像,YCbCr图像等。本文先介绍各种格式图像的特点,随后讲…...

C语言 ——— 在控制台实现扫雷游戏(一次展开一片,递归实现)

前言 两个数组,一个用来显示在控制台上,一个用来存放雷 两个数组的实际大小为11 * 11 ,而为了方便排查雷的个数,实际使用范围是9 * 9 test.c #include"mine_sweeping.h"void game() {// 存放雷char mine[ROWS][COL…...

el7升级Apache模块编译

1.背景 接续https://blog.csdn.net/nanhai_happy/article/details/140566070,由于升级升级Apache过程中,发现需要使用的mod_wsgi、mod_systemd和mod_cgi模块缺失,故接着解决继续编译生成。 2. 编译mod_cgi、mod_system 2.1 安装依赖 yum …...

Linux系统下的日志管理与ELK Stack实践

关于“Linux系统下的日志管理与ELK Stack实践”,这个主题涵盖了如何在Linux环境中高效地收集、解析、存储及分析日志,以及如何利用ELK Stack(Elasticsearch、Logstash、Kibana)这套工具来实现日志的集中管理和可视化。下面我会简要…...

C++入门基础知识

在之前我们学习了C语言和初阶数据结构的相关知识,现在已经有了一定的代码能力和对数据结构也有了基础的认识,接下来我们将进入到新的专题当中,这个专题就是C。在C中我们需要花费更大的精力和更长的时间去学习这门建立在C语言基础之上的计算机…...

Python爬虫技术 第28节 数据可视化

Python 爬虫设计结合数据可视化是一个非常强大的组合,可以用来分析和展示从网络获取的数据。以下是如何设计一个 Python 爬虫并结合数据可视化的详细步骤: 步骤 1: 确定数据源和目标 首先,确定你想要爬取的数据源和目标。例如,你…...

react中的装饰器

一、初见react装饰器 初初接触react,发现一些神秘符号和语法,觉得很神奇。类似这样: import React, { PureComponent, Fragment } from react; import {Form} from antd;Form.create() class UpdateForm extends PureComponent {。。。 }哇…...

Elasticsearch:用例、架构和 6 个最佳实践

1. 什么是 Elasticsearch? Elasticsearch 是一个开源分布式搜索和分析引擎,专为处理大量数据而设计。它建立在 Apache Lucene 之上,并由Elastic 支持。Elasticsearch 用于近乎实时地存储、搜索和分析结构化和非结构化数据。 Elasticsearch 的…...

tcp常用网络接口 linux环境

TCP(传输控制协议)网络通信是常见的网络应用形式,它提供了面向连接的、可靠的数据传输服务。TCP通信常用的接口主要包括以下几个方面: 常用接口 1. socket() int socket(int domain, int type, int protocol); 功能&#xff1…...

第10节课:JavaScript基础——网页交互的魔法

目录 JavaScript的作用JavaScript的基本语法基本语法规则变量、数据类型和运算符变量数据类型运算符 实践:使用JavaScript增强网页功能结语 JavaScript是一种高级的、解释型的编程语言,它使得网页能够从静态文档转变为具有动态交互性的应用程序。本节课将…...

springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后

汽车租赁系统是针对目前汽车租赁管理的实际需求,从实际工作出发,对过去的汽车租赁管理系统存在的问题进行分析,完善客户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高&…...

.NET C# 将文件夹压缩至 zip

.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …...

软考基本介绍

一,基本了解 计算机技术与软件专业技术资格(水平)考试(简称软件考试)为国家级考试。 考试设置了27个专业资格,涵盖5个专业领域, 3个级别层次(初级、中级、高级)。 中国计算机技术职业…...

【Vue】vue3 中使用 ResizeObserver 监听元素的尺寸宽度变化

要监听 div 宽度的变化,可以使用 ResizeObserver 接口。ResizeObserver 允许你观察一个或多个元素的尺寸变化,并在发生变化时执行回调函数。这种方法比使用 MutationObserver 更专注于尺寸变化,且不受元素属性变化的影响。 使用 ResizeObserv…...

信息安全专业好吗?

22 届的 211 信安毕业生,目前在读研(虽然已经和安全没关系),整体来看大部分高校的信安都是作为计算机的附属专业存在的,除了极具特色的几个高校,例如山大的密码学,广州大学某院士加持的网络安全…...

梧桐数据库(WuTongDB):数据库中元数据表的常见信息

元数据表是数据库系统中用于存储和管理元数据的表。这些表提供关于数据库对象(如表、列、索引、视图、存储过程等)的详细信息。以下是元数据表的一些常见类型及其详细解释: 常见元数据表类型 表信息表 表名:TABLES描述&#xff1…...

在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)

Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 ,因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查: Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…...

【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…...

十六、【Python】基础教程 - 【Flask】网络编程开发

目录 前言 Flask 基础概念 安装 Flask 示例:创建一个 Flask Web 应用 运行 Flask 应用 更复杂的例子 测试新功能 前言 Flask 是一个用 Python 编写的微型 Web 框架,它以简单性和灵活性著称,非常适合快速开发小型到中型的 Web 应用。F…...

C#初级——List 容器

容器 在C#中&#xff0c;容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组&#xff1a;List<T> 内部使用数组来存储元素&#xff0c;当添加元素超出当前数组容量时&#xff0c;会自动调整大小&#xff08;扩容&#xff09;。 list容器 List<&g…...

我没搞过前端、后端、安卓,但我用AI全部打通技术壁垒

用的cursor&#xff0c;直接给文字需求&#xff0c;实现了前端、后端、网站部署&#xff0c;再到直接生成安卓apk&#xff0c;我全程0代码编写。前后加起来搞了半个月&#xff0c;效果比10年顶级工程师写的还好。 效果预览&#xff1a;http://8.146.228.154/index.html...

LabVIEW 环境下TSP与SCPI 指令对比分析

TSP&#xff08;Test Script Processor&#xff09;是泰克吉时利面向高端自动化测试系统推出的仪器端嵌入式脚本处理引擎&#xff0c;基于 Lua 语法&#xff0c;支持本地逻辑运算、多模块协同与后台运行&#xff1b;SCPI&#xff08;Standard Commands for Programmable Instru…...

OpenClaw自动化测试:Qwen3.5-9B验证APP多语言截图

OpenClaw自动化测试&#xff1a;Qwen3.5-9B验证APP多语言截图 1. 为什么需要自动化多语言测试 去年参与一个跨国APP项目时&#xff0c;我遇到了一个棘手问题&#xff1a;每次发版前需要人工检查12种语言的界面翻译一致性。团队成员需要手动截图、对照原文、记录差异&#xff…...

亲测有效!雪女-斗罗大陆-造相Z-Turbo生成角色细节展示:服装、发型、神态都很到位

亲测有效&#xff01;雪女-斗罗大陆-造相Z-Turbo生成角色细节展示&#xff1a;服装、发型、神态都很到位 作为一名长期关注AI绘画技术的创作者&#xff0c;我最近深度体验了"雪女-斗罗大陆-造相Z-Turbo"这款专为《斗罗大陆》风格角色设计的文生图模型。经过上百次生…...

OpenClaw排错指南:Kimi-VL-A3B-Thinking接口调用常见问题解决

OpenClaw排错指南&#xff1a;Kimi-VL-A3B-Thinking接口调用常见问题解决 1. 为什么需要这份排错指南&#xff1f; 上周我在本地部署OpenClaw对接Kimi-VL-A3B-Thinking多模态模型时&#xff0c;遇到了连续三个通宵都没解决的接口调用问题。从模型响应超时到多模态数据处理异常…...

Zig : 关于@Vector,slice,array,arraylist实例

最近在看Zig&#xff0c;是一个有意思的语言。以一个字符串容器为例&#xff0c;来尝试了解一下Zig和其它语言有什么不同。 一、代码 const std import("std"); const print std.debug.print; pub fn main() !void {try print_arraylist();_ print_array();_ pri…...

突破内容壁垒:Bypass Paywalls Chrome Clean全方位使用指南

突破内容壁垒&#xff1a;Bypass Paywalls Chrome Clean全方位使用指南 在信息爆炸的时代&#xff0c;优质内容往往被付费墙所阻隔。无论是学术研究所需的专业期刊&#xff0c;还是深度报道的新闻文章&#xff0c;都可能因订阅费用而让普通用户望而却步。Bypass Paywalls Chrom…...

OpenClaw多模型混搭方案:Kimi-VL-A3B-Thinking与Qwen3-32B协同工作流

OpenClaw多模型混搭方案&#xff1a;Kimi-VL-A3B-Thinking与Qwen3-32B协同工作流 1. 为什么需要多模型混搭&#xff1f; 去年冬天&#xff0c;当我第一次尝试用OpenClaw处理图文混排的文档时&#xff0c;遇到了一个尴尬的问题&#xff1a;纯文本模型Qwen3-32B对图片内容视而不…...

InstructPix2Pix企业落地:内容团队降本增效的AI修图SOP制定指南

InstructPix2Pix企业落地&#xff1a;内容团队降本增效的AI修图SOP制定指南 1. 引言&#xff1a;当AI修图师走进企业内容团队 想象一下这样的场景&#xff1a;电商团队需要为同一款商品制作不同季节的营销图&#xff0c;设计部门正在为节日活动准备上百张海报&#xff0c;内容…...

LeetCode 3740. 三个相等元素之间的最小距离 I, 3741. 三个相等元素之间的最小距离 II【按照相同元素分组】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...