目录
在众多的Python的第三方的库中,Pillow库是一个强大且方便的库,它能够处理图像,比如批量的对一些图片进行处理,或者增加一些滤镜,剪裁等等
一、认识图像
1、图像的构成
一个图像是由若干的像素构成的,屏幕上的每一个像素都是用三个很相近的点构成,分别显示红,绿,蓝三种颜色,每一个像素可以用一个元组(r ,g,b)来表示,而元组里面的rgb通常是不超过255的整数
2、图像模式
图像一般会有以下几种模式:
①RGB:一个像素有红、绿、蓝三个分量
②RGBA:一个像素有红、绿、蓝三个分量,而剩下的那个A表示的是透明度
③CYMK:一个像素有青色、洋红色、黄色、黑色四个分量,每个像素可以用一个元组,即(c,y,m,k)来表示,这个是对应于彩色打印机或者印刷机的额四种颜色的墨水
④L:黑白图像,每一个像素就是一个整数,代表灰度
二、处理图像
1、图像缩放
我们用Python可以把一个图片进行缩放处理,变成略缩图
我们事先准备一张图片
然后在当前目录下写以下代码:
from PIL import Image #Pillow库在这里是PIL!!!
img = Image.open("D:\学习\Python\dwqs.jpg") #打开图片
w , h = img.size #获取一下这个图片的宽和高
newSize = (w//2 , h//2) #设置新的尺寸,即把那个图片的宽高÷2(整除)
newImage = img.resize(newSize) #创建一个新的图片,让这个新图片就是之前img应用上了新尺寸
newImage.save(r"D:\学习\Python\newdwqs.jpg") #保存
newImage.thumbnail((128,128)) #对新图像进行缩放,把最大的宽和高设置到128像素
newImage.save(r"D:\学习\Python\newnewdwqs.jpg") #保存
newImage.show() #程序完成后展示出来
看看成品:
2、图像的旋转和翻转
①旋转
from PIL import Image #Pillow库在这里是PIL!!!
from PIL.ImageOps import expand
img = Image.open("D:\学习\Python\dwqs.jpg")
print(img.format , img.mode) #打印图像的格式和模式
newImg = img.rotate(90 , expand = True) #逆时针旋转90度,expand是延伸图像的尺寸,防止因为旋转,导致图像被裁剪
newImg.show() #代码完成后显示一下
效果:
②翻转
from PIL import Image #Pillow库在这里是PIL!!!
from PIL.ImageOps import expand
img = Image.open("D:\学习\Python\dwqs.jpg")
print(img.format , img.mode) #打印图像的格式和模式
newImg = img.transpose(Image.FLIP_LEFT_RIGHT) #把图片水平翻转一下
newImg = img.transpose(Image.FLIP_TOP_BOTTOM) #把图片垂直翻转一下
newImg.show() #代码完成后显示一下
效果:
3、滤镜效果
我们可以通过Python让图片进行一些变化,比如我们可以把一个图片变成浮雕样式的:
from PIL import Image #Pillow库在这里是PIL!!!
from PIL import ImageFilter
img = Image.open("D:\学习\Python\dwqs.jpg")
newImg = img.filter(ImageFilter.EMBOSS) #EMBOSS是浮雕效果
#BLUR是模糊效果,CONTOUR是轮廓效果,EDGE_ENHANCE是边缘增强,SMOOTH平滑,SHARPEN锐化
newImg.show() #代码完成后显示一下
效果:
(我们的代码中没有使用save保存操作,但是还是显示出了一个图片,这是因为代码把图片保存在了我们的newImage变量中,我们没有指定路径,当我们去看这个图片的路径时,我们会发现他在我们的C盘的Temp文件夹下,这就说明了这个图片被放到了临时文件夹(就是%temp%搜出来的那些)save相当于把它保存到了指定的路径)
外存 (硬盘)
+-------------------+
| script.py | <- 代码文件
+-------------------+
|
| (运行时加载到内存)
v
内存 (RAM)
+-------------------+
| Python 解释器 |
| 变量 newImg | <- 变量存储在内存中
| Image 对象 | <- 数据存储在内存中
| (运行时的数据) |
+-------------------+
4、图片剪裁
我们在发朋友圈的时候,有时会把一个图片剪裁能一个九宫格的样子,这样可以让我们的朋友圈更创意,更好看,那么我们手搓一个图片剪裁器,来实现这个功能:
from PIL import Image #Pillow库在这里是PIL!!!
img = Image.open("D:\学习\Python\dwqs.jpg")
w , h = img.size[0]//3 , img.size[1]//3 #获取一会每一个小的九宫格图片的长和宽,需要是原图的三分之一
gap = 10 #设置一会拼好的大图,九个图片之间的间隔是10个像素
newImg = Image.new("RGB" , (w * 3 + gap * 2 , h * 3 + gap *2) , "white") #设置新的图片(大图),设置了新图片的模式,以及长宽,和这个gap的颜色
for i in range(0 , 3) :
for j in range(0 , 3) : #双重循环是用来遍历9个小图片的
clipImge = img.crop((j*w , i*h , (j+1)*w , (i+1)*h)) #在crop中,是一个四元组,分别代表左上,右上,左下,右下的四个坐标,通过坐标进行剪裁
clipImge.save("D:\学习\Python\DWQS\dwqs%d%d.jpg" % (i , j)) #多个图片,结合格式化,我们用i和j来命名
newImg.paste(clipImge , (j*(w + gap) , i*(h + gap))) #把小图片贴到大图片下面
newImg.save(r"D:\学习\Python\DWQS\new.jpg")
newImg.show()
效果:
5、图片素描
当我们看到看到喜欢的图片或风景,想把他变成素描风格来临摹,我们可以用Python把图片变成素描风格的,便于临摹:
from PIL import Image #Pillow库在这里是PIL!!!
def SuMiao (img , threshold) : #threshold阈值,用于判断像素之间的差异是否足够大
w , h = img.size #获取图像尺寸
img = img.convert('L') #把图像转化为灰度图像,“L”是黑白模式,上面有提到
pix = img.load() #返回一下图片的像素值,一会儿可以用pix[x,y]来访问图像(x,y)处的像素值
for x in range(w-1) :
for y in range(h-1) : #遍历了大部分元素(不包含最右面的一列和最下面的一行,因为要和右下角的像素比较,这些像素没有右下角的像素可比较,防止报错)(少了这些也没啥影响)
if abs(pix[x,y] - pix[x+1,y+1]) >= threshold : #abs()是取绝对值操作,括号里面就是计算像素xy和其右下角的差值
pix[x,y] = 0 #若满足要求,就把其灰度变成0,即黑色
else :
pix[x,y] = 255 #反之设置为255,即白色
return img
img = Image.open("D:\学习\Python\dwqs.jpg")
img = SuMiao(img , 15) #调用
img.show()
效果:
6、图片加水印
我们可以用Python在图片上添加上自己的水印,来保护自己的知识产权
下面我们来看一下代码:
from PIL import Image #Pillow库在这里是PIL!!!
def ShuiYin (img , isTransParent , alpha) : #isTransParent是一个函数,判断某个像素是不是要变透明,alpha表示透明度
if img.mode != "RGBA" :
img = img.convert('RGBA') #如果水印图片不是RGBA模式,改为RGBA模式
w , h = img.size
pixels = img.load() #获取水印图片的大小和每个像素
for x in range(w) :
for y in range(h) :
p = pixels[x , y] #遍历每一个像素
if isTransParent(p[0] , p[1], p[2]) : #把RGB这三个参数输入这个isTransParent这个函数,判断是不是要把这个边透明
pixels[x,y] = (p[0] , p[1] , p[2] , 0) #最后一个变成0,就是改成透明
else :
pixels[x,y] = (p[0] , p[1] , p[2] , alpha) #否则就使用其调用的透明度
r, g , b , a = img.split() #把图像的四个变量切开赋值
return a
img = Image.open(r"D:\学习\Python\ShuiYin.png") #打开水印图片
msk = ShuiYin(img , lambda r,b,g: r >245 and g > 245 and b > 245 , 130) #调用函数,第一个是水印图片,第二个是匿名函数,把函数中获取的rgb三个数值进行比较,如果大于145(即和白色相近)就变透明,第三个就是如果不相近,就把那个像素设置为130这个透明度
imgSrc = Image.open("D:\学习\Python\dwqs.jpg") #打开想要添加上水印的图片
imgSrc.paste(img , (imgSrc.size[0] - img.size[0] - 30 , imgSrc.size[1] - img.size[1] - 30) , mask = msk) #paste用于把一个图像附在另一个图像上,现在就是在imgSrc(原图)上操作,第一个参数是水印图,第二个是具体位置(默认在右下角),位置就是原图的的宽-水印图的宽,为了有30px的距离,再减了30,
imgSrc.save(r"D:\学习\Python\New.png") #成果保存
imgSrc.show()
成果:
以上就是Python与图像处理的全部内容:)