python中用Pillow库进行图片处理
一.Python中 PIL 图像处理库简介
PIL可以做很多和图像处理相关的事情:
- 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
- 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
- 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。
How to use PIL?
Image类是PIL中的核心类,你有很多种方式来对它进行初始化,比如从文件中加载一张图像,处理其他形式的图像,或者是从头创造一张图像等。下面是PIL Image类中常用的方法:
- open(filename,mode)(打开一张图像)。下面的代码演示了如何从文件打开一张图像:
>>> from PIL import Image
>>> Image.open("dog.jpg","r")
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0
>
>>> im = Image.open("dog.jpg","r")
>>> print(im.size,im.format,im.mode)
(296, 299) JPEG RGBImage.open返回一个Image对象,该对象有size,format,mode等属性,其中size表示图像的宽度和高度(像素表示);format表示图像的格式,常见的包括JPEG,PNG等格式;mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说'L'(luminance)表示灰度图像,'RGB'表示真彩图像,'CMYK'表示预先压缩的图像。一旦你得到了打开的Image对象之后,就可以使用其众多的方法对图像进行处理了,比如使用im.show()可以展示上面得到的图像。save(filename,format)(保存指定格式的图像)
>>> im.save("dog.png",'png')上面的代码将图像重新保存成png格式。
thumbnail(size,resample)(创建缩略图)
>>> im.thumbnail((50,50),resample=Image.BICUBIC)
>>> im.show()上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有
Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。crop(box)(裁剪矩形区域)
>>> im = Image.open("dog.jpg","r")
>>> box = (100,100,200,200)
>>> region = im.crop(box)
>>> region.show()
im.crop()上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。
transpose(method)(图像翻转或者旋转)
>>> im_rotate_180 = im.transpose(Image.ROTATE_180)
>>> im_rotate_180.show()上面的代码将im逆时针旋转180°,然后显示出来,
method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
- Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
- Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
- Image.ROTATE_90,表示将图像逆时针旋转90°
- Image.ROTATE_180,表示将图像逆时针旋转180°
- Image.ROTATE_270,表示将图像逆时针旋转270°
- Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
- Image.TRANSVERSE,表示将图像进行转置,再水平翻转paste(region,box,mask)(将一个图像粘贴到另一个图像)
>>> im.paste(region,(100,100),None)
>>> im.show()上面的代码将region图像粘贴到左上角为(100,100)的位置。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。
split()(颜色通道分离)
>>> r,g,b = im.split()
>>> r.show()
>>> g.show()
>>> b.show()split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。
merge(mode,channels)(颜色通道合并)
>>> im_merge = Image.merge("RGB",[b,r,g])
>>> im_merge.show()merge方法和split方法是相对的,其将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。
resize(size,resample,box)
>>> im_resize = im.resize((200,200))
>>> im_resize
<PIL.Image.Image image mode=RGB size=200x200 at 0x7F62B9E23470>
>>> im_resize.show()
>>> im_resize_box = im.resize((100,100),box = (0,0,50,50))
>>> im_resize_box.show()resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有
Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法,默认是PIL.Image.NEAREST,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。convert(mode,matrix,dither,palette,colors)(mode转换)
>>> im_L = im.convert("L")
>>> im_L.show()
>>> im_rgb = im_L.convert("RGB")
>>> im_rgb.show()
>>> im_L.mode
'L'
>>> im_rgb.mode
'RGB'convert方法可以改变图像的mode,一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。
二.用pillow库对图片生成缩略图
1.代码如下
import os
import glob
from PIL import Image def thumbnail_pic(path):
a=glob.glob(r'./*.jpg')#此处输入图片地址
for x in a:
name=os.path.join(path,x)
im=Image.open(name)
im.thumbnail((80,80))
print(im.format,im.size,im.mode)
im.save(name,'JPEG')
print('Done!') if __name__=='__main__':
path='.'
thumbnail_pic(path)
原图1

缩略图1

原图2

缩略图2

由此可以看出Pillow库的强大以及实用性
三.图像灰度处理对比(颜色)
1.首先安装python中的OpenCV库
pip install opencv-python
2.处理代码如下
import cv2
#读取彩色原图
img0=cv2.imread('E:/python_cv/01.jpg',1)
#读取灰度图
img1=cv2.imread('E:/python_cv/01.jpg',0)
print(img0.shape)
print(img1.shape)
cv2.imshow('gary',img1)
cv2.waitKey(0)
3.效果如下


四.图像浮雕处理对比
1.处理代码如下
2.效果对比如下


五.图像轮廓处理对比
1.Sobel 算法处理图像
obel算子是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。
代码如下
import cv2.cv as cv
im=cv.LoadImage('img/building.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
sobx = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
cv.Sobel(im, sobx, 1, 0, 3) #Sobel with x-order=1
soby = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
cv.Sobel(im, soby, 0, 1, 3) #Sobel withy-oder=1
cv.Abs(sobx, sobx)
cv.Abs(soby, soby)
result = cv.CloneImage(im)
cv.Add(sobx, soby, result) #Add the two results together.
cv.Threshold(result, result, 100, 255, cv.CV_THRESH_BINARY_INV)
cv.ShowImage('Image', im)
cv.ShowImage('Result', result)
cv.WaitKey(0)
2.效果如下


六.图像的增强(对比度)
1.本步采用pillow中的imageEnhance处理,代码如下
from PIL import Image,ImageEnhance
# 打开图片
im = Image.open('C:/Users/moyulin/Desktop/捕获.PNG','r')
# 对比度增强
enh_con = ImageEnhance.Contrast(im)
contrast = 10
image_contrasted = enh_con.enhance(contrast)
image_contrasted.show()
2.对比效果如下


七.好玩的gif图片
1.动态gif逆序播放
原图如下

代码如下
# _*_ coding:utf-8 _*_
from PIL import Image, ImageSequence
__author__ = 'moyulin'
im = Image.open(r'C:\Users\moyulin\Desktop\memeda.gif')
# 初始化列表
sequence = []
for f in ImageSequence.Iterator(im):
# 获取图像序列病存储
sequence.append(f.copy())
# 将图像序列逆转
sequence.reverse()
sequence[0].save(r'C:\Users\moyulin\Desktop\out.gif', save_all=True, append_images=sequence[1:])
效果如下

若是此时我们打乱图像序列,这时候会发生什么呢?
代码如下
# _*_ coding:utf-8 _*_ import random
from PIL import Image, ImageSequence __author__ = 'moyulin' im = Image.open(r'C:\Users\moyulin\Desktop\memeda.gif') # 初始化列表 sequence = [] for f in ImageSequence.Iterator(im): # 获取图像序列病存储 sequence.append(f.copy())
#随机打乱图像序列
random.shuffle(sequence) # 将图像序列逆转 #sequence.reverse() sequence[0].save(r'C:\Users\moyulin\Desktop\out2.gif', save_all=True, append_images=sequence[1:])
效果如下

是不是觉得也很可爱呢,嘻嘻,快来尝试玩PIllow库把,很有趣的emmmm
python中用Pillow库进行图片处理的更多相关文章
- python使用zlib库压缩图片,使用ffmpeg压缩视频
python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...
- python利用PIL库使图片高斯模糊
一.安装PIL PIL是Python Imaging Library简称,用于处理图片.PIL中已经有图片高斯模糊处理类,但有个bug(目前最新的1.1.7bug还存在),就是模糊半径写死的是2,不能 ...
- Python 处理图片 -- pillow库
pip install pillow 基本使用 from PIL import Image # new 创建一张图片 im1 = Image.new('RGB', (500, 300), (50, 1 ...
- 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)
以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...
- 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)
字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...
- python基于pillow库的简单图像处理
from PIL import Image from PIL import ImageFilter from PIL import ImageEnhance import matplotlib.pyp ...
- 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)
!已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...
- 尝试用python开发一款图片压缩工具1:尝试 pillow库
开发目的 我经常使用图片.公众号文章发文也好,还是生活中要使用素材.图片是一种比文字更加直观的载体.但是图片更加占用带宽,很多软件都对图片有大小限制.图片太大也会影响加载速度.我试过几款图片压缩工具, ...
- 安装python的第三方Pillow库
方法/步骤 找到easy_install.exe工具.在windows下安装Python后,在其安装路径下的scripts文件中默认安装好了easy_install工具.完整路径如下例:D:\Pyth ...
随机推荐
- Google官方教程之Selling In-app Products
1.原文链接[需FQ]:http://developer.android.com/training/in-app-billing/index.html 2.平时对于英文文档都是大概读一下,现在翻译文章 ...
- MySQL 数据库--内置功能
一 视图 视图:是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 优点:们可以把查询过程中的临 ...
- iPhone的设备名转换
def convertDeviceName(self, deviceName): """ 转换deviceName(如iPhone 6,2)为用户习惯形式(如iPhone ...
- PHP_GET后门,躲避任何安全软件
经常拿到一些比较好的php站想要留住.插入菜刀一句话,很容易被管理发现,不管是eval还是assert,就是管理发现不了,有时连接也会被各种的安全软件拦截.现在教大家一个简单的技巧.本人一直在用,留的 ...
- linux性能系列--内存
一.啥是内存呢? 回答:内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁.计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大. 内存(Memory)也被称为内存储器, ...
- IOS 对JSON解析的要求
JOSN格式的原始字符串中, 键名必须为 引号 “” 包含的字符串,值必须是数组("[]" 用中括号包起来的部分),字典("{}" 用中括号包起来的部分),数字 ...
- Angular4 @HostBinding @HostListener
host属性 @Component({ selector: 'jhi-project', templateUrl: './project.html', styleUrls: [], host: { ' ...
- Codeforces Round #443 (Div. 2) 【A、B、C、D】
Codeforces Round #443 (Div. 2) codeforces 879 A. Borya's Diagnosis[水题] #include<cstdio> #inclu ...
- map详讲<二>
查找元素: Map可以根据健来查找元素,提供方法find(key),如果是这个健对应的元素存在,则返回的是这个健的迭代器iterator,否则返回的是std::end(): 使用find()函数有点笨 ...
- URL列表
MySql函数大全:http://www.cnblogs.com/xuyulin/p/5468102.html