Python图像处理模块PIL

最近在学习数字水印技术,因为要用到图像处理这块,就学习一下pythond的图像处理模块PIL
大家可参考以下学习博客

Python图像处理PIL各模块详细介绍
参考博客发表于2018-1-21

1 基本操作

1.1 第一步

在这里插入图片描述
我把上面这张杨枝甘露图片复制到F盘,存为food.jpg

1.2 第二步

from PIL import Image
im=Image.open("F:/food.jpg")
print(im)

用pycharm运行以上代码。
运行结果如下
在这里插入图片描述
打印出了这样图片是1080*1440 大小的RGB图片

1.3 第三步

将这张图片另存为F盘下的food1.png形式

from PIL import Image
im=Image.open("F:/food.jpg")
print(im)
im.save("F:/food1.png")
im1=Image.open("F:/food1.png")
print (im1)
print (im.format,im.size,im.mode)

运行结果
1) F盘下多了一张图片
在这里插入图片描述
2)在这里插入图片描述
上图可以看到两张图片的序列号是不一样的,而且一张的format是JPEG,另外一张是PNG

2 将图片转换为黑白模式

newImage=im.convert("L")
newImage.save("F:/newImage.jpg")
print(newImage)

打印结果
在这里插入图片描述
文件夹多了一个newimage.jpg
在这里插入图片描述
在这里插入图片描述

3 存储图片的信息

我们将图片转换为不同的格式之后,我们需要将这些信息存储起来
Image.open()可以返回一个图像类型对象,打印这个对象的info属性,info中保存了图片的信息

# 打印黑白图片的信息
print (newImage.info)

在这里插入图片描述

4 用image类画图

上面我们可以通过convert来改变image的mode,数字水印中需要改变水印图片的大小来使得水印图片去完全覆盖原始图片。

box=Image.new("RGB",(128,128),"#FF0000")
box.show()

在这里插入图片描述

可以看到画了一个bmp 格式的图像。

5 图像的截取

我们要截取图像的一部分,就要确定图像边缘的坐标,对于矩形图像,定义了左上的x,y、右x、下y、四个点的位置坐标,用元组来表示
如下为示意图box(b1,a1,b2,a2),下图来自https://blog.csdn.net/zhangziju/article/details/79123275

通过上图我们可以一目了然,我们现在截取imgae从左上角的1/2
image 图片大小为在这里插入图片描述
故我们设置box坐标(0,0,1080/2,1440/2)

box=(0,0,540,720)
cut_im=im.crop(box)
cut_im.show()
cut_im.save("F:/cut_im.png")

输出结果为
在这里插入图片描述

6 将一张图像粘贴到另外一张图像上

这个方法类比数字水印中将水印嵌入到原始图像中得到加了数字水印的图片。但是数字水印的嵌入是更加复杂的
第一步 先定义box
box 与上面截取图像操作的box不同,在这里box可以是一个给定左上角的二元组,也可以跟截取图像中的四元组。如果是四元组的话,被粘贴的图像的尺寸必须与原始尺寸是一样的
#将上面定义的红色方块粘贴到图像上
redbox=Image.new(“RGB”,(128,128),"#FF0000")

# 因为redbox的大小与原始图像不同,使用二元组粘贴到im的左上角
im.paste(redbox,(0,0))
im.show()

在这里插入图片描述

7 滤波器的使用

7.1 滤波器的概念

通过高通滤波器,可以保证高频信号通过,低频信号被过滤,低通滤波器,可以使得低频信号通过,高频信号被过滤,我们知道图片的高频信号集中在边缘部分,使用高通滤波器过滤低频信号就可以得到图像的轮廓。

7.2 PIL 中的滤波器函数

PIL中预定义的滤波器是:
**BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。**其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测。

# 导入图片过滤器模块
from PIL import ImageFilter
contourim=im.filter(ImageFilter.CONTOUR)
contourim.show()
contourim.save("F:/contourim.png")

在这里插入图片描述

8使用两张图像合成一张图像

在这里要使用Blend类和透明度变量alpha
首先选用如下两张图片,这里要保证两张图片的大小和模式是一样的
在这里插入图片描述
在这里插入图片描述

im=Image.open("F:/food.jpg")
print(im)
girl=Image.open("F:/girl.jpg")
print (girl)

输出
在这里插入图片描述

通过输出结果可以看出两张图片的大小是不一样的,第一张是10801440,第二张是16781479,模式都是RGB。

那透明度的临界值是[0,1],当alpha=0的时候,返回第一张图片的拷贝,当alpha=1的时候,返回的是第二张图的拷贝

im=Image.open("F:/food.jpg")
girl=Image.open("F:/girl.jpg")
# 调整第二张图片的大小与第一张是一样的
girl=girl.resize(im.size)
girl.show()
# 设置透明度为0,5
blendim=Image.blend(im,girl,0.5)
blendim.show()

输出图片效果如下
在这里插入图片描述

9使用两张图像和一张图像的分量(mask)作为透明度来合成一张新的图像

其中mask的模式可以为“1”,“L”或者“RGBA”,这里与上面的blend()方法相比的话,就是把数值型透明度变量改为mask(图片利用split()方法得到的分量)

# 将第一张图像分离,分离出r,g,b
r,g,b=im.split()
print(b.mode)
im=Image.composite(im,girl,b)
im.show()

b的模式是L。这里是可以的
在这里插入图片描述
效果如下:
在这里插入图片描述

10 处理图片中的像素点

使用自定义的function()函数来处理图片中的每一个像素点,如果image代表的图像中的每一个图像有多个通道,function生成的函数就作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器

def function1(x):
    return x*0.3
def function2(y):
    return y*2.0
im_eval1=Image.eval(im,function1)
im_eval2=Image.eval(im,function2)
im_eval1.show()
im_eval2.show()

打印出来的im_eval1
在这里插入图片描述
打印出来的im_eval2
在这里插入图片描述

11 返回图像的一些数据

11.1 getbands类

getbands类就是元组的字符串形式,返回每个通道名称的元组,如果图像mode是RGB,就返回(“R”,“G”,“B”)

print(im.getbands())

在这里插入图片描述

11.2 getbbox类

返回结果是一个四元组或者NONE
计算图像非零区域的包围盒。这个包围盒是一个4元组,定义了左、上、右和下像素坐标。如果图像是空的,这个方法将返回空。

print(im.getbbox())

在这里插入图片描述

11.3 getdata类

这个方法返回的sequence对象是PIL内部数据类型,它只支持某些sequence操作,包括迭代和基础sequence访问。使用list(im.getdata()),将它转换为普通的sequence。Sequence对象的每一个元素对应一个像素点的R、G和B三个值。

seq=im.getdata()
print(seq)
seq1=list(seq)
print (seq1[0])
print (seq1[1])
print (seq1[2])

在这里插入图片描述

11.4 getextrema

返回一个2元组,包括该图像中的最小和最大值。
该方法返回了R/G/B三个通道的最小和最大值的2元组。

print(im.getextrema())

在这里插入图片描述

11.5 getpixel()

返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。

11.6 Histogram()

返回一个图像的直方图(是一个list)。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。

12 小结

以上对图像进行各种变换,以及获得图像的数据操作
还有其他一系列变换都是类似操作,这里就留着大家去学习吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nefelibat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值