Pillow

PIL:Python Imaging Library,是Python平台事实上的图像处理标准库了。但是PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x。
下面来介绍如何安装及使用Pillow库。

安装

pip install pillow

在安装后通过在python控制台中输入"import PIL"命令可以验证是否成功安装。

使用Pillow

下边所有实验所使用的测试图片如下:

1.读取图像

pillow的Image模块读取图像文件后得到的是PIL类型的image文件:

import requests
from io import BytesIO
from PIL import Image
import matplotlib.pyplot as plt
#========================================================
#  加载图片
#========================================================
def read_image(path, mode='RGB'):'''加载本地单张图片INPUT  -> 单张图片路径, 特殊模式OUTPUT -> 单张图文件'''pil_im = Image.open(path)if mode == '1':# 非黑即白模式: 0表示黑, 255表示白return pil_im.convert('1')  elif mode == 'L':# 灰色模式: 0表示黑,255表示白,其他数字表示不同的灰度。转换算法 L = R * 299/1000 + G * 587/1000+ B * 114/1000return pil_im.convert('L')elif mode == 'RGB':return pil_im.convert('RGB')def read_net_image(url, mode='RGB'):'''加载网络单张图片INPUT  -> 单张图片网址, 特殊模式OUTPUT -> 单张图文件'''pil_im = Image.open(BytesIO(requests.get(url).content))if mode == '1':return pil_im.convert('1')elif mode == 'L':return pil_im.convert('L')elif mode == 'RGB':return pil_imimg=read_image('test.png', 'RGB')  # 通过更改模式得到不同的图片
plt.axis('off') # 不显示坐标轴
plt.imshow(img)
plt.show()

查看PIL类型的image文件的信息。

    print(pil_im.size)  # 图片的尺寸print(pil_im.mode)  # 图片的模式print(pil_im.format)  # 图片的格式print(type(img))

(895, 893)
RGB
PNG
<class ‘PIL.Image.Image’>

print(pil_im.format) #图片的格式
获得某点像素用getpixel((w, h))可以直接返回这个点三个通道的像素值(Pillow采取左上角为(0,0)的坐标系统)。

2.读取图像

img.save('test.jpg')

这行代码不仅能保存图片,还是转换格式,如本例中,就由原来的png图片保存为了jpg图片。

3.像素访问

from PIL import Image
from PIL import ImageColor
'''200×200的透明正方形'''
img = Image.new('RGBA', (200, 200))'''遍历上半部份的所有像素'''
for x in range(200):for y in range(100):'''设置每个像素的颜色'''img.putpixel((x, y), (155,15,5))for x in range(200):for y in range(100,200):'''假定不知道RGB元组,必须使用ImageColor.getcolor()'''img.putpixel((x, y), ImageColor.getcolor('darkgray', 'RGBA'))img.save('putpixel.png')

4.通道分离与合并

r,g,b=img.split()   #分离三通道
pic=Image.merge('RGB',(r,g,b))   #合并三通道

5.裁剪图片

def image_clip(pil_im, x, y, width, height):'''从一张图片中截取某个区域INPUT  -> 单张图文件, 坐标点x, 坐标点y, 目标宽度, 目标高度OUTPUT -> 截取后的图片'''im_w, im_h = pil_im.sizex2 = x + widthy2 = y + heightif x + width > im_w:x2 = im_wif y + height > im_h:y2 = im_hbox = (x, y, x2, y2)region = pil_im.crop(box)return regionm=image_clip(img,300,250,400,400)   # img 是图片姓名
m.show()

6、刚体几何变换

图像的缩放:

def image_resize1(pil_im, dst_w, dst_h):'''使一张图片变换尺寸(非等比例)(指定宽高)INPUT  -> 单张图文件, 目标宽度, 目标高度OUTPUT -> 处理后的图片'''return pil_im.resize((dst_w, dst_h))def image_resize_proportionally1(pil_im, c):'''使一张图片变换尺寸(等比例)(倍数缩放)INPUT  -> 单张图文件, 目标宽度, 目标高度OUTPUT -> 处理后的图片'''height, width = pil_im.sizedst_w = height*cdst_h = width*creturn pil_im.resize((dst_w, dst_h))def image_resize_proportionally2(pil_im, dst_w, dst_h):'''使一张图片变换尺寸(等比例)INPUT  -> 单张图文件, 目标宽度, 目标高度OUTPUT -> 处理后的图片'''ori_w, ori_h = pil_im.sizewidthRatio = heightRatio = Noneratio = 1if (ori_w and ori_w > dst_w) or (ori_w and ori_h > dst_h):if (ori_w > dst_w):widthRatio = float(dst_w) / ori_w # 获取宽度缩放比例if (ori_h > dst_h):heightRatio = float(dst_h) / ori_h # 获取高度缩放比例if widthRatio and heightRatio:if widthRatio < heightRatio:ratio = widthRatioelse:ratio = heightRatioif widthRatio and not heightRatio:ratio = widthRatioif heightRatio and not widthRatio:ratio = heightRationewWidth = int(ori_w * ratio)newHeight = int(ori_h * ratio)else:newWidth = ori_wnewHeight = ori_hreturn pil_im.resize((newWidth,newHeight), Image.ANTIALIAS)

图像的旋转

def image_rotate(pil_im, angle, clockwise=False):'''使一张图片旋转INPUT  -> 单张图文件, 旋转角度, 旋转方向(默认逆时针)OUTPUT -> 旋转后的图文件'''if clockwise:angle = 360 - int(angle)pil_im = pil_im.rotate(angle, expand=True)  # expand参数如果设为True,就会放大图像的尺寸,以适应整个旋转后的新图像else: pil_im = pil_im.rotate(angle, expand=True)return pil_im

7、图像加水印

from PIL import ImageDraw, ImageFont, ImageEnhancedef image_watermark_logo(ori_im, mark_im):'''给一张图片加上图片水印INPUT  -> 原始图片, 水印图片, 透明度OUTPUT -> 处理后的图片'''ori_w, ori_h = ori_im.sizemark_w, mark_h = mark_im.size# 图层dst_im = Image.new('RGBA', ori_im.size, (255,255,255,0))  # 设置图片尺寸和透明度dst_im.paste(mark_im, (ori_w-mark_w, ori_h-mark_h))# 覆盖dst_im = Image.composite(dst_im, ori_im, dst_im)return dst_imdef image_watermark_text(ori_im, fontpath, text=''):'''给一张图片加上文字水印INPUT  -> 原始图片, 字体路径, 文本OUTPUT -> 处理后的图片'''ori_im = ori_im.convert('RGBA')ori_w, ori_h = ori_im.size# 文本遮罩层text_overlay = Image.new('RGBA', ori_im.size, (255,255,255,0))image_draw = ImageDraw.Draw(text_overlay)# 获取文本大小fnt = ImageFont.truetype(fontpath, 20)text_size_x, text_size_y = image_draw.textsize(text, font=fnt)# 设置文本位置text_xy = (ori_w-text_size_x, ori_h-text_size_y)# 设置文本颜色和透明度image_draw.text(text_xy, text, font=fnt, fill=(255,255,255,50))# 覆盖dst_im = Image.alpha_composite(ori_im, text_overlay)return dst_im

8、图像标识框

def image_tag(pil_im, x1, y1, x2, y2):'''在图片上标记矩形框INPUT  -> 单张图文件, 对角点坐标(PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角)OUTPUT -> 绘制后的图文件'''canvas = ImageDraw.Draw(pil_im)canvas.line([(x1, y1), (x2, y1), (x2, y2), (x1, y2), (x1, y1)], fill='red')return canvas

9、使用图像滤镜

ImageFilter是PIL的滤镜模块,通过这些预定义的滤镜,可以方便的对图片进行一些过滤操作,从而去掉图片中的噪音(部分的消除),这样可以降低将来处理的复杂度(如模式识别等)。

ImageFilter.BLUR           模糊滤镜
ImageFilter.CONTOUR           轮廓
ImageFilter.EDGE_ENHANCE       边界加强
ImageFilter.EDGE_ENHANCE_MORE     边界加强(阀值更大)
ImageFilter.EMBOSS                 浮雕滤镜
ImageFilter.FIND_EDGES         边界滤镜
ImageFilter.SMOOTH           平滑滤镜
ImageFilter.SMOOTH_MORE        平滑滤镜(阀值更大)
ImageFilter.SHARPEN              锐化滤镜

要使用PIL的滤镜功能,需要引入ImageFilter模块

from PIL import ImageFilter
def filterDemo():img = Image.open("img.png")imgfilted = img.filter(ImageFilter.EMBOSS)imgfilted.save("aaa.png")filterDemo()

10、PIL Image图像与numpy数组互转

前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都是把图片转换成矩阵来进行更加复杂的操作。

import numpy as np#========================================================
#  图像数组化与还原
#========================================================def image_to_array(pil_im):'''图片转化为数组INPUT  -> 单张图文件OUTPUT -> 数组'''return np.array(pil_im, 'f')def array_to_image(image_arr):'''数组还原为图片INPUT  -> 数组OUTPUT -> 单张图文件'''if len(image_arr.shape) == 3:  # 格式为(height(rows), weight(colums), 3)r = Image.fromarray(np.uint8(image_arr[:,:,0]))g = Image.fromarray(np.uint8(image_arr[:,:,1]))b = Image.fromarray(np.uint8(image_arr[:,:,2]))image = Image.merge("RGB", (r, g, b))return imageelif len(image_arr.shape) == 2:  # 格式为(height(rows), weight(colums))return Image.fromarray(np.uint8(image_arr))array=image_to_array(img)
print(array)image=array_to_image(array)
image.show()

图像处理库Pillow的使用相关推荐

  1. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...

    下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本.本文将教你使用 Pytho ...

  2. nodejs 图片处理模块 rotate_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!...

    你在用什么软件进行图像处理呢?厌倦了鼠标和手指的拖拖点点,想不想用程序和代码进行图像的高效处理,Python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,听起来是不是很酷很极客, ...

  3. pil对图像加透明 python_使用Python图像处理库Pillow处理图像文件

    文/江红  本文来源<Python程序设计与算法基础教程(第2版)-微课版> 本案例通过使用Python图像处理库Pillow,帮助读者进一步了解Python的基本概念:模块.对象.方法和 ...

  4. pillow是python的图像处理标准库_详解Python图像处理库Pillow常用使用方法

    pil(python image library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:pil. pil ...

  5. pillow属于python标准库吗_详解Python图像处理库Pillow常用使用方法

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 其官方主页为:PIL. PIL ...

  6. python pil怎么安装_python pil 怎么安装 怎样安装python的图像处理库pillow

    python 怎么安装pillow 1. 安装pip [plain] view plain copy sudo easy_install pip pip 安装成功就可以直接安装pil或者pillow ...

  7. python的图像处理库是啥_Python 图像处理库 Pillow 入门

    来源:Belial_2010 blog.csdn.net/kezunhai/article/details/46446153 Pillow是Python里的图像处理库(PIL:Python Image ...

  8. 简单实用的Python图像处理库Pillow

    Pillow图像处理 Pillow 库的安装 图象处理基本知识 图像的RGB 色彩模式 像素阵列 Image 模块 打开和新建 混合 透明度混合处理 遮罩混合处理 复制和缩放 复制图像 缩放像素 缩放 ...

  9. Python图像处理库Pillow(PIL)的简单使用

    一.PIL和Pillow图像处理库 图像库PIL(Python Image Library)是Python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像 ...

  10. pillow是python的图像处理标准库_Python图像处理库:Pillow 初级教程

    Python图像处理库:Pillow 初级教程. Image类 Pillow中最重要的类就是Image,该类存在于同名的模块中.可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接 ...

最新文章

  1. 解题报告:CF1307D Cow and Fields(最短路、最优解不等式化简)
  2. 【开发环境】PyCharm 配置 GitHub ( 在 PyCharm 中向 GitHub 提交代码 )
  3. 关联规则算法php,科学网—加权关联规则权值的计算 - 叶文菁的博文
  4. oracle 转换成csv文件,如何将csv转换为oracle中的表
  5. 【Paper】StyTr2: Image Style Transfer with Transformers
  6. 关于火狐浏览器在ubuntu和安卓手机上的同步
  7. 成绩查询数据结构c语言,学生成绩管理系统(数据结构c语言版源代码)09169.pdf
  8. 瑞士军刀Netcat的使用方法
  9. NeurIPS'21|MixSeq:从微观数据到宏观时序预测的桥梁
  10. 从百草园到三味书屋 鲁迅
  11. 不确定性Uncertainty
  12. [Python]跟着代码去学习---二维码1:批量生成二维码
  13. C语言设计流水灯程序,花式流水灯c语言程序.pdf
  14. Linux的判断两个字符串是否相等
  15. 百度之星2019决赛摸鱼记
  16. 201521123007《Java程序设计》第5周学习总结
  17. 网站怎么样做更好的展现出这个企业品牌的形象?
  18. ESP8266与PS2通信
  19. Android Telephony主要模块及功能
  20. HTML5 + CSS3 的常用 button 样式

热门文章

  1. 社交电商“百花齐放”,光鲜背后是大战将起
  2. ubuntu 18.04 安装 wine5.0
  3. 交通信号灯控制器C语言代码,交通信号灯控制器代码及说明.doc
  4. 编程专业人的良好习惯(练习、时间管理、压力、团队协作)
  5. 压缩包密码破解工具-ARCHPR
  6. 一文搞懂HTTP协议(带图文)
  7. 正向代理和反向代理的区别
  8. Tempo超进化,提效降本好帮手,工时管理小当家 Timewise
  9. ubuntu linux 安装报错解决方法E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource tempo
  10. 字节跳动CEO梁汝波接棒张一鸣一年:使命是我们前进的动力