用Pillow处理图像

注意,安装时 pip install pillow

图像的常识

图像由像素构成
屏幕上每个像素由3个距离非常近的点构成,分别显示红、绿、蓝三种颜色,每个像
素可以由一个元组(r,g,b)表示,r,g,b通常是不超过255的整数
图像模式:
RGB: 一个像素有红、绿、蓝三个分量
RGBA: 一个像素有红、绿、蓝三个分量,以及透明度分量
CYMK: 一个像素有有青色(Cyan)、洋红色(Magenta),黄色(Yellow),黑 色(K代表黑)四个分量,即每个像素用元组(c,y,m,k)表示,对应于彩色打印机或
者印刷机的4种颜色的墨水。
L: 黑白图像。每个像素就是一个整数,代表灰度。

图像的缩放

from PIL import Image #导入Image类进行图像处理
img = Image.open("c:/tmp/pic/grass.jpg") #将图像文件载入对象img
w,h = img.size #获取图像的宽和高(单位:像素),img.size是个元组
newSize = (w//2,h//2) #生成一个新的图像尺寸
newImg = img.resize(newSize) #得到一张原图像一半大小的新图像
newImg.save("c:/tmp/pic/grass_half.jpg") #保存新图像文件
newImg.thumbnail((128,128)) #变成宽高各128像素的缩略图
newImg.save("c:/tmp/pic/grass_thumb.png", "PNG") 
#保存新图像文件为png文件
newImg.show() #显示图像文件

图像的旋转、翻转图像、和滤镜效果

from PIL import Image
from PIL import ImageFilter #实现滤镜效果需要
img = Image.open("true.png")
print(img.format,img.mode) #>>JPEG RGB
newImg = img.rotate(90,expand = True) #图像逆时针旋转90度
newImg = img.transpose(Image.FLIP_LEFT_RIGHT) #左右翻转
newImg = img.transpose(Image.FLIP_TOP_BOTTOM) #上下翻转(颠倒)
newImg = img.filter(ImageFilter.BLUR) #模糊效果
# 这里的参数可以改变有不同的效果
'''滤镜效果:
ImageFilter.CONTOUR 轮廓效果
ImageFilter.EDGE_ENHANCE 边缘增强
ImageFilter.EMBOSS 浮雕
ImageFilter.SMOOTH 平滑
ImageFilter.SHARPEN 锐化
'''
newImg.show()

图像的裁剪

from PIL import Image
img = Image.open("true.png")
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") # 设置一个底片大小
for i in range(0,3):
    for j in range(0,3):
        clipImg = img.crop((j*w,i*h,(j+1)*w,(i+1)*h))
        clipImg.save("grass%d%d.jpg" % (i,j))
        newImg.paste(clipImg,(j*(w + gap), i * ( h + gap)))
newImg.save("grass9.jpg") #保存九宫图
newImg.show()

在这里插入图片描述

图像的素描化

from PIL import Image
def makeSketch(img, threshold):
    w, h = img.size
    img = img.convert('L') #图像转换成灰度模式
    pix = img.load() #获取像素矩阵
    for x in range(w-1):
        for y in range(h-1):
            if abs(pix[x,y] - pix[x+1,y+1]) >= threshold:
                pix[x,y] = 0
        else:
            pix[x,y] = 255
    return img
img = Image.open("grass9.jpg")
img = makeSketch(img, 15) #阈值threshold为15
img.show()

在这里插入图片描述

给图像添加水印

原理:paste时可以用“掩膜”指定img的每个像素粘贴过去的透明度。如果透明
度为0,则完全透明,如果透明度为255,则完全遮盖imgSrc原来的像素。
mask参数即为掩膜,是个模式为"L"的图片(Image对象)
imgSrc.paste(img,(x,y),mask = msk)

from PIL import Image
def getMask(img,isTransparent,alpha):
    #返回由img变出来的掩膜
    if img.mode != "RGBA":
        img = img.convert('RGBA') #转换成RGBA模式的图像
    w, h = img.size
    pixels = img.load() #获取像素矩阵
    for x in range(w):
        for y in range(h):
            p = pixels[x,y] #p是一个四元素元组(r,g,b,a)
            if isTransparent(p[0],p[1],p[2]): #判断p是否应该变成透明像素
                #p[0],p[1],p[2] 分别是红、绿、蓝分量
                pixels[x,y] = (p[0],p[1],p[2],0)
            else:
                pixels[x,y] = (p[0],p[1],p[2],alpha)
    r, g, b, a = img.split() # 分离出img中的四个分量,a就是掩膜
    return a
img = Image.open("1.png")
msk = getMask(img,
lambda r,g,b: r >245 and g > 245 and b > 245, 130)
imgSrc = Image.open("true.png")
imgSrc.paste(img,(imgSrc.size[0] - img.size[0] - 30 ,
imgSrc.size[1] - img.size[1] - 30),mask = msk)
#粘贴透明图像img到imgSrc的右下角,用a做掩膜
imgSrc.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值