pil 图像最大值_第97天:图像库 PIL(二)

d90ff10d649d3dbe79b5e34c4b8f0b46.png

上节我们讲了 Python 的图像处理库 PIL 的基本图像处理功能,打开了 PIL 的神秘面纱。这节我们接着讲 PIL 的 Image 模块的常用方法。

Image 模块的方法

convert

Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)

参数说明:

  • mode:转换的模式
  • matrix:可选转变矩阵。如果给出,必须为包含浮点值长为 4 或 12 的元组。
  • dither:抖动方法。RGB 转换为 P;RGB 或 L 转换为 1 时使用。有 matrix 参数可以无 dither。参数值 NONE 或 FLOYDSTEINBERG(默认)。
  • palette:调色板,在 RGB 转换为 P 时使用, 值为 WEB 或 ADAPTIVE 。
  • colors:调色板的颜色值,默认 256.

转换图片模式,它支持每种模式转换为"L" 、 "RGB"和 "CMYK"。有 matrix 参数只能转换为"L" 或 "RGB"。当模式之间不能转换时,可以先转换 RGB 模式,然后在转换。色彩模式转换为 L 模式计算公式 如下:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

我们一般使用时,只用传需要转换的 mode 即可,其他的可选参数需要先理解图片深层次的原理后才可以理解,大家如果感兴趣可以去深入了解一下。下面我们来看一个简单实例:

from PIL import Imageim = Image.open('cat.png')im.show()# 将图像转换成黑白色并返回新图像im1 = im.convert('L')im1.show()

我们将一个图像转换成 L模式(灰色),转换结果如下图所示:

f7e3edb446bc777865a9dcb745e55e0e.png

copy

Image.copy()

复制图像方法,该方法完全复制一个一模一样的图像,很好理解,我们就不举例说明了。

crop

Image.crop(box)

参数说明:

  • box:相对图像左上角坐标为(0,0)的矩形坐标元组, 顺序为(左, 上, 右, 下)

该方法从图像中获取 box 矩形区域的图像,相当于从图像中抠一个矩形区域出来。我们来看例子:

from PIL import Imageim = Image.open('cat.jpg')print(im.size)im.show()# 定义了图像的坐标位置,从左、上、右、下box = (100, 100, 250, 250)# 它会从左上角开始,同时向下和向右移动100像素的位置开始截取250-100的像素宽高,也就是150x150的图像# 这里注意后两个数值要大于前两个数值,不然截取后的图像宽高为负数,会报错region = im.crop(box)print(region.size)region.show()# 输出结果(451, 300)(150, 150)

我们从 cat.jpg 这张图片中截取了 150x150 的图像,从打印结果可以看到截取前和截取后的图像大小。两张图像的对比如下图:

0e09e83b9bd6b17129c488d874440c55.png

filter

Image.filter(filter)

参数说明:

  • filter:过滤内核

使用给定的筛选器筛选此图像。有关可用筛选器的列表:

筛选器名称说明
BLUR模糊滤波,处理之后的图像会整体变得模糊。
CONTOUR轮廓滤波,将图像中的轮廓信息全部提取出来。
DETAIL细节增强滤波,会使得图像中细节更加明显。
EDGE_ENHANCE边缘增强滤波,突出、加强和改善图像中不同灰度区域之间的边界和轮廓的图像增强方法。
EDGE_ENHANCE_MORE深度边缘增强滤波,会使得图像中边缘部分更加明显。
EMBOSS浮雕滤波,会使图像呈现出浮雕效果。
FIND_EDGES寻找边缘信息的滤波,会找出图像中的边缘信息。
SHARPEN锐化滤波,补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。
SMOOTH平滑滤波,突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量。
SMOOTH_MORE深度平滑滤波,会使得图像变得更加平滑。

看到这些,大家是不是联想到我们手机上一些 APP 的图像处理功能了,其实那些功能的实现方式跟我们这里讲的方法是一样的。我们来看个例子:

from PIL import Imagefrom PIL import ImageFilterim = Image.open('flower.jpg')im.show()# 模糊im2 = im.filter(ImageFilter.BLUR)im2.show()# 轮廓滤波im3 = im.filter(ImageFilter.CONTOUR)im3.show()# 细节增强im4 = im.filter(ImageFilter.DETAIL)im4.show()

我们分别对原图了使用了模糊滤波、轮廓滤波、细节增强滤波的处理,大家运行程序就可以看到处理后的效果了,如下图所示:

f9aa07aa2500265075cd98633936206d.png

getbands

Image.getbands()

返回一个包含此图像中每个通道名称的元组。直接看实例:

from PIL import Image# 打开图像im = Image.open('cat.jpg')# 创建新图像im1 = Image.new('L', (450, 450), 50)# 获取图像的通道名称元组print(im.getbands())print(im1.getbands())# 输出结果('R', 'G', 'B')('L',)

上例中,我们分别打开一个 RGB 图像和创建一个 L 模式的新图像,然后打印输出他们的通道名称。

getbbox

Image.getbbox()

计算图像中非零区域的边界框。将边界框作为定义左、上、右和下像素坐标的四元组返回。我们来看例子:

from PIL import Image# 打开图像(451x300)im = Image.open('cat.jpg')# 创建新图像(450x450)im1 = Image.new('L', (450, 450), 50)# 打印图像中非零区域的边界框print(im.getbbox())print(im1.getbbox())# 输出结果(0, 0, 451, 300)(0, 0, 450, 450)

这个方法很简单,很容易理解,那么这个方法有什么用处呢?最直接的一个用处就是迅速地获取图像的边界坐标。

getcolors

Image.getcolors(maxcolors=256)

参数说明:

  • maxcolors:最大颜色数。默认限制为256色。

获取图像中颜色的使用列表,超过 maxcolors 设置值返回 None 。返回值为 (count, pixel) 的列表,表示(出现的次数,像素的值)

from PIL import Imageim = Image.open('cat.png')# 将彩色图像转换成灰度图im2 = im.convert("L")# 打印灰度图的颜色列表,返回的点数超过maxcolors就直接返回Noneprint(im2.getcolors(maxcolors=200))print(im2.getcolors(maxcolors=255))# 输出结果None[(1, 0), (69, 1), (275, 2), (518, 3), (165, 4), ... (6, 250), (1, 251)]

我们这个图像有252个像素值,所以第一次 maxcolors 设置为200时,由于 252>200,所以返回了 None。第二次设置255时,正常返回。

getdata

Image.getdata(band=None)

参数:

  • band:获取对应通道值。如:RGB 图像像素值为 (r,g,b) 的元组,要返回单个波段,请传递索引值(例如0,从 RGB 图像中获取 R  波段)。

获取图像中每个像素的通道对象元组,像素获取从左至右,从上至下。

getextrema

Image.getextrema()

获取图像中每个通道的最小值与最大值。对于单波段图像,包含最小和最大像素值的2元组。对于多波段图像,每个波段包含一个2元组的元组。

getpixel

Image.getpixel(xy)

参数:

  • xy:坐标,以(x,y)表示。

通过传入坐标返回像素值。如果图像是多层图像,则此方法返回元组。

point

Image.point(lut, mode=None)

参数说明:

  • lut:一个查找表,包含图像中每个波段的256个(或65536个,如果 self.mode==“I” 和 mode==“L”)值。可以改用函数,它应采用单个参数。对每个可能的像素值调用一次函数,结果表将应用于图像的所有带区。

  • mode:输出模式(默认与输入相同)。只有当源图像具有模式 “L” 或 “P” ,并且输出具有模式 “1” 或源图像模式为 “I” ,并且输出模式为 “L” 时,才能使用此选项。

对图像的的每个像素点进行操作,返回图像的副本。

from PIL import Imageim = Image.open('cat.png')# 调整灰色图像的对比度im_point=im.convert('L').point(lambda i: i < 80 and 255)im_point.show()source = im.split()# 三通道分别处理对比度band_r = source[0].point(lambda i: i < 80 and 255)band_g = source[1].point(lambda i: i < 80 and 255)band_b = source[2].point(lambda i: i < 80 and 255)band_r.show()band_g.show()band_b.show()

在例子中,我们先将图像转换成 L 模式,然后调整对比度,以及将图像的三个通道分别调整对比度。所谓调整对比度,我们这个例子的规则就是当像素值小于80时,将其调整为255,相当于将接近黑色的像素点加黑,使其与浅色对比更明显。运行效果如下图:

aa28236bdb562f1adb0a5086ed15eedb.png

resize

Image.resize(size, resample=0, box=None)

参数说明:

  • size:以像素为单位的请求大小,作为2元组:(宽度、高度)。
  • resample:可选的重新采样滤波器。可以是 PIL.Image.NEAREST(最近滤波) , PIL.Image.ANTIALIAS (平滑滤波), PIL.Image.BILINEAR (双线性滤波), PIL.Image.HAMMING , PIL.Image.BICUBIC (双立方滤波)。如果省略,或者图像具有模式 “1” 或 “P” ,则设置为 PIL.Image.NEAREST 。-box:一个可选的4元组的浮点数,给出了应该缩放的源图像区域。值应在(0,0,宽度,高度)矩形内。如果省略或没有,则使用整个源。

这个方法是获取调整大小后的图片。通俗地讲就是在原图中抠一个矩形区域(如果传入了 box 参数),然后对抠出来的区域进行滤波处理(如果传入了 resample 参数),最后以指定的 size 大小进行返回。

from PIL import Imageim = Image.open('flower.jpg')img1 = im.resize((250, 250), Image.BILINEAR)img2 = im.resize((250, 250), Image.BICUBIC)img3 = im.resize((250, 250), Image.NEAREST)im.show()img1.show()img2.show()img3.show()

这几个滤波器的具体的原理比较理论,大家对照着程序运行返回自行去深入了解。

关于 PIL 的 Image 模块的方法我们只讲这么多,还有好多其他方法,大家可参照 https://www.osgeo.cn/pillow/reference/ 这个网站去尝试。

我们讲的 PIL 的 Image 模块只是 PIL 的一个基础模块而已,它还有好多其他的模块,诸如 ImageChops (通道操作模块)、ImageColor (颜色转换模块)、ImageDraw (二维图形模块)等,大家在需要的时候可以去查找 API 使用。

总结

pillow 库是一个非常强大的基础图像处理库,若不深入图像处理,运用这个库里面的方法组合,对图像进行各种常见的操作已经够用,这是计算机图片识别的基础。当然,如果需要更专业的操作,那么就直接上 opencv 吧。

参考

https://www.osgeo.cn/pillow/reference/

文中示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-097

系列文章

第96天:图像库 PIL(一)第95天:StringIO & BytesIO第94天:数据分析之 pandas 初步第93天:文件读写第92天:Python Matplotlib 进阶操作第91天:Python matplotlib introduction从 0 学习 Python 0 - 90 大合集总结PS:公号内回复 :Python,即可进入Python 新手学习交流群,一起100天计划!-END-Python 技术关于 Python 都在这里a95be1217efe5541bc1978275a17a26e.png

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

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

相关文章

c#的委托用法delegate

转载于:https://www.cnblogs.com/douzujun/p/6555886.html

np读取csv文件_被 Pandas read_csv 坑了

-- 不怕前路坎坷&#xff0c;只怕从一开始就走错了方向Pandas 是python的一个数据分析包&#xff0c;纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。Pandas 就是为解决数据分析任务生的&#xff0c;无论是数据分析还是机器学习项目数据预…

铃木uy125摩托车机油_UY125 新瑞梦UM125发布 济南铃木于湖南株洲吹响国IV集结号...

​4月18日&#xff0c;济南铃木在湖南株洲天台开元酒店举行了2019年新品发布会&#xff0c;并于现场发布了两款极具终端战略意义的新款国IV车型&#xff0c;分别为定位“实用运动”的全新个性化踏板车型UY125&#xff0c;以及能够进一步巩固济南铃木在国IV入门级踏板车型领域绝…

js判断时间是早上还是下午_牛奶早上喝好,还是晚上喝好?没想到“最佳时间”是这个点,颠覆了!...

都说喝牛奶好&#xff0c;要多喝。可什么时间喝牛奶最好呢&#xff1f;是饭前、饭后还是睡前&#xff1f;又或者喝酒前&#xff1f;确实得好好说说。传言&#xff1a;空腹时身体比较缺能量&#xff0c;牛奶里的蛋白会去提供能量&#xff0c;不会去构成和修复组织(比如修复皮肤)…

Python TK编程第一部分 Hello Again

当你想写大一点的程序的时候&#xff0c;将你的代码封装到一个或者多个类里会是一个不错的办法。下面hello world这个例子来自Matt Conway的Tkinter Life Preserver. [python]view plain copy from Tkinter import * class App: def __init__(self, master): …

视网膜脱离oct报告图_刚刚,爱尔眼科发布关于艾芬医生诊疗过程的核查报告

刚刚&#xff0c;爱尔眼科医院集团发布关于艾芬女士诊疗过程的核查报告&#xff0c;内容如下&#xff1a;得悉艾芬女士对武汉爱尔眼科医院白内障诊疗存疑&#xff0c;爱尔眼科医院集团高度重视&#xff0c;第一时间成立了工作组奔赴武汉&#xff0c;对事件的诊疗全过程开展了核…

20145233《网络对抗》第二周 后门原理与实践

20145233《网络对抗》第二周 后门原理与实践 实验内容 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell&#xff0c;cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件&#xff0c;利用ncat或socat传送到主机并运行获取主机…

Spring 3.1:缓存和EhCache

如果在网上查找使用Spring 3.1内置缓存的示例&#xff0c;那么通常会碰到Spring的SimpleCacheManager &#xff0c;Spring的家伙说这对“用于测试或简单的缓存声明很有用”。 实际上&#xff0c;我更喜欢将SimpleCacheManager看作是轻量级的&#xff0c;而不是简单的。 在您希望…

mysql-表完整性约束

阅读目录 一 介绍二 not null与default三 unique四 primary key五 auto_increment六 foreign key七 总结一 介绍 回到顶部 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识…

可消费消息数量_17 个方面,综合对比 主流消息队列

一、资料文档二、开发语言三、支持的协议四、消息存储五、消息事务六、负载均衡七、集群方式八、管理界面九、可用性十、消息重复十一、吞吐量TPS十二、订阅形式和消息分发十三、顺序消息十四、消息确认十五、消息回溯十六、消息重试十七、并发度本文将从&#xff0c;Kafka、Ra…

opencv2.4.13+python2.7学习笔记--使用 knn对手写数字OCR

阅读对象&#xff1a;熟悉knn、了解opencv和python。 1.knn理论介绍&#xff1a;算法学习笔记&#xff1a;knn理论介绍 2. opencv中knn函数 路径&#xff1a;opencv\sources\modules\ml\include\opencv2\ml\ml.hpp 3.案例 3.1数据集介绍 我们的目的是创建一个可以对手写数字进行…

热启动必须联网吗_供暖结束,地暖是关闭供水阀门还是关闭回水阀门?你做对了吗?...

天气渐渐暖和起来很多城市都停止供暖了一些家庭也停止使用地暖那么今天就来聊一聊&#xff0c;停止供暖后地暖系统应该怎么保养地暖不用时候是关闭供水阀门还是关闭回水阀门&#xff1f;供暖结束 暖气阀门到底要不要关一般来说&#xff0c;我们供暖期结束是不用关闭总阀门的。因…

python学习(九) 网络编程学习--简易网站服务器

python 网络编程和其他语言都是一样的&#xff0c;服务器这块步骤为&#xff1a;1. 创建套接字2. 绑定地址3. 监听该描述符的所有请求4. 有新的请求到了调用accept处理请求 Python Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;简称“WSGI”&…

按条件分类_保税仓储企业能否同时存储非保货物?“仓储货物安装台分类监管”如何申请?...

保税仓储企业能否同时存储非保货物呢&#xff1f;保税和非保货物是不是真的不能同在一个“屋檐下”呢&#xff1f;哪些企业可以开展“仓储货物按状态分类监管”业务&#xff1f;企业又该如何申请该项业务&#xff1f;本文就对这些问题进行一下梳理。什么是“仓储货物按状态分类…

ZooKeeper的原理(转)

一、ZooKeeper的角色 领导者&#xff08;Leader&#xff09;&#xff0c;负责进行投票的发起和决议&#xff0c;更新系统状态。 学习者&#xff08;Learner&#xff09;&#xff0c;包括跟随者&#xff08;Follower&#xff09;和观察者&#xff08;Observer&#xff09;&#…

java课堂笔记

转载于:https://www.cnblogs.com/16-C-kai/p/6567042.html

Spring– DAO和服务层

欢迎来到Spring教程的第三部分。 在这一部分中&#xff0c;我们将继续编写Timesheet应用程序&#xff0c;这次我们将实现DAO层&#xff0c;业务服务并编写一些测试。 在上一部分中&#xff0c;我们定义了GenericDao接口&#xff0c;该接口告诉我们需要对实体执行哪些操作。 现在…

51nod 1907(多项式乘法启发式合并)

题目&#xff1a; 分析&#xff1a; 对于一个确定的生成子图&#xff0c;很明显是在一个连通块上走&#xff0c;走完了再跳到另一个连通块上&#xff0c;假设连通块个数为cnt&#xff0c;那么答案一定是$min(a_{cnt-1},a_cnt,..,a_{n-1})$ 那现在的问题就是如何求出对于原图而言…

煮饭的机器人作文_公示|“笔随我心、心由笔动”作文大赛获奖名单

卡士大昌杯“笔随我心、心由笔动”获奖作品开平的咸汤圆滑轮记&#xff0f;我的宅家成长记折叠式小屋&#xff0f;夕阳&#xff0f;包粽子在过去的卡士大昌杯“笔随我心、心由笔动”作文活动中我们收到了许多优秀投稿经过专业团队评选得出获奖选手作品如下主办方协办方一等奖《…

JavaFX 2 GameTutorial第5部分

介绍 这是与JavaFX 2 Game Tutorial相关的六部分系列的第五部分。 我知道自从我写关于游戏的博客以来已经很长时间了&#xff0c;但希望您仍然与我在一起。 如果您想回顾一下&#xff0c;请阅读第1部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分和第4 部分 &#xff0c;以了…