利用PIL把图像绘制成素描样

利用PIL把图像绘制成素描样,第1张

利用PIL把图像绘制成素描

上次的图像处理过去简单了,只需要调用百度API就好了,我这几天一直在想怎么在好好优化。想了半天就决定来到CSDN找找资料。还真有个好玩的文章:阳哥:流弊了!用Python分分钟把微信头像变卡通,油画,素描!的

文章目录
  • 前言
  • 一、使用步骤
    • 1.引入库
    • 2.使用matplotlib.pyplot绘制图形
    • 3.素描方法
    • 4.完整代码
  • 总结


前言

最近老喜欢去捣鼓python的图像处理,感觉这个就是一个大海,要学习的东西还蛮多的,不过越学越有趣,下面分享学习过程。


示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。多的不说了,今天有点晚了,直接上代码。

一、使用步骤 1.引入库

代码如下:

import matplotlib.pyplot as plt
from PIL import Image, ImageOps, ImageFilter
2.使用matplotlib.pyplot绘制图形

代码如下:

def img_show(img, title, inx):
    """
    创建绘画框
    :param img: 图像数据
    :param title: 图像标题
    :param inx: 图像位于那个子窗口
    """
    # 创建子图1行3列  绘制子图
    ax = plt.subplot(1, 3, inx)
    # 设置标题
    plt.title(title)
    # 显示图像
    if inx > 1:
        # plt图像为灰度图时会变色 的解决方法
        plt.imshow(img, cmap="gray")
    else:
        plt.imshow(img)
    # 不显示x y轴坐标
    plt.axis("off")
3.素描方法

代码如下:

def sumiao(path, blur=10, alpha=1.0):
    """
    图像素描
    :param path: 图片路径
    :param blur: 滤镜次数
    :param alpha: 绘制样式
    :return: 素描图像
    """
    # 读取图片并灰度化
    try:
        img = Image.open(path)
    except:
        return "图片路径错误"
    # 添加进绘图框
    img_show(img, "原图", 1)
    img = img.convert("L")
    # 添加进绘图框
    img_show(img, "灰度图", 2)
    # 复制图片
    img_copy = img.copy()
    # 图像二值反转 (有点吓人  不显示了)
    img_copy = ImageOps.invert(img_copy)
    # 图片添加滤镜
    for i in range(blur):
        img_copy = img_copy.filter(ImageFilter.BLUR)
    # 获取图像宽 高
    w, h = img.size
    for x in range(w):
        for y in range(h):
            a = img.getpixel((x, y))
            b = img_copy.getpixel((x, y))
            # 修改坐标对应的值
            img.putpixel((x, y), min(int(a * 255 / (256 - b * alpha)), 255))
    # 添加进绘图框
    img_show(img, "素描图", 3)
    # 显示绘画框
    plt.show()
    judge = input("是否保存图片(是或者否):")
    baocun(path, img, judge)
4.完整代码

代码如下:

import matplotlib.pyplot as plt
from PIL import Image, ImageOps, ImageFilter


def img_show(img, title, inx):
    """
    创建绘画框
    :param img: 图像数据
    :param title: 图像标题
    :param inx: 图像位于那个子窗口
    """
    # 创建子图1行3列  绘制子图
    ax = plt.subplot(1, 3, inx)
    # 设置标题
    plt.title(title)
    # 显示图像
    if inx > 1:
        # plt图像为灰度图时会变色 的解决方法
        plt.imshow(img, cmap="gray")
    else:
        plt.imshow(img)
    # 不显示x y轴坐标
    plt.axis("off")


def sumiao(path, blur=10, alpha=1.0):
    """
    图像素描
    :param path: 图片路径
    :param blur: 滤镜次数
    :param alpha: 绘制样式
    :return: 素描图像
    """
    # 读取图片并灰度化
    try:
        img = Image.open(path)
    except:
        return "图片路径错误"
    # 添加进绘图框
    img_show(img, "原图", 1)
    img = img.convert("L")
    # 添加进绘图框
    img_show(img, "灰度图", 2)
    # 复制图片
    img_copy = img.copy()
    # 图像二值反转 (有点吓人  不显示了)
    img_copy = ImageOps.invert(img_copy)
    # 图片添加滤镜
    for i in range(blur):
        img_copy = img_copy.filter(ImageFilter.BLUR)
    # 获取图像宽 高
    w, h = img.size
    for x in range(w):
        for y in range(h):
            a = img.getpixel((x, y))
            b = img_copy.getpixel((x, y))
            # 修改坐标对应的值
            img.putpixel((x, y), min(int(a * 255 / (256 - b * alpha)), 255))
    # 添加进绘图框
    img_show(img, "素描图", 3)
    # 显示绘画框
    plt.show()
    judge = input("是否保存图片(是或者否):")
    baocun(path, img, judge)


def baocun(path, img, judge="否"):
    # 保存图片  图片位置在原图片位置
    if judge == "是":
        storage = path.split(".")
        img.save(storage[0] + "1." + storage[1])


if __name__ == '__main__':
    # 设置Plt窗口的字体为仿宋
    plt.rcParams['font.sans-serif'] = ['FangSong']
    # 设置Plt窗口的大小
    plt.figure(figsize=(6, 4))
    # 设置Plt窗口标题
    plt.suptitle("图像素描画")
    path = input("请输入图片根路径:")
    # 调用素描方法
    sumiao(path, alpha=0.99)

天天学习,慢慢进步


总结

我最喜欢的一句话:革命尚未成功,同志仍需努力

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5689961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存