利用Python将图片批量转化成素描图的过程记录
admin
2023-04-30 22:20:11
目录

        前言

        正常图片转化成素描图片无非对图片像素的处理,矩阵变化而已。目前很多拍照修图App都有这一功能,核心代码不超30行。如下利用 Python 实现读取一张图片并将其转化成素描图片。至于批处理也简单,循环读取文件夹里的图片处理即可。具体代码可以去我的 GitHub 下载。

        程序

        Method 1

        def plot_sketch(origin_picture, out_picture) :
            a = np.asarray(Image.open(origin_picture).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.0)
            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(out_picture)
            print("转换成功,请查看 : ", out_picture)
        
        

        Method 2

        def plot_sketch2(origin_picture, out_picture, alpha=1.0):
            img = Image.open(origin_picture)
            blur = 20
            img1 = img.convert('L')  # 图片转换成灰色
            img2 = img1.copy()
            img2 = ImageOps.invert(img2)
            for i in range(blur):  # 模糊度
                img2 = img2.filter(ImageFilter.BLUR)
            width, height = img1.size
            for x in range(width):
                for y in range(height):
                    a = img1.getpixel((x, y))
                    b = img2.getpixel((x, y))
                    img1.putpixel((x, y), min(int(a*255/(256-b*alpha)), 255))
            img1.save(out_picture)
        
        

        完整代码

        from PIL import Image, ImageFilter, ImageOps
        import numpy as np
        import os
        
        
        def plot_sketch(origin_picture, out_picture) :
            a = np.asarray(Image.open(origin_picture).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.0)
            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(out_picture)
            print("转换成功,请查看 : ", out_picture)
        
        
        def plot_sketch2(origin_picture, out_picture, alpha=1.0):
            img = Image.open(origin_picture)
            blur = 20
            img1 = img.convert('L')  # 图片转换成灰色
            img2 = img1.copy()
            img2 = ImageOps.invert(img2)
            for i in range(blur):  # 模糊度
                img2 = img2.filter(ImageFilter.BLUR)
            width, height = img1.size
            for x in range(width):
                for y in range(height):
                    a = img1.getpixel((x, y))
                    b = img2.getpixel((x, y))
                    img1.putpixel((x, y), min(int(a*255/(256-b*alpha)), 255))
            img1.save(out_picture)
        
        
        if __name__ == '__main__':
            origin_picture = "pictures/5.jpg"
            out_picture = "sketchs/sketch.jpg"
            plot_sketch(origin_picture, out_picture)
        
            origin_path = "./pictures"
            out_path = "./sketchs"
            dirs = os.listdir(origin_path)
            for file in dirs:
                origin_picture = origin_path + "/" + file
                out_picture = out_path + "/" + "sketch_of_" + file
                plot_sketch2(origin_picture, out_picture)
        
        
        

        结果








        总结 

        到此这篇关于利用Python将图片批量转化成素描图的文章就介绍到这了,更多相关Python图片批量转素描图内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

        相关内容

        热门资讯

        脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
        世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
        demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
        北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
        苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
        世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
        应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
        猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
        长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
        阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
        脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
        demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
        北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
        苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
        长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
        阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
        猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...