Python常用图片数据方法

文章目录

  • 1. 常用图片数据类型
  • 2. 图片的显示
    • 2.1 `plt.imshow()`
    • 2.2 使用 turtle 来绘制图片
  • 3.图片`ndarray`数据的常用切片操作
    • 使用 cv2 来读取图片
    • 打印数据
    • R G B 通道的获取
    • BGR 转成 RGB
    • cv2 不支持中文路径的解决方法
  • 4 `PIL.Image` 转成 `QImage` 或 `QPixmap`

1. 常用图片数据类型

在这里插入图片描述

  1. 使用 cv2.imread

    返回的是一个 numpy.ndarray类型, 同时 cv2.Mat 也是ndarray的包装类 ,数据默认是 BGR 形式的

    img = cv2.imread('./image/test.png')  # 100 x 78,32bpp
    print(type(img))  # <class 'numpy.ndarray'>
    print(img.shape)  # (78, 100, 3)
    print(img)  # cv2 的 image 是 BGR 格式 [[[ 90 108  68] ...	BGR
    
  2. PIL.Image

    Image.open返回了一个Image类, 具体数据可以 通过 tobytes() 方法返回, 数据默认是RGBA形式

    img = Image.open("./image/test.png")
    print(img)  # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=100x78 at 0x261D5255A90>
    print(img.width)
    print(img.height)
    print(img.mode)
    

    同时 Image 类 兼容了 ndarray, 也就是说 Image的数据可以直接转换成 ndarray 类型

    img_data = np.array(img)    # 这里面也是用 tobytes 来获取原始数据的
    print(img_data)         # [[[ 68 108  90 255] .... RGBA
    print(img_data.shape)   # (78, 100, 4)
    
  3. QImage

    QImage 中存储的数据 从 bits() 获取, 为了方便, 统一转成 RGBA8888

    q_img = QImage()
    q_img.load("./image/test.png")
    
    w, h = q_img.width(), q_img.height()
    q_img.convertTo(QImage.Format.Format_RGBA8888)
    
    print(q_img.sizeInBytes())
    
    dataPtr = q_img.bits()
    dataPtr.setsize(q_img.sizeInBytes())
    
    img = Image.frombytes(mode='RGBA', data=dataPtr, size=(w, h))       # 转换成 PIL.Image 类型
    
    img_array = np.array(dataPtr).reshape((h, w, 4))    # 转换成 ndarray 类型
    

2. 图片的显示

图片显示有很多方法, cv2.imshow, plt.imshow, QLabel.setPixmap 也能show, tkinter 的Label 也可以, 但最方便感觉还是使用plt

2.1 plt.imshow()

def imshow(
    X: ArrayLike | PIL.Image.Image,
    cmap: str | Colormap | None = None,
    norm: str | Normalize | None = None,
....
) -> AxesImage:
# plt 可是直接显示 PIL.Image 以及 ndarray

使用方法也很简单

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt

img = Image.open("./image/test.png")
print(img)  # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=100x78 at 0x261D5255A90>

plt.imshow(img)
plt.show()

2.2 使用 turtle 来绘制图片

turtle 可以用来绘制图片

原理其实很简单, 获取像素数据,画笔设置像素颜色, 再直接落笔就🆗

import turtle as t
import cv2

print(t.colormode())
t.colormode(255)
img1 = cv2.imread('./image/test.png')[:, :, ::-1]	# BGR 形式 转成 RGB 形式

height = img1.shape[0]
width = img1.shape[1]

t.setup(width=width * 2, height=height * 2)
print(t.pos())
t.pu()
t.goto(-width / 2, height / 2)
t.pd()
t.tracer(2000)
for k1, i in enumerate(img1):
    for j in i:
        t.pencolor((j[0], j[1], j[2]))
        t.fd(1)
    t.pu()
    t.goto(-width / 2, height / 2 - k1 - 1)
    t.pd()
t.done()

3.图片ndarray数据的常用切片操作

为了讲解这一部分的知识,特地缩小了一张图片(test.png 100*28) 来讲解

使用 cv2 来读取图片

img = cv2.imread('./image/test.png')  # 100 x 78,32bpp

打印数据

一张图片解码后的像素数据大概是这个样子的, 以BGR为例, 就是一个[h][w][3] 形状 3 维数据

二维的像素数组, 每个像素又是一个3列的列表分别表示BGR的颜色组成

print(img)
[
    [ [ 90 108  68] [ 88 107  66] [ 80  98  57]   ...]
    [ [ 24  40  12] [ 24  40  12] [ 23  40  12]   ...]
    ...
]

R G B 通道的获取

直接使用 ndarray 的切片 ,分别获取 R G B 的颜色分量

二维的像素数组, 每个像素只有一个颜色分量

# print(img[..., 0])
# print(img[:, :, 0])  # 第 1 个通道    [[ 90  88  80 ...  24  24  23] ...
# print(img[:, :, 1])  # 第 2 个通道    [[108 107  98 ...  40  40  40] ...
# print(img[:, :, 2])  # 第 3 个通道    [[ 68  66  57 ...  12  12  12]

BGR 转成 RGB

img_RGB = img[..., ::-1]   # 还是切片

cv2 不支持中文路径的解决方法

cv 库 不支持图片文件名包含中文, 用 np.fromfile 读取数据,并重新解码数据来解决

img = cv2.imdecode(np.fromfile('./image/测试.png', dtype=np.uint8), 
                   cv2.IMREAD_COLOR)

4 PIL.Image 转成 QImageQPixmap

PIL.Image 有两个函数 可以分别转成 QImageQPixmap

  • toqimage() -> ImageQt
  • toqpixmap()-> QPixmap

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android基础开发-通讯录的添加和查询

案例&#xff1a;往手机通讯录添加信息&#xff0c;输入姓名和手机号。 保存的手机的表&#xff1a;一共有两个&#xff0c;一个是主表&#xff0c;提供一个联系人id&#xff0c;另外是辅表&#xff0c;提供id对应的手机号和姓名。 普通操作&#xff1a;一个表一个表的添加 …

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

【每日八股】Java基础经典面试题2

前言&#xff1a;哈喽大家好&#xff0c;我是黑洞晓威&#xff0c;25届毕业生&#xff0c;正在为即将到来的秋招做准备。本篇将记录学习过程中经常出现的知识点以及自己学习薄弱的地方进行总结&#x1f970;。 本篇文章记录的Java基础面试题&#xff0c;适合在学Java基础的小白…

设计模式系列之-策略模式(优化过多代码if…else)

首先解释下什么策略模式 如下图&#xff1a; 简而言之&#xff1a;算法的使用与算法的实现分离开来 想象有一个开关按钮&#xff0c;每次按下去都可以切换不同的灯光模式&#xff08;例如&#xff1a;强光、柔光、闪烁&#xff09;&#xff0c;这里的每种灯光模式就是一个策略…

程序人生——Java中基本类型使用建议

目录 引出Java中基本类型使用建议建议21&#xff1a;用偶判断&#xff0c;不用奇判断建议22&#xff1a;用整数类型处理货币建议23&#xff1a;不要让类型默默转换建议24&#xff1a;边界、边界、还是边界建议25&#xff1a;不要让四舍五入亏了一方 建议26&#xff1a;提防包装…

Unity类银河恶魔城学习记录8-5 p81 Blackhole duration源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码、 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Blackhole_Skill_Controller.cs using System.Collections; using Syste…

UL1642标准_锂聚合物电池亚马逊测试报告

UL1642标准_锂聚合物电池亚马逊测试报告 什么是锂聚合物电池UL1642标准&#xff1f; UL1642 认证要求涵盖旨在用于技术人员可更换或用户可更换应用的锂离子电池。UL1642 认证要求是为了避免锂离子电池在产品中工作时发生火灾或爆炸的风险。 锂聚合物电池 UL是Underwriters L…

Devin:首位人工智能软件工程师的介绍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2024春招看了上百份程序员简历,这个工具写的简历最好!(附模板)

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

DataWhale公开课笔记2:Diffusion Model和Transformer Diffusion

Stable Diffusion和AIGC AIGC是什么 AIGC的全称叫做AI generated content&#xff0c;AlGC (Al-Generated Content&#xff0c;人工智能生产内容)&#xff0c;是利用AI自动生产内容的生产方式。 在传统的内容创作领域中&#xff0c;专业生成内容&#xff08;PGC&#xff09;…

Python数值方法在工程和科学问题解决中的应用

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着计算机技术的不断发展&#xff0c;Python作…

UI设计中的图标的分类,功能性图标

图标的分类 既然知道了图标的作用和重要性&#xff0c;那么接下来&#xff0c;就要进一步了解在工作中我们要设计哪些图标。图标可以划分成三种大类:功能性图标、装饰性图标、启动图标。 功能性图标 功能图标是具有指代意义且具有功能标识的图形&#xff0c;它不仅是一种图形&a…

代码随想录算法训练营第day41|背包理论基础、416. 分割等和子集

目录 a.背包理论基础——01背包 1.二维数组的01背包表示 2.一维滚动数组表示 b. 416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; a.背包理论基础——01背包 背包问题分类&#xff1a; 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff…

Sharding sphere分库分表

需要物理自己实现分表分库&#xff0c;然后通过配置文件配置。 配置文件&#xff1a; 需要配置多个数据源&#xff0c;主从表的关系【默认主表修改&#xff0c;从表读取】&#xff0c;定义分库的策略【比如User id】和分表【表Id】的策略 分库和分表策略&#xff1a;分库策略…

浅谈LockBit勒索病毒

在数字时代&#xff0c;随着科技的飞速发展&#xff0c;网络安全问题愈发凸显。恶意软件和勒索软件等网络威胁正不断演变&#xff0c;其中一款备受关注的勒索软件就是LockBit。 LockBit是一种高度复杂且具有破坏性的勒索软件。与传统的勒索软件相比&#xff0c;LockBit在其攻击…

外包干了5天,技术明显退步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

国产AI视频技术迎来新成员Etna,4K 60帧 15秒超高清视频

国内AI视频技术领域传来好消息&#xff0c;一款名为Etna的AI视频生成工具引起了业界的广泛关注。这款由七火山公司开发的技术&#xff0c;号称能够实现15秒4K 60帧的超高清视频生成&#xff0c;让人眼前一亮&#xff01; &#x1f680; 国产技术的崛起 Etna的问世&#xff0c;…

【软考高项】【论文专题】- 5 - 论文写作思路梳理

目录 一、软考论文考什么&#xff1f; 二、我在项目中做什么&#xff1f; 三、项目做什么&#xff1f; 四、 项目小白常见雷区 五、如何写的不像是模版&#xff1f; 一、软考论文考什么&#xff1f; 《考试大纲》指出&#xff1a;根据试卷上给出的论文题目&#xff0c;选择…

【Linux】常用指令大全 [万字详解!建议收藏记忆!]

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

IDEA如何切换git账户

一、首先设置idea的密码不保存 二、找到你的windos的凭据管理器&#xff0c;直接在电脑里面搜索就行。 把已经有的git的凭据删掉&#xff0c;然后重启IDEA&#xff0c;拉取代码&#xff0c;就会弹框来让你输入账号。 注意&#xff1a;将系统弹出的账号密码框关掉&#xff0c;…