使用Python免费自制线稿生成工具

图片转线稿代码

这是一个Python脚本,它使用PIL库(Python Imaging Library,也被称为Pillow)和NumPy库将图片转换为线稿效果。以下是代码的具体内容:

# 文件名:ImgProcess.py

from PIL import Image
import numpy as np

def imgprocess(filename, out_puts="img_processed.jpg"):
    """
    将输入的图片转换为线稿效果,并保存为新的图片文件。

    参数:
        filename (str): 输入图片的文件路径。
        out_puts (str): 输出图片的文件路径,默认为 "img_processed.jpg"。

    返回:
        None
    """
    # 虚拟亮度,用于调整线稿的深浅
    depth = 10

    # 打开图片,并将其转换为灰度图
    a = np.array(Image.open(filename).convert('L'))

    # 计算图片的梯度,得到每个像素点在x和y方向上的变化率
    grad_x, grad_y = np.gradient(a)

    # 根据虚拟亮度调整梯度的大小
    grad_x = grad_x * depth / 100
    grad_y = grad_y * depth / 100

    # 光源效果,设定光源的方向
    vec_el = np.pi / 2
    vec_az = np.pi / 4.

    # 计算光源在x、y和z方向上的分量
    dx = np.cos(vec_el) * np.cos(vec_az)
    dy = np.cos(vec_el) * np.sin(vec_az)
    dz = np.sin(vec_el)

    # 计算每个像素点的单位向量
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A

    # 根据光源的方向和每个像素点的单位向量,计算每个像素点的亮度
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)

    # 将亮度值限制在0到255之间
    b = b.clip(0, 255)

    # 将处理后的图片数据转换为PIL图片对象,并保存为新的文件
    img = Image.fromarray(b.astype('uint8'))
    img.save(out_puts)

# 线稿示例
# 调用imgprocess函数,将'./static/bc.jpg'图片转换为线稿,并保存为'img_processed.jpg'
imgprocess(filename='./static/bc.jpg')

使用这段代码,你可以将任何输入的图片转换为线稿效果,并保存为新的图片文件。

以下是将其转换为可执行脚本:
为了将上述脚本转换为一个可以接受--image_path命令行参数的可执行文件,需要进行几个步骤:

  1. 使用argparse模块来解析命令行参数。
  2. imgprocess函数内部的硬编码文件路径替换为从命令行参数中获取的路径。
  3. 编写一个主函数main来调用imgprocess函数,并处理命令行参数。
  4. 在脚本的末尾添加if __name__ == "__main__":块来调用main函数。

下面是修改后的脚本:

# 文件名:img_to_lineart.py

from PIL import Image
import numpy as np
import argparse

def imgprocess(image_path, out_puts="img_processed.jpg"):
    """
    将输入的图片转换为线稿效果,并保存为新的图片文件。

    参数:
        image_path (str): 输入图片的文件路径。
        out_puts (str): 输出图片的文件路径,默认为 "img_processed.jpg"。

    返回:
        None
    """
    # 虚拟亮度,用于调整线稿的深浅
    depth = 10

    # 打开图片,并将其转换为灰度图
    a = np.array(Image.open(image_path).convert('L'))

    # 计算图片的梯度
    grad_x, grad_y = np.gradient(a)

    # 根据虚拟亮度调整梯度的大小
    grad_x = grad_x * depth / 100
    grad_y = grad_y * depth / 100

    # 光源效果,设定光源的方向
    vec_el = np.pi / 2
    vec_az = np.pi / 4.

    # 计算光源在x、y和z方向上的分量
    dx = np.cos(vec_el) * np.cos(vec_az)
    dy = np.cos(vec_el) * np.sin(vec_az)
    dz = np.sin(vec_el)

    # 计算每个像素点的单位向量
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A

    # 根据光源的方向和每个像素点的单位向量,计算每个像素点的亮度
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)

    # 将亮度值限制在0到255之间
    b = b.clip(0, 255)

    # 将处理后的图片数据转换为PIL图片对象,并保存为新的文件
    img = Image.fromarray(b.astype('uint8'))
    img.save(out_puts)

def main():
    parser = argparse.ArgumentParser(description='Convert an image to lineart.')
    parser.add_argument('--image_path', type=str, required=True, help='Path to the input image file.')
    parser.add_argument('--output_path', type=str, default="img_processed.jpg", help='Path to save the processed image file.')
    args = parser.parse_args()

    imgprocess(args.image_path, args.output_path)

if __name__ == "__main__":
    main()

接下来,为了将这个Python脚本转换为可执行文件,你需要做以下事情:

  1. 确保你的Python环境已经安装了所有必需的包(Pillow 和 argparse)。
  2. 将上述脚本保存为 img_to_lineart.py
  3. 在命令行中,使用以下命令将脚本转换为可执行文件(假设你已经安装了 pyinstaller):
pyinstaller --onefile img_to_lineart.py

这将会创建一个单独的可执行文件(在Windows上是.exe,在Linux或macOS上是没有扩展名的文件)。

  1. 运行可执行文件,并传入--image_path参数:
./img_to_lineart --image_path /path/to/your/image.jpg

或者,在Windows上:

img_to_lineart.exe --image_path C:\path\to\your\image.jpg

这样,你就可以通过命令行参数来指定输入图片的路径,并运行脚本将其转换为线稿效果了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/557683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot结合vue实现文件上传下载功能

紧接着上一次的博客,这次来实现一下文件(主要是图片)的上传和下载功能,上一次的博客如下所示: Springboot集成JWT token实现权限验证-CSDN博客 其实文件的上传和下载功能(后端的部分),在我之前的博客就已经有写了,所以…

力扣经典150题第三十题:长度最小的子数组

目录 力扣经典150题解析之三十:长度最小的子数组1. 介绍2. 问题描述3. 示例4. 解题思路方法一:滑动窗口 5. 算法实现6. 复杂度分析7. 测试与验证测试用例设计测试结果分析 8. 进阶9. 总结10. 参考文献感谢阅读 力扣经典150题解析之三十:长度最…

重构国内游戏账号登录系统的思考和实践

本期作者 背景 账号登录系统,作为游戏发行平台最重要的应用之一,在当前的发行平台的应用架构中,主要承载的是用户的账号注册、登录、实名、防沉迷、隐私合规、风控等职责。合规作为企业经营的生命线,同时,账号登录作为…

数据结构系列-堆的实现

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 堆的实现,其实也就是二叉树的实现,我们在这里是基于数组对其进行实现的! typedef struct Heap {HPDataType* a;int size;int capacity; }HP;…

毕业设计做一个linux操作系统怎么样?

毕业设计选择做操作系统的话,不太建议做的规模太大,你可以参考一下Linux内核的代码量,完全从头写的工作量还是挺大的。如果是一行一行从头写,学生期间,一学期写10000-20000行有效代码就很强了,而且还要学习…

【面经】2024春招-云计算后台研发工程师1(3个问题,移动TW等)

【面经】2024春招-云计算后台研发工程师1(3个问题,移动&TW等) 文章目录 岗位与面经基础1:数据库 & 网络(3个问题)基础2:系统 & 语法模板3:算法 & 项目(移…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美:AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐👉AI绘画教程:Midjourney使用方法与技巧从入门到精通内容简介获取方式👉搜索之道:信息素养与终身…

Timelapse - 2024.04.09 -Win

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者 本人负责,作者不为此承担任何责任,如…

centos6.5重启docker容器死机问题

概述 近期在整理服务问题,使用docker容器重新部署服务。 过程中有不少坑,主要是系统配置和系统版本的问题。 环境 CentOS release 6.5 (Final) docker version 1.7.1 问题现象 使用restart命令重启docker容器,系统突然卡死&#xff0c…

protobuf抓包,读包

protobuf抓包 有时候会遇到使用protobuf协议的http请求, 而protobuf封包后的二进制几乎不可读, 如何调试呢 protobuf就是类似一个json的数据传输协议, 相比json更快, 体积更小; 缺点就是不可读 Content-Type: application/x-protobuf数据大概是下面这样的(浏览器开发者工具 自…

(十八)C++自制植物大战僵尸游戏的游戏暂停实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 游戏暂停 当玩家遇到突发事件,可以通过暂停功能暂停游戏,以便及时处理问题。在激烈的游戏中,玩家可能需要暂停游戏来进行策略调整。此外,长时间的游戏对战可能会让玩…

爬取微博评论数据

# -*- coding: utf-8 -*- import requests #用于发送请求并且拿到源代码 from bs4 import BeautifulSoup #用于解析数据 1.找到数据源地址并且分析链接 2.发送请求并且拿到数据 3.在拿到的数据中解析出需要的数据 4.存储数据 headers { "User-Agent": "…

ubunt18.04安装ROS2

本文无废话,实现了ubunt18.04 下ros2的安装,并且同时兼容ros和ros2 如果想完ros(1)的,请参考我的前一篇文章:ubunt18.04安装ROS避坑指南 参考: https://blog.csdn.net/cau_weiyuhu/article/deta…

Ubuntu20.04版本命令行设置挂载磁盘,并设置开机自动挂载

最近部署应用 系统是Ubuntu20.4版本的Linux系统,加了数据盘,需要格式化后挂载,记录下: Linux 数据盘挂载(采用 parted 分区工具)-格式化为 ext4 1. 初始化 Linux 数据盘 挂载数据盘后或者随实例创建时一并创建的数据盘&#xff…

【数学建模】最优旅游城市的选择问题:层次分析模型(含MATLAB代码)

层次分析法(The analytic hierarachy process,简称AHP)是一种常用的决策分析方法,其基本思路是将复杂问题分解为多个组成部分,然后对这些部分进行逐一评估和比较,最后得出最优解决方案。(例如&a…

Linux 5.10 Pstore 学习之(二) 原理学习

目录 编译框架模块初始化pstore子系统ramoops模块初始化实例化注册回调数据结构 pstore_blk模块pstore_zone模块 测试扩展调试 编译框架 目标结构 linux_5.10/fs/pstore/ ├── blk.c ├── ftrace.c ├── inode.c // 核心1 ├── internal.h ├── Kconfig ├── …

Vitis HLS 学习笔记--scal 函数-探究

目录 1. Vitis HLS重器-Vitis_Libraries 2. 初识scal() 3. 函数具体实现 3.1 变量命名规则 3.2 t_ParEntries解释 3.3 流类型详解 3.4 双重循环 4. 总结 1. Vitis HLS重器-Vitis_Libraries 在深入探索Vitis HLS(High-Level Synthesis)的旅程中&…

了解 containerd 中的 snapshotter,先从 native 开始

本文内容节选自 《containerd 原理剖析与实战》,本书正参加限时优惠内购,点击阅读原文,限时 69.9 元购买。 上一篇文章《一文了解 containerd 中的 snapshot》中,介绍了containerd 的 snapshot 机制,了解到 containerd…

64B/66B编码 自定义PHY层设计

一、前言 之前的一篇文章讲解了64B/66B的基本原理,本篇在基于64B/66B GT Transceiver的基础之上设计自定义PHY。基本框图如下。 二、GT Mdule GT Module就按照4个GT CHannel共享一个GT COMMON进行设置,如下图。要将例子工程中的GT COMMON取出&#xff…

3.4 海思SS928开发 - 烧写工具 - BurnTool Emmc 烧写

3.4 烧写工具 - BurnTool Emmc 烧写 BurnTool 工具提供了多种烧写方式,这里只介绍最常用的 烧写emmc方式。 环境准备 PC 与单板之间连接好调试串口以及网线。 将厂商提供的出厂镜像拷贝至 PC 硬盘上,解压后得到的文件如下: . ├── boot_…