对python图像处理pillow库的极致应用

使用pillow库累计实现了对图像的27种处理与生成

'''
(B)图像滤波器的设计
准备N张图片文件(图自选),要求对图像进行批量处理,实现细节增强、边缘增强、图像缩放、中值滤波、图像锐化、手绘效果及冷暖色调整等功能,要求设计过程中写出每个功能代码并注释。
'''
'''声名:本程序将尽可能呈现图片处理力所能及的部分,请按需调用函数。PS:这也是本人写过最大的一个项目
由Peng zhilin创建,我愿称之为究极无敌图片生成处理器,对于图片的pillow库处理,本项目已在CSDN与Github中博客开源处理
'''

from PIL import Image, ImageFilter, ImageEnhance

def creat_image():   #第一部分:创建随机大小颜色的图片

    import random as ra
    number=int(input("需要随机创建的图片数目:"))
    for i in range(number):
        width=ra.randint(1,500)
        height=ra.randint(1,500)
        rad=ra.randint(1,255)
        blue=ra.randint(1,255)
        green=ra.randint(1,255)

        size=str(width)+','+str(height)
        color=str(rad)+','+str(blue)+','+str(green)

        img=Image.new('RGB',(width,height),(rad,green,blue))
        img.save(str(number)+".jpg")

#定义函数,打开并显示你想要的图片
def open_image():

    name=str(input("请输入要打开图片的名称(记得带后缀名:"))
    im=Image.open("{}".format(name))
    im.show()
    return im

#定义函数,缩放指定图片

def suofang(imga):

    imgb=imga.copy()
    n=int(input("缩放后长"))
    v=int(input("缩放后宽"))
    imgb.thumbnail((n,v))
    imgb.save("缩放.jpg")
    print("已缩放")
#对指定图片转换格式
#CMYK模式图像

def CMYK(imga):
    b=imga.convert('CMYK')
    b.save("CMYK.jpg")
    print("CMYK finish")
#左右镜像

def mirror(imga):
    b= imga.transpose(Image.FLIP_LEFT_RIGHT)
    b.save("mirror.rgba")
    print("mirror finish")

#上下颠倒

def topbotton(imga):
    b = imga.transpose(Image.FLIP_TOP_BOTTOM)
    b.save("topbotton.rgba")
    print("top_botton finish")

#转换为灰度
def huidu(imga):
    b=imga.convert('L')
    b.save("huidu.jpg")
    print("已灰度")
#对指定图片进行旋转
def rotate(imga):
    n=eval(input("旋转角度:"))
    b=imga.rotate(n)
    b.save("rotate.rgba")
#对指定图片进行过滤模糊操作
def mohu(imga):
    b=imga.filter(ImageFilter.GaussianBlur)
    b.save("mohu.jpg")
#色彩亮度调节
def color(imga):
    nhc=ImageEnhance.Color(imga)
    nhb = ImageEnhance.Brightness(imga)
    a=eval(input("请输入颜色的增强系数(小于一减弱,大于一增强)"))
    c=eval(input("请输入亮度的增强系数(小于一减弱,大于一增强)"))
    for nh in [nhc,nhb]:
        for ratio in [a,c]:
            b=nh.enhance(ratio)
            b.save("color.jpg")
#冷暖色调整
def warmcoolcolor(imga):
    R,G,B = imga.split()  # 将图片分割成 红绿蓝 三个
    R = R.point(lambda i: i * 1.3)  # 红色增强
    G = G.point(lambda i: i * 0.9)  # 绿色减弱
    B= B.point(lambda i: 0)  # 蓝色减为 0
    print("已调整冷暖")
    b = Image.merge(imga.mode, (R, G, B))  # merge合并
    b.save("warmcool.jpg")

#对比度调整
def contrast(imga):
    nh=ImageEnhance.Contrast(imga)
    a=eval(input("请输入对比度增强系数:"))
    b=nh.enhance(a)
    b.save("contrast.jpg")


#模糊滤镜
def blur(imga):
    b=imga.filter(ImageFilter.BLUR)
    b.save("blur.jpg")
    print("已模糊")
#轮廓滤镜
def contour(imga):
    b = imga.filter(ImageFilter.CONTOUR)
    b.save("contour.jpg")
    print("已轮廓")
#细节滤镜
def detail(imga):
    b = imga.filter(ImageFilter.DETAIL)
    b.save("detail.jpg")
    print("已细节")
#浮雕滤镜
def fudiao(imga):
    b = imga.filter(ImageFilter.EMBOSS)
    b.save("fudiao.jpg")
    print("已浮雕")
#查找边缘滤镜
def edge(imga):
    b = imga.filter(ImageFilter.FIND_EDGES)
    b.save("edge.jpg")

#锐化滤镜
def sharpen(imga):
    b = imga.filter(ImageFilter.SHARPEN)
    b.save("sharpen.jpg")
    print("已锐化")
#光滑滤镜
def guanghua(imga):
    b = imga.filter(ImageFilter.SMOOTH)
    b.save("guanghua.jpg")
    print("已光滑")
#边缘增强滤镜
def edge_strong(imga):
    b = imga.filter(ImageFilter.EDGE_ENHANCE)
    b.save("edgestrong.jpg")
    print("已边缘增强")
#边缘更多增强滤镜
def edge_more_strong(imga):
    b = imga.filter(ImageFilter.EDGE_ENHANCE_MORE)
    b.save("edgemorestrong.jpg")
#中值滤波
def middle(imga):
    a=eval(input("输入中值滤波值:"))
    b = imga.filter(ImageFilter.MedianFilter(a))# 在每个像素点为中心的3*3区域9个像素点中选择中间像素值作为新的值
    b.save("middle.jpg")
#高斯滤波
def Gauss(imga):
    a=eval(input("输入高斯滤波值:"))
    b = imga.filter(ImageFilter.GaussianBlur(a))
    b.save("Gauss.jpg")
#手绘效果
'''
此处函数参考了CSDN:原文链接:https: // blog.csdn.net / as604049322 / article / details / 119064878
'''
def hand_draw(imga):
    from PIL import Image
    from PIL import Image
    import numpy as np

    a = np.asarray(imga.convert('L')).astype('float')

    depth = 10.  # (0-100)
    grad = np.gradient(a)  # 取图像灰度的梯度值
    grad_x, grad_y = grad  # 分别取横纵图像梯度值
    grad_x = grad_x * depth / 100.
    grad_y = grad_y * depth / 100.
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A

    vec_el = np.pi / 2.2  # 光源的俯视角度,弧度值
    vec_az = np.pi / 4.  # 光源的方位角度,弧度值
    dx = np.cos(vec_el) * np.cos(vec_az)  # 光源对x 轴的影响
    dy = np.cos(vec_el) * np.sin(vec_az)  # 光源对y 轴的影响
    dz = np.sin(vec_el)  # 光源对z 轴的影响

    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)  # 光源归一化
    b = b.clip(0, 255)

    im = Image.fromarray(b.astype('uint8'))  # 重构图像
    im.save("handdraw.jpg")
    print("已手绘")

#至此,所有函数编写完成,只需按需调用,实现功能

'''
如何批量处理多张图片?
使用for循环结构
例如:
# 设置输入和输出目录
input_dir = '/path/to/input/directory/'
output_dir = '/path/to/output/directory/'
 
# 循环输入目录中的所有JPEG图像, 这里如果你是别的类型格式图片,直接更改点后图片类型即可
for filename in os.listdir(input_dir):
    if filename.endswith('.jpg') or filename.endswith('.jpeg'):
注:本段注释参考CSDN:原文链接:https://blog.csdn.net/weixin_49030835/article/details/129103215
'''

#调用函数进行多张图处理
#此处为了便于测试直接将图片储存在了python charm的Project文件夹内
'''
在实现对多张图片进行处理时引发了许多关于数据结构与处理的相关思考与优化
其中一个较好的优化方法是:使用数组对象(JavaScript中概念)类似于python中的字典,将一张张图片作为字典中的值对其进行各自不同的编辑与操作
这里往后还有许多延申,此处因篇幅问题不做多谈
'''

#循环打开多张图片,并将结果放入集合里
n=eval(input("请输入图片总数"))
a=[]
for i in range(1,n+1):
    imga=open_image()
    a1=[imga]
    a+=a1

#对图片1
#缩放(已实现)
suofang(a[0])
#图片2
#CMKY
CMYK(a[1])
#镜像
mirror(a[1])
#颠倒
topbotton(a[1])
#图片3
#灰度
huidu(a[2])
#旋转(已实现)
rotate(a[2])


#图片4
#色彩亮度调节(已实现)
color(a[3])
#冷暖色调节
warmcoolcolor(a[3])
#对比度(已实现)
contrast(a[3])
#中值(已实现)
middle(a[3])
#模糊
mohu(a[3])
#轮廓
contour(a[3])
#锐化
sharpen(a[3])
#光滑
guanghua(a[3])
#边缘增强
edge_strong(a[3])
#细节
detail(a[3])
#浮雕
fudiao(a[3])
#手绘(已实现)
hand_draw(a[3])
#对不同图片进行不同效果处理

'''
后记:
原本还想写多张图片间的编辑,相加相减等等,但发现单张图像处理已经是一个相对庞大的工作了,遂停手
我也意识到,如果使用面向对象编程,有可能会使整个结构与思路更加简单,但苦于时间问题以及我对面向对象的编程的不熟练,这一改善方案只能在未来能够期待了。
同时,在这一题的编程过程中,我想将来的一天或许可以利用QT来制作一个图片处理的软件,当然,这都是后话了。
'''

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值