Python与图像处理

发布于:2025-04-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

一、认识图像

1、图像的构成

2、图像模式

二、处理图像

1、图像缩放

2、图像的旋转和翻转

3、滤镜效果

4、图片剪裁

5、图片素描

6、图片加水印


在众多的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与图像处理的全部内容:)