jupyter notebook中3种读图片的方法_与_图片翻转(上下翻转,左右翻转,上下左右翻转)

news2025/2/20 20:03:33

已有图片cat.jpg

image-20250211143332537

相对于代码的位置,可以用./cat.jpg进行读取。

下面是3种读图片的方法。

1.python读图片-pillow

图片文件不适合用open去读取

用open读图片,易引发UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence错误。

PIL 是 Python Imaging Library 的缩写,它是一个非常流行的图像处理库,提供了广泛的图像处理功能,比如打开、保存、转换、调整大小、裁剪、旋转等操作。

然而,PIL 本身已经不再更新和维护,取而代之的是一个称为 Pillow 的库。Pillow 是 PIL 的一个友好的分支和升级版本,现如今它是使用 PIL 功能的标准库。


Pillow读图片

安装依赖(Jupyter notebook)

! pip install Pillow
image-20250211143805172

导入依赖读图片:

from PIL import Image
cat = Image.open('./cat.jpg')
cat
image-20250211143920163

补充:不同格式的图片

JPG 或 JPEG(Joint Photographic Experts Group)是广泛使用的图像压缩格式,主要用于存储彩色照片。

JPEG 图像采用的是8位颜色深度的表示方式。(0-255)

每个颜色通道(红色、绿色、蓝色)都使用一个 8-bit 数值来表示,即 0 到 255 之间的整数。每个像素由三个颜色通道组成(RGB 模式),每个通道的值都在 0 到 255 之间。这里的 0 代表最暗的颜色,255 代表最亮的颜色。

  • 例如,一个红色像素的 RGB 值可能是 (255, 0, 0),表示完全的红色,绿色和蓝色通道的值是 0。

JPG 图像通常使用压缩算法对数据进行有损压缩,因此它的文件体积较小,但也会牺牲一些图像的细节和质量。


PNG(Portable Network Graphics)是一种无损压缩格式,常用于需要保持透明度的图像(例如网页上的图标、图像等)。PNG 支持不同的颜色深度,可以是 8位16位,但通常以 8位 来存储 RGB 图像数据。并且,PNG 格式的图像可以包含 透明通道(即 RGBA 模式,其中 A 表示透明度)。

  • 像素值范围:PNG 图像通常使用浮点数表示像素的颜色值,范围从 0 到 1。例如,每个颜色通道(R、G、B)的像素值被表示为 0 到 1 之间的小数值,这种方式是浮动值而非整数值。
    • 例如,一个红色像素的 RGB 值可能是 (1.0, 0.0, 0.0),表示完全的红色,绿色和蓝色通道的值是 0。这些值是浮动的,而不是整数形式。

PNG 是一种 无损压缩格式,即不会丢失任何图像细节。虽然它可能比 JPG 图像更大,但保留了原始图像的所有信息。


总结:

JPG/JPEG:使用 0 到 255 范围的整数来表示图像中的每个像素的 RGB 值,适合压缩图像(有损压缩)。

PNG:使用 0 到 1 之间的小数值来表示图像中的每个像素的 RGB 值,适合需要高质量和无损压缩的图像,特别是在透明通道的处理中。


对图片进行简单操作

type(cat)  # PIL.JpegImagePlugin.JpegImageFile

cat.size # (730, 456)

补充:

cat.size: 这是 PillowImage 对象的一个属性,返回图像的尺寸信息。具体来说,cat.size 返回一个元组 (width, height),其中:

  • width 是图像的宽度(以像素为单位)
  • height 是图像的高度(以像素为单位)
cat.mode # 'RGB'

补充:

除了 RGB,Pillow 还支持多种颜色模式,每种模式有不同的表示方式和用途。例如:

  • ‘L’:灰度模式(Luminance),表示图像是灰度图像,每个像素只有一个通道,范围是 0 到 255。
  • ‘RGBA’:RGBA 模式表示图像包含红、绿、蓝和透明度(Alpha)通道。每个像素由四个通道的值组成,透明度通道用于表示图像的透明部分。
  • ‘CMYK’:印刷领域使用的颜色模式,表示青色(Cyan)、品红(Magenta)、黄色(Yellow)和黑色(Key)。
  • ‘1’:黑白模式,每个像素只有两个值:0(黑色)和 1(白色)。
cat.getchannel(2)
image-20250211144700659

cat.getchannel(2) 是用于从图像中提取指定通道的一个方法。这里的 2 表示我们要获取图像中的第三个颜色通道。

  • 0:红色通道 ®
  • 1:绿色通道 (G)
  • 2:蓝色通道 (B)

如果图像是 RGBA 模式(即包含透明通道的图像),通道索引 0123 分别代表红色、绿色、蓝色和透明度(Alpha)通道。


可以直接通过np.array把pillow读取的image对象转换成ndarray

import numpy as np
catArr = np.array(cat)
image-20250211144928116

注意:

cat.size
catArr.shape
image-20250211145021889

cat.size(来自 PIL.Image 对象),图像的尺寸(宽度和高度),表示图像的大小(以像素为单位)。

catArr.shape(来自 numpy 数组),数组的形状(即数组的维度信息)。在将 PIL.Image 对象转换为 numpy 数组后,图像数据就被存储为一个 多维数组

456:图像的 高度(行数)

730:图像的 宽度(列数)

3:表示图像是 RGB 格式,每个像素包含 3 个颜色通道(红色、绿色、蓝色),因此是一个 3 通道的彩色图像。

即:

catArr.shape 返回的是 numpy 数组的形状,它包含三个维度:

  • 第一个维度:图像的高度(即行数)
  • 第二个维度:图像的宽度(即列数)
  • 第三个维度:图像的颜色通道数(对于 RGB 图像是 3)

2.opencv读图片

下载依赖(如果有必要,重启内核),下面指定了下载源—豆瓣

注:

豆瓣源: https://pypi.douban.com/simple

清华源: https://pypi.tuna.tsinghua.edu.cn/simple

!pip install opencv-python -i https://pypi.douban.com/simple
image-20250211145453145

导入依赖读图片:

import cv2
cat_cv = cv2.imread('./cat.jpg')
image-20250211145611010

opencv默认的颜色空间是BGR

展示图片:

cv2.imshow('cat', cat_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()

会有弹窗:

image-20250211145710266

注:

1.cat_cv 是一个 NumPy 数组

2.cv2.imshow() 用来在一个窗口中显示图像。它的第一个参数是窗口的名称(在这里是 'cat'),第二个参数是要显示的图像数据(cat_cv)。

3.cv2.waitKey(0) 会暂停程序的执行,等待用户在显示图像窗口中按下任意键。如果传入的参数是 0,表示无限期等待直到用户按下一个键。如果传入的是正整数参数,表示等待指定的毫秒数。如果在这段时间内用户按下键,则继续执行程序。通常用于处理图像时添加时间延迟。

4.cv2.destroyAllWindows() 会关闭所有由 cv2.imshow() 打开的窗口。在图像显示完并等待按键后,调用此函数来销毁所有显示的 OpenCV 窗口。

3.matplotlib读取图片

导入依赖:

import matplotlib.pyplot as plt

读图片:

cat_plt = plt.imread('./cat.jpg')
image-20250211150530460

可以看出,也是RGB模式。

展示图片:

plt.imshow(cat_plt)
image-20250211150635443

输出 <matplotlib.image.AxesImage at 0x1224862b0>,这表示你在图像显示过程中实际上得到了一个 AxesImage 对象。它是 matplotlib 用来表示图像数据的对象类型。

<matplotlib.image.AxesImage at 0x1224862b0>:这是 Python 解释器打印出来的对象的字符串表示。它显示了 AxesImage 对象的类型和内存地址(这里是 0x1224862b0)。每次你创建新的图像对象时,内存地址会不同,因此这里的地址可能会发生变化。

如果不希望显示,则加一句plt.axis('off')即可。


对图片进行翻转

如何上下翻转, 左右翻转, 上下左右都翻转?颜色翻转?

实质就是操作NumPy数组

注意维度信息:

cat_plt.shape   # (456, 730, 3)   456高,730宽,3颜色
# 上下
plt.imshow(cat_plt[::-1])
image-20250211151912082
# 左右
plt.imshow(cat_plt[::,::-1])
image-20250211151927884
# 上下左右都翻转
plt.imshow(cat_plt[::-1,::-1])
image-20250211151943630
# 颜色翻转---》R和B两个转换下
plt.imshow(cat_plt[::,::,::-1])
image-20250211152005377

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

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

相关文章

微软官方出品GPT大模型编排工具:7个开源项目

今天一起盘点下&#xff0c;12月份推荐的7个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、一个浏览器自动化操作的.Net开源库 这是一个基于 Google 开源的 Node.js 库 Puppeteer 的 .NET 开源库&#xff0c;方便开发人员使用无头 Web 浏览器抓取 Web、检索 Ja…

机器视觉--Halcon变量的创建与赋值

一、引言 在机器视觉领域&#xff0c;Halcon 作为一款强大且功能丰富的软件库&#xff0c;为开发者提供了广泛的工具和算子来处理各种复杂的视觉任务。而变量作为程序中存储和操作数据的基本单元&#xff0c;在 Halcon 编程中起着至关重要的作用。正确地创建和赋值变量是编写高…

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…

GBD研究——美国州级地图(附资源)

美国州级别地图 地图源很多&#xff0c;随便下载。不过我试了两个资源&#xff0c;发现有的资源会漏掉阿拉斯加和夏威夷。 就剩大的这块佩奇 出现这样的问题&#xff0c;要么跟数据源有关&#xff0c;要么就是要掉地名来看&#xff0c;是不是没匹配上。 亲自试过&#xff0c…

【微服务学习一】springboot微服务项目构建以及nacos服务注册

参考链接 3. SpringCloud - 快速通关 springboot微服务项目构建 教程中使用的springboot版本是3.x&#xff0c;因此需要使用jdk17&#xff0c;并且idea也需要高版本&#xff0c;我这里使用的是IDEA2024。 环境准备好后我们就可以创建springboot项目&#xff0c;最外层的项目…

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins&#xff1b; 2.支持自定义启动参数&#xff1b; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址&#xff1a;https://get.j…

3D打印技术:如何让古老文物重获新生?

如何让古老文物在现代社会中焕发新生是一个重要议题。传统文物保护方法虽然在一定程度上能够延缓文物的损坏&#xff0c;但在文物修复、展示和传播方面仍存在诸多局限。科技发展进步&#xff0c;3D打印技术为古老文物的保护和传承提供了全新的解决方案。我们来探讨3D打印技术如…

Vue h函数到底是个啥?

h 到底是个啥&#xff1f; 对于了解或学习Vue高阶组件&#xff08;HOC&#xff09;的同学来说&#xff0c;h() 函数无疑是一个经常遇到的概念。 那么&#xff0c;这个h() 函数究竟如何使用呢&#xff0c;又在什么场景下适合使用呢&#xff1f; 一、h 是什么 看到这个函数你可…

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中&#xff0c;日志&#xff08;Logging&#xff09;是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题&#xff0c;还能提供丰富的数据支持&#xff0c;让应用更具可观测性。本文将带你全面了解 Python logging 模块&#xff0c;涵盖…

Android WindowContainer窗口结构

Android窗口是根据显示屏幕来管理&#xff0c;每个显示屏幕的窗口层级分为37层&#xff0c;0-36层。每层可以放置多个窗口&#xff0c;上层窗口覆盖下面的。 要理解窗口的结构&#xff0c;需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、T…

2025年最新版1688平台图片搜索接口技术指南及Python实现

随着电商行业的蓬勃发展&#xff0c;1688作为国内领先的B2B交易平台&#xff0c;其商品搜索功能对于买家和卖家而言都至关重要。图片搜索作为其中的一种高级搜索方式&#xff0c;能够极大地提升用户的搜索体验和准确性。本文将详细介绍如何通过API接口实现1688平台的图片搜索功…

基于A*算法与贝塞尔曲线的路径规划与可视化:从栅格地图到平滑路径生成

引言 在机器人导航、自动驾驶和游戏开发等领域,路径规划是一个核心问题。如何高效地找到从起点到终点的最优路径,并且确保路径的平滑性和安全性,是许多应用场景中的关键挑战。本文将介绍一种结合A算法和贝塞尔曲线的路径规划方法,并通过Pygame实现可视化。我们将从栅格地图…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下&#xff0c; width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框&#xff08;border&#xff09;和内边距&#xff08;padding&…

贪心算法_翻硬币

蓝桥账户中心 依次遍历 不符合条件就反转 题目要干嘛 你就干嘛 #include <bits/stdc.h>#define endl \n using namespace std;int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s;string t; cin >> t;int ret 0;for ( i…

深入HBase——引入

引入 前面我们通过深入HDFS到深入MapReduce &#xff0c;从设计和落地&#xff0c;去深入了解了大数据最底层的基石——存储与计算是如何实现的。 这个专栏则开始来看大数据的三驾马车中最后一个。 通过前面我们对于GFS和MapReduce论文实现的了解&#xff0c;我们知道GFS在数…

2025年02月12日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator 项目语言&#xff1a;TypeScript 历史star数&#xff1a;4427 今日star数&#xff1a;729 项目维护者&#xff1a;danmarshall, Chenglong-MS, apps/dependabot, mi…

【落羽的落羽 数据结构篇】双向链表

文章目录 一、链表的分类二、双向链表1. 结构2. 申请一个新节点3. 尾部插入数据4. 头部插入数据5. 尾部删除数据6. 头部删除数据7. 在指定位置之后插入数据8. 删除指定位置节点9. 销毁链表 一、链表的分类 链表的分类实际上要从这三个方向分析&#xff1a;是否带头、单向还是双…