• PIL或Pillow学习1


    PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评。

    自 2011 年以来,由于 PIL 库更新缓慢,目前仅支持 Python 2.7 版本,这明显无法满足 Python3 版本的使用需求。

    于是一群 Python 社区的志愿者(主要贡献者:Alex Clark 和 Contributors)在 PIL 库的基础上开发了一个支持 Python3 版本的图像处理库,它就是 Pillow。

    Pillow 不仅是 PIL 库的“复制版”,而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今,已经成为了比 PIL 更具活力的图像处理库

    Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。

    除了 PIL 和 Pillow 库之外,Python 还提供了一些其他图像处理库:

    • Scikit-image:一款基于 scipy 科学计算的图像处理软件包,以数组的形式对图像进行处理;
    • OpenCV:其实是一个 C++ 图像处理库,不过它提供了 Python 语言的接口。


    Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。

    与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用。

    Pillow版本支持

    Pillow 支持跨平台运行,比如 Windows、Linux、MacOS 等,其最新版本为 Pillow 8.3.2,该版本支持 Python 3.6 及以上的版本(推荐使用)。Pillow 与 Python 支持版本的对照表如下所示:
     

    版本对照表
    Python版本3.103.93.83.73.63.52.7
    Pillow>=8.3.2支持支持支持支持支持
    Pillow8.0-8.3.1支持支持支持支持
    Pillow7.0-7.2支持支持支持支持
    Pillow6.2.1-6.22支持支持支持支持支持
    Pillow6..0-6.2.0支持支持支持支持
    PIL_test1.py:
    1. from PIL import Image
    2. '''
    3. 0, Pillow的下载与安装
    4. python 2.7 : pip install PIL
    5. python 3.7 : pip install pillow
    6. '''
    7. '''
    8. 1, Pillow创建Image对象
    9. 使用 Image 类的 open() 方法,可以创建一个 Image 对象,语法格式如下:
    10. im = Image.open(filepath,mode="r")
    11. 参数说明:
    12. filepath 表示文件路径,字符串格式;
    13. mode:可选参数,若出现该参数,则必须设置为 "r",否则会引发 ValueError 异常。
    14. '''
    15. #打开一图片文件
    16. img = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.png")
    17. #要显示图像需要调用 show()方法
    18. #img.show()
    19. '''
    20. 3, Pillow Image对象属性
    21. '''
    22. #1) size:查看图像的尺寸
    23. #打印image对象
    24. print(img)
    25. #查看尺寸
    26. print("宽width是 %s ; 高height是 %s"%(img.width,img.height))
    27. #或者通过size查看
    28. print("图像的大小size:",img.size)
    29. #2) format:查看图片的格式
    30. print("图像的格式:",img.format)
    31. #3) readonly:图片是否为只读 ;该属性的返回为 0 或者 1,分别对应着是和否
    32. print("图像是否为只读:",img.readonly)
    33. #4) info:查看图片相关信息
    34. # 包括了每英寸像素点大小和截图软件信息
    35. print("图像信息:",img.info)
    36. #5) mode:图像模式
    37. '''
    38. 图片模式
    39. mode 描述
    40. 1 1 位像素(取值范围 0-1),0表示黑,1 表示白,单色通道。
    41. L 8 位像素(取值范围 0 -255),灰度图,单色通道。
    42. P 8 位像素,使用调色板映射到任何其他模式,单色通道。
    43. RGB 3 x 8位像素,真彩色,三色通道,每个通道的取值范围 0-255。
    44. RGBA 4 x 8位像素,真彩色+透明通道,四色通道。
    45. CMYK 4 x 8位像素,四色通道,可以适应于打印图片。
    46. YCbCr 3 x 8位像素,彩色视频格式,三色通道。
    47. LAB 3 x 8位像素,L * a * b颜色空间,三色通道
    48. HSV 3 x 8位像素,色相,饱和度,值颜色空间,三色通道。
    49. I 32 位有符号整数像素,单色通道。
    50. F 32 位浮点像素,单色通道。
    51. '''
    52. print("图像模式信息:",img.mode)
    53. '''
    54. 4, Pillow图片格式转换
    55. 1) save()
    56. #Image.save(filepath, format=None)
    57. 参数说明如下:
    58. filepath:图片的存储路径,包含图片的名称,字符串格式;
    59. format:可选参数,可以指定图片的格式。
    60. '''
    61. img.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.bmp")
    62. '''
    63. 2) convert()+save()
    64. 并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,
    65. 如果直接使用 save() 方法就会出现以下错误:"OSError: cannot write mode RGBA as JPEG"
    66. Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,
    67. 比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心。语法格式如下:
    68. convert(mode,parms**)
    69. mode:指的是要转换成的图像模式;
    70. params:其他可选参数。
    71. '''
    72. #此时返回一个新的image对象,转换图片模式
    73. image = img.convert('RGB')
    74. #调用save()保存
    75. image.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.jpg")
    76. '''
    77. 5, Pillow图像缩放操作
    78. 在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像。
    79. resize() 函数的语法格式如下:
    80. resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)
    81. 参数说明:
    82. size:元组参数 (width,height),图片缩放后的尺寸;
    83. resample:可选参数,指图像重采样滤波器,与 thumbnail() 的 resample 参数类似,默认为 Image.BICUBIC;
    84. box:对指定图片区域进行缩放,box 的参数值是长度为 4 的像素坐标元组,即 (左,上,右,下)。
    85. 注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;
    86. reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有 3.0 和 5.0。
    87. 注意,resize() 会返回一个新的 image 对象。
    88. '''
    89. try:
    90. #放大图片
    91. image = img.resize((300,400))
    92. #将新图像保存至桌面
    93. image.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_放大.jpg")
    94. print("查看新图像的尺寸",image.size)
    95. except IOError:
    96. print("放大图像失败")
    97. '''
    98. 6, Pillow图像分离与合并
    99. 图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,
    100. 最终呈现出了绚丽多彩的图像。它们的本质就是图片呈现颜色时需要遵循的规则,
    101. 比如 RGB、RGBA、CYMK 等,而图像的分离与合并,指的就是图像颜色的分离和合并。
    102. Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。
    103. 1) split()
    104. split() 的使用方法比较简单,用来分离颜色通道
    105. '''
    106. #分离颜色通道,产生三个 Image对象
    107. r,g,b = img.split()
    108. print('分离颜色通道')
    109. #r.show()
    110. #g.show()
    111. #b.show()
    112. '''
    113. 2) merge()
    114. Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。
    115. merge() 方法的语法格式如下:
    116. Image.merge(mode, bands)
    117. 参数说明如下:
    118. mode:指定输出图片的模式
    119. bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,
    120. 比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。
    121. 注意,该函数会返回一个新的 Image 对象。
    122. '''
    123. #重新组合颜色通道,返回先的Image对象
    124. image_merge = Image.merge('RGB',(b,g,r))
    125. print('图像合并,将分离的3个颜色通道合并')
    126. #image_merge.show()
    127. #保存合并后的图像
    128. image_merge.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_split_merge.jpg")
    129. print('保存合并后的图像')
    130. '''
    131. 7, Pillow图像裁剪、复制、粘贴操作
    132. 图像的剪裁、复制、粘贴是图像处理过程中经常使用的基本操作,Pillow Image 类提供了简单、易用的 API 接口,
    133. 能够帮助您快速实现这些简单的图像处理操作。
    134. 1) 图像裁剪操作
    135. Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:
    136. crop(box=None)
    137. box:表示裁剪区域,默认为 None,表示拷贝原图像。
    138. 注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),
    139. 分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。
    140. 默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。
    141. '''
    142. box =(0,0,200,200)
    143. img_crop = img.crop(box)
    144. #保存裁剪后的图像
    145. img_crop.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_crop.jpg")
    146. print('保存裁剪后的图像')
    147. '''
    148. 2) 图像拷贝和粘贴
    149. 拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。
    150. 其中复制操作(即 copy() 方法)比较简单.
    151. 下面主要介绍 paste() 粘贴方法,语法格式如下所示:
    152. paste(image, box=None, mask=None)
    153. 该函数的作用是将一张图片粘贴至另一张图片中。
    154. 注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:
    155. image:指被粘贴的图片;
    156. box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,
    157. 长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,
    158. 此时区域的大小必须要和被粘贴的图像大小保持一致。
    159. mask:可选参数,为图片添加蒙版效果。
    160. '''
    161. #复制一张图片副本
    162. img_copy=img.copy()
    163. #打开图片2文件
    164. img2 = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/2.png")
    165. #将img2粘贴至副本图像上
    166. print(img2.size)
    167. #对副本进行裁剪
    168. img_crop = img2.crop((0,0,580,580))
    169. #将裁剪后的副本粘贴至副本图像上
    170. img_copy.paste(img_crop,(0,0,580,580))
    171. #显示粘贴后的图像
    172. #img_copy.show()
    173. #保存拷贝和粘贴后的图像
    174. img_copy.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_copy_paste.jpg")
    175. print('保存拷贝和粘贴后的图像')
    176. '''
    177. 8, Pillow图像几何变换
    178. 图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,
    179. Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform()
    180. 1) transpose() 翻转操作
    181. 该函数可以实现图像的垂直、水平翻转,语法格式如下:
    182. Image.transpose(method)
    183. method 参数决定了图片要如何翻转,参数值如下:
    184. Image.FLIP_LEFT_RIGHT:左右水平翻转;
    185. Image.FLIP_TOP_BOTTOM:上下垂直翻转;
    186. Image.ROTATE_90:图像旋转 90 度;
    187. Image.ROTATE_180:图像旋转 180 度;
    188. Image.ROTATE_270:图像旋转 270 度;
    189. Image.TRANSPOSE:图像转置;
    190. Image.TRANSVERSE:图像横向翻转。
    191. '''
    192. #返回一个新的Image对象
    193. img_out1=img.transpose(Image.TRANSPOSE)
    194. #img_out1.show()
    195. img_out1.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_TRANSPOSE.png")
    196. #图像旋转 90 度;左旋转
    197. img_out2=img.transpose(Image.ROTATE_90)
    198. #img_out2.show()
    199. img_out2.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_ROTATE_90.png")
    200. print('保存翻转后的图像')
    201. '''
    202. 2) rotate()任意角度旋转
    203. 当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:
    204. Image.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)
    205. 参数说明如下:
    206. angle:表示任意旋转的角度;
    207. resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法;
    208. expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
    209. center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转;
    210. translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
    211. fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
    212. '''
    213. #translate的参数值可以为负数,并将旋转图之外的区域填充为蓝色
    214. #返回同一个新的Image对象,旋转 45 度
    215. img_out_rotate=img.rotate(45,translate=(0,-25),fillcolor="blue")
    216. #img_out_rotate.show()
    217. img_out_rotate.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_rotate_45.png")
    218. print('保存任意角度旋转后的图像')
    219. '''
    220. 3) transform()图像变换
    221. 该函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像,语法格式如下:
    222. Image.transform(size, method, data=None, resample=0)
    223. 参数说明:
    224. size:指定新图片的大小;
    225. method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
    226. data:该参数用来给变换方式提供所需数据;
    227. resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。
    228. '''
    229. #设置图像大小300*300,并根据data的数据截取原图像的区域,生成新的图像
    230. img_out_transform=img.transform((300,300),Image.EXTENT,data=[0,0,30 + img.width//4,img.height//3])
    231. #img_out_transform.show()
    232. img_out_transform.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_transform.png")
    233. print('保存变换后的图像')

  • 相关阅读:
    【C++】继承与多态相关11道面试题整理
    将电脑文件备份到百度网盘,并实现自动备份
    css的表格属性以及边框属性
    【python】ModuleNotFoundError: No module named ‘skimage‘...
    C++ 程序员入门需要多久,怎样才能学好?
    正则表达式C++
    50道软件测试面试题
    LightGBM调参与模型权重可视化
    css3-浮动和display、父级边框塌陷
    水库安全监测方案(实时数据采集、高速数据传输)
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/133174492