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 pltimg = 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 cv2print(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.hqwc.cn/news/534967.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Redis实现分布式锁、限流操作(基于SpringBoot)的实现

基于Redis实现分布式锁、限流操作——基于SpringBoot实现 本文总结了一种利用Redis实现分布式锁、限流的较优雅的实现方式本文原理介绍较为通俗&#xff0c;希望能帮到有需要的人本文的demo地址&#xff1a;https://gitee.com/rederxu/lock_distributed.git 一、本文基本实现…

迪杰斯特拉算法 代码

参考链接&#xff1a; 【路径规划】全局路径规划算法——Dijkstra算法&#xff08;含python实现 | c实现&#xff09;-CSDN博客 算法图解&#xff1a; 代码 def dijkstra(matrix, source):"""迪杰斯特拉算法实现Args:matrix (_type_): 用邻接矩阵表示带权图s…

SpringBoot(源码解析 + 实现底层机制)

文章目录 1.搭建SpringBoot底层机制开发环境1.创建maven项目2.使用Git管理项目&#xff08;可以略过&#xff09;1.创建一个github存储库2.克隆到本地&#xff0c;复制文件夹的内容3.粘贴到idea项目文件夹&#xff0c;将其作为本地仓库与远程仓库关联 3.pom.xml 引入父工程和场…

AI壁纸号一周增加上千粉丝,轻松变现的成功案例分享

前言 随着AI绘画技术的发展&#xff0c;传统的互联网副业壁纸号在新的技术加持下迎来了第二春。本文将分享一位壁纸号创作者的成功案例&#xff0c;并为大家提供创作门槛和硬件要求等相关信息。 该项目的创作门槛极低&#xff0c;基本上可以由AI完成内容创作。不过&#xff0…

LM358P/LM358DR/LM358DT/LM358DR2G运算放大器中文资料PDF数据手册引脚图功能

产品概述&#xff1a; LM358B 和 LM2904B 器件是行业标准运算放大器 LM358 和 LM2904 的下一代版本&#xff0c;其中包括两个高压 (36V) 运算放大器。这些器件为成本敏感型应用提供了卓越的价值&#xff0c;其特性包括低偏移&#xff08;300V&#xff0c;典型值&#xff09;、…

C++11新特性【右值引用】

文章目录 1. 什么是左值2. 什么是右值3. 左值引用4. 左值引用使用场景5. 右值引用6. 右值引用使用场景6.1 场景16.2 场景2 7. 完美转发 1. 什么是左值 左值不能根据字面意思来理解&#xff0c;不是说在左边的就是左值&#xff0c;例如&#xff1a; int main() {int a 0;int …

Windows11安装NodeJS18并配置环境变量

从官网下载&#xff0c;或者从百度网盘下载 解压下载的zip包&#xff1a; 重命名为nodejs&#xff1a; 在nodejs中添加cache和global两个目录&#xff1a; 将nodejs和nodejs\global添加到环境变量&#xff1a; 打开终端&#xff0c;输入&#xff1a; node -v接着配置…

高效备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

我们今天继续来随机看5道AMC10真题&#xff0c;以及详细解析&#xff0c;这些题目来自1250道完整的官方历年AMC10真题库。通过系统研究和吃透AMC10的历年真题&#xff0c;参加AMC10的竞赛就能拿到好名次。 即使不参加AMC10竞赛&#xff0c;初中和高中数学一定会学得比较轻松、…

(开源项目)OpenHarmony、社区共建Sample合入要求

1.新增Sample功能不能重复于当前已有Sample的功能&#xff1b; 2.新增Sample的工程推荐使用ArkTS语言编写&#xff1b; 3.新增Sample的工程推荐使用Stage模型编写&#xff1b; 4.新增Sample的工程中需要包含UI自动化用例&#xff08;ohosTest工程模块&#xff09;&#xff0…

浅谈船舶岸电系统绝缘监测及故障定位需求及应用

彭姝麟 Acrelpsl 0 项目背景 随着现代船舶发展&#xff0c;船舶电气化程度越来越高&#xff0c;船舶电站的的容量也越来越大&#xff0c;随之而来的是电网的绝缘问题更加复杂化。船舶电力系统一般采用IT系统&#xff0c;即不接地系统。IT系统的优点是发生单相接地时不会出现TN…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

SpringCloud Hystrix 断路器

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第五篇&#xff0c;即介绍 Hystrix 断路器。 二、概述 2.1 分布式系统面临的问题 复杂分布式体系结构中…