python图像处理Pillow学习笔记

2023-10-31

Pillow学习笔记

1.安装pillow

pip install pillow

2.图像处理简介

图像处理RGB色彩模式:

-R(red)      0--255

-G(green)  0--255

-B(blue)     0--255

像素阵列

每个点就是一个像素每个点都由(R,G,B)表示颜色

图片素材:

 

yoki.jpg

kiki.jpg

niki.jpg

3.模块介绍

A.Image模块

(1)打开图片

例:用Image打开一张图片

#导入模块
from PIL import Image
#打开图片
img=Image.open('kiki.jpg')
#显示图片
img.show()
print('图片格式:',img.format)
print('图片大小:',img.size)
print('高度:',img.height)
print('宽度:',img.width)
print('(100,100)处的RGB:',img.getpixel((100,100)))
'''
图片格式 JPEG
图片大小 (500, 330)
高度 330
宽度 500
(100,100)处的RGB (2, 6, 5)

'''

(2)混合

①透明度混合

blend(im1,im2,alpha)

im1:图1,im2:图2,alpha混合透明度(0-1)为im2的占比

注意:im1,im2的尺寸需要相同

具体混合的公式:im1*(1-alpha)+im2*alpha

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg')
#图片混合
img1add2=Image.blend(img1,img2,0.5)
#显示图片
img1add2.show()

混合结果

 

yoki+kiki

②遮罩混合

composite(im1,im2,mask)

功能:使用mask来混合处理im1,im2,要求im1,im2,mask三幅图片尺寸相同。

#导入模块
from PIL import Image
#打开图片并变成相同尺寸(这里本来就相同)
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
img3=Image.open('niki.jpg').resize(img1.size)
#把img3的rgb分离
r3,g3,b3=img3.split()
img1composite2=Image.composite(img1,img2,b3)
#显示图片
img1composite2.show()

 结果:

(3)图像缩放

①像素缩放(其实是调亮度):

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#将每个像素值扩大2倍
img1_mul2=Image.eval(img1,lambda x:x*2)
#显示图片
img1_mul2.show()

结果:

②尺寸缩放(改变大小):

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/2,img1.size[1]/2))
#显示图片大小
print('img1:',img1.size)
print('img2:',img2.size)
'''
img1: (500, 330)
img2: (250, 165)
'''

 

(4)粘贴和裁剪

①粘贴:

Image.paste(im,box=None,mask=None)

im:源图或像素值;box:粘贴区域;mask:遮罩

box:

a.(x1,y1):将图像左上角对齐(x1,y1),超出被粘贴图像区域丢弃

b.(x1,y1,x2,y2):原图像与此区域保持一致。

c.   None:原图像与被粘贴图像必须大小一致。

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/3,img1.size[1]/3))
#把img2贴到img1上
img1.paste(img2,(30,40))
img1.show()

 结果:

 

(5)图像的旋转

Image.rotate(angle,resample=0,expand=0,center=None,translate=None,fillcolor=None)

angle:旋转角度

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img1=img1.rotate(60)
img1.show()

(6)格式转换

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#上下滤镜
#img2=img1.transpose(Image.FLIP_TOP_BOTTOM)#上下
img2=img1.transpose(Image.FLIP_LEFT_RIGHT)#左右
img2=img1.transpose(Image.ROTATE_90)#旋转90度,尺寸也变
img2=img1.transpose(Image.ROTATE_180)#旋转180度
img2.show()

(7)图像分离(split),混合(merge)

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
#分离
r1,g1,b1=img1.split()
r2,g2,b2=img2.split()
tempa=[r1,g2,b1]
tempb=[r2,g1,b2]
#混合
imga=Image.merge('RGB',tempa)
imgb=Image.merge('RGB',tempb)
imga.show()
imgb.show()

(7)图像滤镜

BLUR:模糊滤波

CONTOUR:轮廓滤波

DETAIL:细节滤波

EDGE_ENHANCE:边界增强滤波

EDGE_ENHANCE_MORE:边界增强滤波(程度更深)

EMBOSS:浮雕滤波

FIND_EDGES:寻找边界滤波

SMOOTH:平滑滤波

SMOOTH_MORE:平滑滤波(程度更深)

SHARPEN:锐化滤波

GaussianBlur(radius=2):高斯模糊

例:

#导入模块
from PIL import Image,ImageFilter
#打开图片
img1=Image.open('kiki.jpg')
img1.thumbnail((img1.size[0]/3,img1.size[1]/3))
w,h=img1.size
#输出图片
img_output=Image.new('RGB',(3*w,4*h))
#高斯模糊
img1_GaussianBlur=img1.filter(ImageFilter.GaussianBlur(radius=3))
#BLUR普通模糊
img1_BLUR=img1.filter(ImageFilter.BLUR)
#DETAIL细节滤波
img1_DETAIL=img1.filter(ImageFilter.DETAIL)
#EDGE_ENHANCE:边界增强滤波
img1_EDGE_ENHANCE=img1.filter(ImageFilter.EDGE_ENHANCE)
#EDGE_ENHANCE_MORE:边界增强滤波(程度更深)
img1_EDGE_ENHANCE_MORE=img1.filter(ImageFilter.EDGE_ENHANCE_MORE)
#EMBOSS浮雕
img1_EMBOSS=img1.filter(ImageFilter.EMBOSS)
#FIND_EDGES:寻找边界滤波
img1_FIND_EDGES=img1.filter(ImageFilter.FIND_EDGES)
#SMOOTH:平滑滤波
img1_SMOOTH=img1.filter(ImageFilter.SMOOTH)
#SMOOTH_MORE:平滑滤波(程度更深)
img1_SMOOTH_MORE=img1.filter(ImageFilter.SMOOTH_MORE)
#SHARPEN:锐化滤波
img1_SHARPEN=img1.filter(ImageFilter.SHARPEN)
#CONTOUR:轮廓滤波
img1_CONTOUR=img1.filter(ImageFilter.CONTOUR)
#拼接
img_output.paste(img1,(0,0))
img_output.paste(img1_GaussianBlur,(w,0))
img_output.paste(img1_BLUR,(2*w,0))
img_output.paste(img1_DETAIL,(0,h))
img_output.paste(img1_EDGE_ENHANCE,(w,h))
img_output.paste(img1_EDGE_ENHANCE_MORE,(2*w,h))
img_output.paste(img1_EMBOSS,(0,2*h))
img_output.paste(img1_FIND_EDGES,(w,2*h))
img_output.paste(img1_SMOOTH,(2*w,2*h))
img_output.paste(img1_SMOOTH_MORE,(0,3*h))
img_output.paste(img1_SHARPEN,(w,3*h))
img_output.paste(img1_CONTOUR,(2*w,3*h))
img_output.show()

结果:

不想学了,我去打游戏了,过两天继续

继续继续

(8)图像整体运算

from PIL import ImageEnhance,Image

im1=Image.open('kiki.jpg')
out=im1.point(lambda i:i*2)#图片整体变亮
out.show()

 

 

B.ImageChops模块

(1)图片相加

ImageChops.add(im1,im2,scale=1.0,offset=0)

计算公式:

out=((im1+im2)/scale+offset)

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')

out=ImageChops.add(im1,im2,1,0)
out.show()

(2)图片相减

ImageChops.subtract(im1,im2,scale=1.0,offset=0)

计算公式:

out=((im1-im2)/scale+offset)

(3)图片变暗

ImageChops.darker(im1,im2)

比较两图片像素,取对应像素值的较小值然后保留,从而去除亮的部分

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')

out=ImageChops.darker(im1,im2)
out.show()

(4)图片变亮

ImageChops.lighter(im1,im2)

比较两图片像素,取对应像素值的较大值然后保留,从而去除暗的部分

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')

out=ImageChops.lighter(im1,im2)
out.show()

(5)屏幕函数

ImageChops.screen(im1,im2)

先反色后叠加,类似于将两张幻灯片用两台投影仪投影到一个屏幕上

计算公式:

out=MAX-((MAX-im1)*(MAX-im2)/MAX)

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')

out=ImageChops.screen(im1,im2)
out.show()

(6)反色函数

ImageChops.invert(im1)

计算公式:out=255-im1

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
out=ImageChops.invert(im1)
out.show()

(7)比较函数

ImageChops.difference(im1,im2)

做减法操作取绝对值

计算公式:

abs(im1-im2)

from PIL import ImageChops,Image

im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')

out=ImageChops.difference(im1,im2)
out.show()

B.ImageEnhance模块(图像增强)

使用方法:

image_enhance=ImageEnhance.XXX(img)(获取XXX调整器)

im=image_enhance.enhance(0~2)   0~1减弱,1~2增强

(1)获取色彩调整器

ImageEnhance.Color(im)

(2)获取对比度调整器

ImageEnhance.Contrast(im)

(3)获取亮度调整器

ImageEnhance.Brightness(im)

(4)获取清晰度调整器

ImageEnhancd.Sharpness(im)

from PIL import ImageEnhance,Image

im1=Image.open('kiki.jpg')
im1.thumbnail((im1.size[0]/3,im1.size[1]/3))
w,h=im1.size
out=Image.new('RGB',(3*w,4*h))
#获取色彩调整器对象
im_color=ImageEnhance.Color(im1)
im_color_a=im_color.enhance(1.5)
im_color_b=im_color.enhance(0.5)

#获取对比度调整器对象
im_contrast=ImageEnhance.Contrast(im1)
im_contrast_a=im_contrast.enhance(1.5)
im_contrast_b=im_contrast.enhance(0.5)

#获取亮度调整器对象
im_brightness=ImageEnhance.Brightness(im1)
im_brightness_a=im_brightness.enhance(1.5)
im_brightness_b=im_brightness.enhance(0.5)

#获取锐度调整器对象
im_sharpness=ImageEnhance.Sharpness(im1)
im_sharpness_a=im_sharpness.enhance(1.7)
im_sharpness_b=im_sharpness.enhance(0.2)

out.paste(im1,(0,0))
out.paste(im_color_a,(w,0))
out.paste(im_color_b,(2*w,0))

out.paste(im1,(0,h))
out.paste(im_contrast_a,(w,h))
out.paste(im_contrast_b,(2*w,h))

out.paste(im1,(0,2*h))
out.paste(im_brightness_a,(w,2*h))
out.paste(im_brightness_b,(2*w,2*h))

out.paste(im1,(0,3*h))
out.paste(im_sharpness_a,(w,3*h))
out.paste(im_sharpness_b,(2*w,3*h))

out.show()

 

C.ImagDraw模块(图像绘制)

这个地方由手就行,不看了就引用一位大佬的博客===》》链接

今天先弄到这。。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python图像处理Pillow学习笔记 的相关文章

  • 使用 Python Multiprocessing Pool.map() 的问题在 Python 3.7.2 中变得棘手,但在 3.6.2 中很快完成

    我刚刚将Python从3 6 2 gt 3 7 2并且遇到了问题multiprocessing图书馆 我在 Django 应用程序中使用它 该应用程序在工作函数中使用 Django 特定的函数 见下文 在我的代码中 我有以下内容 impor
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • Python 转换矩阵

    我有一个如下所示的列表 2 1 3 1 2 3 1 2 2 2 我想要的是一个转换矩阵 它向我显示如下序列 1 后跟 1 的频率是多少 1 后面跟着 2 的频率是多少 1 后跟 3 的频率是多少 2 后跟 1 的频率是多少 2 后跟 2 的
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 为什么在访问 Python 对象属性时使用 getattr() 而不是 __dict__ ?

    在具有一定程度的 Python 对象自省的源代码示例和 SO 答案中 常见的模式是 getattr some object attribute name string 是否有理由优先选择这种模式 some object dict attri
  • 将 Python Pandas DataFrame 写入 Word 文档

    我正在努力创建一个使用 Pandas DataFrames 的 Python 生成的报告 目前我正在使用DataFrame to string 方法 但是 这会作为字符串写入文件 有没有办法让我实现这一目标 同时将其保留为表格 以便我可以使
  • 无法在 virtualenv 中安装 libxml2

    我有一个问题libxml2蟒蛇模块 我正在尝试将其安装在python3 虚拟环境使用以下命令 pip install libxml2 python3 但它显示以下错误 Collecting libxml2 python3 Using cac
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • Django 多对多关系(类别)

    我的目标是向我的 Post 模型添加类别 我希望以后能够按不同类别 有时是多个类别 查询所有帖子 模型 py class Category models Model categories 1 red 2 blue 3 black title
  • 类型错误:此 COM 对象无法自动执行 makepy 过程 - 请为此对象手动运行 makepy

    这是什么错误 回溯错误 C Users DELL PycharmProjects MyNew venv Scripts python exe C Users DELL PycharmProjects MyNew agaaaaain py T
  • 如何用正则表达式替换多个匹配/组?

    通常我们会编写以下内容来替换一场比赛 namesRegex re compile r is life re I replaced namesRegex sub r butter There is no life in the void pr
  • Python-验证我的文档 xls 中是否存在工作表

    我正在尝试在空闲时间设计一个小程序 加载 xls 文件 然后在要扫描的文档中选择一张纸 步骤1 用户导入 xls文件 导入程序后检查文件是否存在 我能做到的 第 2 步 我要求用户提供要分析的文档表 xls 的名称 这就是它停止的地方 该程
  • 使用 if 语句的网格网格和用户定义函数的真值不明确

    假设我有一个函数f x y 足够光滑 然而 有些值仅在有限的意义上存在 以sin x x的价值x 0只存在于极限 x gt 0 中 在一般情况下 我用一个来处理这个问题if陈述 如果我在情节中使用它meshgrid我收到一条错误消息 Val
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to

随机推荐

  • 计算机一级2010的试题,全国计算机等级考试一级office2010试题

    计算机一级是要求考生对基础的计算机知识进行掌握 下面给大家整理了全国计算机等级考试一级office2010试题 欢迎阅读 全国计算机等级考试一级office2010试题 选择题答案 1 5 C A D B B 6 10 B C D B D
  • Qt项目实战2:图片查看器QImageViewer

    在博文Qt学习笔记2 QMainWindow和QWidget的区别中介绍了使用空的Qt项目创建带有菜单栏 工具栏的界面 这里 使用一个简单的图片查看器项目 来熟悉一下Qt的图片显示和基本操作 该项目实现的主要功能 实现图片的打开 关闭 居中
  • Head First Design Mode(12)-状态模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 状态模式 状态模式和策略模式是 双胞胎 在出生时才分开 策略模式是围绕可以互换的算法来创建成功业务的 状态模式则是通过改变对象内部的状态来帮助对象控制自己的行为 状态
  • 麻雀虽小五脏俱全,中小企业的知识管理须重视

    编者按 在知识资产越来越重要的市场发展环境下 做好企业知识管理对中小企业来说十分重要 本文从企业知识管理的重要性说起 分析了现代中小企业面临的知识管理困境 并进一步提出天翎KMS是如何帮助企业突破这种困境的 概要 1 知识管理的重要性 2
  • 表白墙 -- 前后端代码详解

    表白墙 前后端代码详解 一 前端 二 后端实现 2 1 需求 2 2 创建项目及初始化 2 3 实现提交数据 存档 2 3 1 实现 doPost 2 3 2 构造请求 修改 html 文件 2 3 3 验证 2 4 实现获取数据 读档 2
  • ubuntu-tensorflow环境配置

    前言 刚接触ubuntu和深度学习框架的时候 都可能不清楚 为什么要用ubuntu系统 windows不是很好用吗 其实很多的开发是基于linux系统的 不一定是ubuntu 但是ubuntu是大家比较熟悉的 开源的系统 pc上认为wind
  • 全桥逆变电路

    全桥逆变电路知识汇总 每一部分详细可以点击对应的下方链接 单元一 全桥逆变电路的驱动部分 驱动部分 单元二 全桥逆变电路MOS IGBT管搭建 桥式电路 单元三 阻抗匹配电路 阻抗匹配 对全桥逆变电路知识感兴趣的可以咨询博主QQ 28593
  • HDU6703 Fishing Master

    比赛的时候想的是尽量先炖鱼 果然还是赛后牛逼 反应过来无论怎样总时间内一定有所有的炖鱼时间 所以只需要尽量缩减我们的钓鱼时间即可 一 在炖鱼时间内可以把所有鱼都钓上来 那ans k t 1 n 二 不能在炖鱼时间内把所有鱼都钓上来 即每次钓
  • 小学生学Arduino---------点阵(三)动态的显示与清除

    学习目标 1 理解 整数值 的概念与使用 2 理解 N 1 指令的意义 3 掌握 反复执行多次 指令的使用 4 掌握屏幕模块的清除功能指令 5 理解 反复执行 指令与 反复执行多次 指令的嵌套使用 6 搭建电路图 7 编写程序 效果 整数包
  • 物联网LoRa系列-7:LoRa终端模组ASR6505详解

    1 ASR6505简介 在2018年 Semtech公司推出了在综合性能上优于SX1278 SX1276射频收发器的SX1268 SX1262射频收发器 各大厂商也纷纷开始根据新的射频收发器来升级方案 意在取代性能无法适应市场的SX1278
  • stm32f103串口接收队列,DMA循环模式+空闲中断

    串口通讯最主要的就是要不丢数据 不丢帧 基本设想就是建立一个大的串口缓冲区 串口接收到的数据使用循环队列的方式全部往这个缓冲区放 不过这种方式需要把串口缓冲区弄大一点 防止数据覆盖 在stm32中 利用DMA 空闲中断很容易做到这一点 只需
  • Iterm2使用指南

    Iterm2使用指南 1 安装iterm2 官网直接下载安装 官网 2 个性化设置 iterm2 gt preferences gt profiles 点击新建一个profile 下面可以设置透明度 模糊度 背景图片 设置窗口的主题配色 下
  • jlpt报名系统显示网络错误和服务器忙,【JLPT】12月日语等级考试报名经验与技巧...

    2017年12月日语能力考 JLPT 报名日期即将到来 N1考试 8月28日 N2考试 8月29日 其他级别考试 8月31日 这次日语考试报名的 抢椅子 大战即将展开 为了能够顺利地抢到考位 未名天日语小编还是建议大家提前做好一切报名前的准
  • CSDN-markdown编辑器指导文件

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • SpringBoot+Vue+Uniapp搭建的Java版本的ChatGPT智能Ai对话系统

    chatgpt java system 介绍 SpringBoot Vue Uniapp搭建的Java版本的ChatGPT智能Ai对话系统 小程序和H5包含智能Ai对话 精美Ai壁纸 知识付费商城 积分 会员 分享等公功能 后端管理包括系统
  • 虚拟存储器

    文章目录 虚拟存储器 一 虚拟存储器概述 二 页式虚拟存储器 例题分析 三 段式与段页式虚拟存储器 虚拟存储器 一 虚拟存储器概述 1 引入原因 高速的主存容量满足不了要求 虚拟存储器 在操作系统及辅助硬件的管理下 由主存和大容量外存所构成
  • R语言入门——笔记(二)--包(package)的使用及RStudio的使用,加载包和数据集

    一 1 包 package 的使用 包是扩展R基本功能的机制 集成了众多函数 如果想使用某些函数而当前R中不存在 就可以找对应函数的包直接使用 去哪里找包 如何使用包 CRAN install packages Bioconductor G
  • unity3d GUI.Button 自定义字体大小及透明背景

    代码 public class MyButton MonoBehaviour public Texture buttonTexture Use this for initialization void Start Update is cal
  • 【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】课程设计报告大纲

    1 摘要 研究现状 对本设计模型的介绍 2 目录 自动生成即可 3 概述 3 1 课程设计背景 该设计的应用现状 针对应用部分 3 2 国内外研究背景 对该设计的研究状况 针对学术研究 3 3 报告组织形式 介绍本报告的框架结构 4 系统模
  • python图像处理Pillow学习笔记

    Pillow学习笔记 1 安装pillow pip install pillow 2 图像处理简介 图像处理RGB色彩模式 R red 0 255 G green 0 255 B blue 0 255 像素阵列 每个点就是一个像素每个点都由