Python实现图像的手绘效果

news2024/11/28 6:46:08

  用Python实现手绘图像的效果

1.图像的RGB色彩模式

在这里插入图片描述

  图像一般使用RGB色彩模式,即每个像素点的颜色由红®、绿(G)、蓝(B)组成。RGB三个颜色通道的变化和叠加得到各种颜色,其中:

  • R红色,取值范围,0-255
  • G绿色,取值范围,0-255
  • B蓝色,取值范围,0-255

RGB形成的颜色包括了人类视力所感知的所有颜色。

2.图像的数组表示

图像是 一个由像素组成的二维矩阵,每个元素是一个RGB值:
在这里插入图片描述

3.图像的数组表示

图像是一个三维数组,维度分别是高度、宽度和像素RGB值

import numpy as np
from PIL import Image

if __name__ == '__main__':
    im = np.asarray(Image.open('./beijing.jpg'))
    print(im.shape,im.dtype)
(669, 1012, 3) uint8

4.图像的变换

  读入图像后,获得图像RGB值,修改后保存为新的文件:
对像素值取反:

import numpy as np
from PIL import Image

if __name__ == '__main__':
    a = np.asarray(Image.open('./beijing.jpg'))
    print(a.shape,a.dtype)
    b=[255,255,255]-a
    im=Image.fromarray(b.astype('uint8'))
    im.save('./pic/beijing2.jpg')

在这里插入图片描述

  读入图像后,获得图像RGB值,转换为灰度图,修改后保存为新的文件:
对像素值取反:

import numpy as np
from PIL import Image

if __name__ == '__main__':
    a = np.asarray(Image.open('./beijing.jpg').convert('L'))
    print(a.shape,a.dtype)
    b=255-a
    im=Image.fromarray(b.astype('uint8'))
    im.save('./pic/beijing3.jpg')

在这里插入图片描述
  读入图像后,获得图像RGB值,转换为灰度图,修改后保存为新的文件:
对像素做区间变换:
在这里插入图片描述
  读入图像后,获得图像RGB值,转换为灰度图,修改后保存为新的文件:
对像素做平方运算:

import numpy as np
from PIL import Image

if __name__ == '__main__':
    a = np.asarray(Image.open('./beijing.jpg').convert('L'))
    print(a.shape, a.dtype)
    b = 255*(a/255)**2
    im = Image.fromarray(b.astype('uint8'))
    im.save('./pic/beijing6.jpg')

在这里插入图片描述

5.图像手绘效果

手绘效果的几个特征:

  • 黑白灰色
  • 边界线 较重
  • 相同或相近色彩趋于白色
  • 略有光源效果
    利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变换来模拟人类视觉的远近程度。
 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.

光源效果:根据灰度变化来模拟人类视觉的远近程度。

  • 设计一个位于图像斜上方的虚拟光源
  • 光源相对于图像的俯视角为Elevation,方位角Azimuth
  • 建立光源对个点梯度值的影响函数
  • 运算出各点的新像素值
    在这里插入图片描述
    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 轴的影响

梯度归一化:

    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)#构造x和y轴梯度的三维归一化单位坐标系
    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)  # 光源归一化,光源与梯度相互作用,将梯度转化为灰度

图像生成:

    b = b.clip(0, 255)#为避免数据越界,将生成的灰度值剪裁至0-255
    im = Image.fromarray(b.astype('uint8'))  # 重构图像
    im.save('./beijingHD.jpg')

完整代码:

import numpy as np
from PIL import Image

# CSV: Comma-Seperate Values
if __name__ == '__main__':
    a = np.asarray(Image.open('./beijing.jpg').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.)#构造x和y轴梯度的三维归一化单位坐标系
    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)#为避免数据越界,将生成的灰度值剪裁至0-255
    im = Image.fromarray(b.astype('uint8'))  # 重构图像
    im.save('./beijingHD.jpg')

最终效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将时间序列转换为分类问题

本文将以股票交易作为示例。我们用 AI 模型预测股票第二天是涨还是跌。在此背景下,比较了分类算法 XGBoost、随机森林和逻辑分类器。文章的另外一个重点是数据准备。我们必须如何转换数据以便模型可以处理它。 在本文中,我们将遵循 CRISP-DM 流程模型&a…

机器学习强基计划8-4:流形学习等度量映射Isomap算法(附Python实现)

目录 0 写在前面1 什么是流形?2 什么是流形学习?3 等度量映射原理4 Python实现 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习…

【经验分享】Windows/Ubuntu上如何使用api下载kaggle上的数据集

1 下载kaggle的api 1.1 已经安装了Anaconda 打开cmd(Windows)/打开终端(Ubuntu) conda activate 你的conda环境名称 这里我的环境叫做Pytorch conda activate Pytorch然后执行pip install kaggle pip install kaggle如果你没…

沃尔玛、亚马逊影响listing的转化率4大因素,测评补单自养号解析

1、listing的相关性:前期我们在找词,收集词的时候,我们通过插件来协助我们去筛选词。我们把流量高,中,低的关键词都一一收集,然后我们再进行对收集得来的关键词进行分析,再进行挑词,…

云计算:优势与未来趋势

文章目录 前言一、云计算的优势1. 降低IT成本2. 提高工作效率3. 提高业务的可靠性和稳定性4. 提升安全性 二、未来发展趋势1. AI与云计算的融合2. 边缘计算的发展3. 多云的趋势4. 服务器和存储的创新 三、 行业应用案例1.金融行业2.医疗保健行业3.教育行业4.零售和物流行业 四、…

2.4 定点除法运算

学习目标: 学习如何实现一个基于余数查商法的定点除法运算,并能够正确地进行除法计算,包括处理舍入误差和溢出等问题。具体要求包括: 熟悉定点数的表示方法和定点数的基本运算法则,理解定点除法运算的基本概念和原理。…

逻辑回归评分系统(mimic数据集)

1.读取数据与数据处理 为什么不对数据进行标准化? 我们制作的评分卡,评分卡是要给医务人员们使用的基于病人的化验结果打分的一张卡片,而为了制作这张卡片,我们需要对我们的数据进行一个“分档”,比如说,…

大型Saas系统的权限体系设计(一)

X0 概述 在2B系统开发中,权限体系设计是绕不开的问题。最简单的当然是RBAC模型,只要通过用户、角色、权限几个有限的概念,就可以建立起一套基本可用的权限体系。再复杂一点,可以增加角色的层级概念,使得角色的配置更高…

验证回文串

题目:验证回文串 思路: 这段代码是一个判断字符串是否为回文的函数。它接受一个 string 类型的参数 s,并依次执行两个步骤: 首先对字符串进行预处理: 将大写字母转换成小写字母;移除非字母数字字符。 然…

平均10870元!2023一季度居民可支配收入公布(文末附最新招聘岗位)

今天是五一假期的第一天,暂别职场的打工人已经开始扎入人从众中放肆玩乐了,小编已经流下了羡慕的泪水。不过,今年的五一除了人流量上暴涨之外,出行成本也没被少吐槽,机票咱就不说了,酒店民宿的涨幅简直到了…

医院信息系统HIS源码——接口技术:RESTful API + WebSocket + WebService

云HIS系统采用SaaS软件应用服务模式,提供软件应用服务多租户机制,实现一中心部署多机构使用。相对传统HIS单机构应用模式,它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景,并提升区域内应用的标准化与规范…

fc坦克大战游戏完美复刻

文章目录 一、 介绍二、 制作基本物体三、 控制玩家坦克移动、转向四、 子弹脚本、爆炸脚本五、 敌人AI寻路算法六、 坦克生成点脚本七、 用链表实例化地图八、 玩家游戏控制器脚本九、 添加音效十、 资源包 一、 介绍 儿时经典游戏《坦克大战》完整复刻 发射子弹、生成敌人、…

「欧拉定理」[SDOI2008]仪仗队

[SDOI2008]仪仗队 https://ac.nowcoder.com/acm/problem/20313 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练。 仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所…

Golang每日一练(leetDay0050)

目录 147. 对链表进行插入排序 Insertion Sort List 🌟🌟 148. 排序链表 Sort List 🌟🌟 149. 直线上最多的点数 Max Points On A Line 🌟🌟🌟 150. 逆波兰表达式求值 Evaluate Reverse …

DDS基本原理与FPGA实现

DDS基本原理与FPGA实现 定义:DDS是指DDS信号发生器,采用直接数字频率合成技术。是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广…

服务运营| Healthcare Management Science 近期文章精选

作者:李舒湉 王畅 (一) Screening for preclinical Alzheimer’s disease: Deriving optimal policies using a partially observable Markov model nen Dumlu Z, Sayın S, Grvit İ H. Screening for preclinical Alzheimer’s disease: …

UG NX二次开发(C#)-显示-更改对象颜色

文章目录 1、前言2、UG NX中的更换对象颜色的功能3、采用UG NX二次开发实现颜色修改3.1 采用直接赋值对象颜色不能直接更改对象颜色3.2 采用NewDisplayModification的方法如下:1、前言 当一个三维模型展现在我们面前时,总会有颜色赋予三维模型的对象上,比如红色、蓝色、银灰…

工具链与其他-移动端网络优化的指标和策略

目录 网络指标 一个请求的时间消耗 页面加载 常见性能指标 网络优化策略 缓存 压缩 请求合并 离线包 预加载(前端大流量数据) 网络指标 一个请求的时间消耗 一个请求的发生到返回回来;有3部分时间 1.Scheduling(排队&…

初识C++之异常

目录 一、C中的常用处理错误方式 二、C异常的概念 1. throw 2. catch 3. try 三、异常的使用 1. 异常的抛出和捕获 1.1 异常的抛出和匹配原则 1.2 在函数调用链中异常栈展开匹配原则 四、异常体系 1. 自定义异常体系 2. C中的异常体系 五、 异常安全 六、异常规范…

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

项目是根据官网的示例工程进行修改的,版本参数如下: unity:2021.2.20 wolong:v2.1.0 il2cpp_plus:v2021_2.1.0 ------------------------------------------------------------- 1、安装:参考:第一篇文章Unity 热…