python实现科学计算与自定义手绘风

news2025/1/11 6:36:19

目标:
1.运用科学计算库进行矩阵分析和数值运算;
2.掌握numpy库的使用。

要点:这是一个使用numpyPIL库提取图像特征形成手绘效果的实例。

使用PIL库获取了图像的轮廓,虽然提取了轮廓,但这个轮廓缺少立体感,视觉效果不够丰满。
光线照射使立体物出现明暗变化,运用这个原理是空间素描的基本方法,本文介绍采用Python程序增加深浅层次变化,从而使图像轮廓更富立体感、空间感和色泽感,接近人类手绘效果。

一、原理

(一)图像的数组表示

import numpy as np
from PIL import Image

im=np.array(Image.open('D:\\小窝海绵宝宝.png'))
print(im.shape,im.dtype)

在这里插入图片描述

  • 图像转换对应的ndarray类型是3维数据,如(809, 1499, 4) 其中,前两维表示图像的长度和宽度,单位是像素
    第三维表示每个像素点的RGB值,每个RGB值是一个单字节整数。

(二)像素处理

  • PIL库包括图像转换函数,能够改变图像为单个像素的表示形式。
    使用convert()函数,这是’L’模式,表示将像素表示从RGB的3字节形式转变为单一数值形式, 这个数值范围在0到255,表示灰度色彩变化。

此时,图像从彩色变为带有灰度的黑白色。转换后,图像的ndarray类型变为二维数据,每个像素点色彩只由一个整数表示。

im=np.array(Image.open('D:\\小窝海绵宝宝.png').convert('L'))
print(im.shape,im.dtype)

在这里插入图片描述

  • 通过对图像的数组转换,可以利用numpy 访问图像上任意像素值
    例如,获取访问位于坐标(20, 300)像素的颜色值或获取图像中最大和最小的像素值。
    也可以采用切片方式获取指定行或列的元素值,甚至修改这些值。

在这里插入图片描述

  • 将图像读入ndarray数组对象后,可以通过任意数学操作来获取相应的图像变换。
    以灰度变换为例,分别对灰度变化后的图像进行反变换、区间变化和像素值平方处理。

需要注意,有些数学变换会改变图像的数据类型,如变成整数型等,所以在重
新生成PIL图像前要先将数据类型通过numpy.uint()变换成整数

灰度值指黑白图像中点的颜色深度,范围从0到255,白色为255,黑色为0,因此.黑白图像也被称为灰度图像。
黑白图像主要用于构建非可见光图像,例如医学中超声波形成的图像等。RGB 彩色图片可以通过如下公式转换成灰度值:
Gray=R0.3+G0.59+B*0.11
严格说,黑白图像是计算机计算能力或存储能力不充分时形成图像的重要方式,
如果单个像素点能获得数据值种类超过256且计算资源足够,采用彩色图像也可以
构建非可见光图谱,例如医学应用中新发展的彩色超声波成像等。

二、实例

(一)图像的数组表示和像素计算

将原图、反变化后、区间变化后、平方值处理后的四张图效果放在一起

import numpy as np
from PIL import Image

im0=np.array(Image.open('小窝海绵宝宝.png').convert('L'))
im1=255-im0#反变换
im2=(100/255)*im0+150#区间变换
im3=255*(im1/255)**2#像素平方处理
pil_im=Image.fromarray(np.uint(im1))#将数据类型重新变换成整数
pil_im.show()
pil_im=Image.fromarray(np.uint(im2))
pil_im.show()
pil_im=Image.fromarray(np.uint(im3))
pil_im.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
原图:
在这里插入图片描述

(二)图像的手绘效果

根据自己喜欢的风格调整光源参数(俯视、方位角度等)、梯度值或其他参数实现图像的手绘风。

通常获得铅笔画风格图像采用ImageFilter.CONTOUR滤镜,它能够将图像的轮廓信息提取出来,原图像
在视觉上更加的立体,获得的轮廓图像缺乏立体感。
为了实现手绘风格,即黑白轮廓描绘,首先需要读取原图像的明暗变化,即灰度值。从直观视觉感受上定义,图像灰度值显著变化的地方就是梯度,它描述了图像灰度变化的强度。
通常可以使用梯度计算来提取图像轮廓,numpy 中提供了直接获取灰度图像梯度函数gradient(),传入图像数组表示即可返回代表x和y各自方向上梯度变化的二维元组。
在这里插入图片描述

from PIL import Image
import numpy as np

#定义光源
vec_e1=np.pi/2.2 #光源的俯视角度,弧度值
vec_az=np.pi/4. #光源的方位角度,弧度值
depth=10. ##(0-100)
im=Image.open('小窝海绵宝宝.png').convert('L')
a=np.asarray(im).astype('float')
grad=np.gradient(a) #取图像灰度的梯度值
grad_x,grad_y=grad #分别取横纵图像梯度值

#给x和y方向梯度值赋权值depth
grad_x=grad_x*depth/100.
grad_y=grad_y*depth/100.
#转化为立体坐标体系
dx=np.cos(vec_e1)*np.cos(vec_az) #光源对x轴的影响
dy=np.cos(vec_e1)*np.sin(vec_az) #光源对y轴的影响
dz=np.sin(vec_e1)#光源对z轴的影响
A=np.sqrt(grad_x**2 + grad_y**2+1.)
#总梯度除以幅值得到每个像素单元的梯度值
uni_x=grad_x/A
uni_y=grad_y/A
uni_z=1./A
a2=255*(dx*uni_x + dy*uni_y + dz*uni_z)
a2=a2.clip(0,255)
im2=Image.fromarray(a2.astype('uint8'))
im2.save('手绘小窝海绵宝宝.png')

这段代码是一个Python脚本,用于将一张灰度图转化为带有光影效果的手绘风格的图片。
首先,通过PIL库中的Image类读取一张图片,这里的图片是一张名为“小窝海绵宝宝.png”的PNG图像。.convert('L')指令将彩色图片转化为灰度图。
然后,定义光源的方向,包括俯视角度和方位角度,以及深度值(范围在0-100之间),并将其赋值给各自的变量。这些值将影响后面的光影效果。
接下来,用numpy库中的gradient函数求取图像灰度的梯度值(即图像中每个像素点在x与y方向上的梯度),并分别赋值给grad_xgrad_y两个数组变量。
然后,将x和y方向上的梯度值分别乘以depth(深度)除以100后再赋值给grad_xgrad_y,这一步是为了给梯度值赋予更大的权值,从而加深光影效果。
接着,将梯度值转化为立体坐标体系,即将光源的影响分别对应到x、y、z三个轴上,这一步会得到3个系数dx、dy、dz。
再计算每个像素单元的梯度值,即通过勾股定理求出总梯度值,再除以幅值得到,分别赋值给uni_xuni_yuni_z三个数组变量。
最后,通过计算每个像素单元在x、y、z三个方向上的光源强度,将其加权后并将取值范围限制在0-255之间,赋值给变量a2,并用clip()函数将其限制在0-255的范围内。
最后,利用PIL库中的Image类将a2数组变量以uint8格式存储,并将其保存为一张名为“手绘小窝海绵宝宝.png”的PNG图像。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

STL简介与类模板,函数模板的联系,迭代器的引入与初步简单认识

什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的版本 原始版本:Alexander Stepanov、Meng Lee 在惠普实验室完成的原…

关于宝塔部署jar包和war包

文章目录 前言一、jar包部署二、war包部署1.maven如果打包不了使用命令打包2.安装Tomcat进行访问是否成功2.进入Tomcat目录进行配置war包 一、项目访问方法 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、jar包部署 1.其实jar包没什么讲的&…

开源云原生数仓引擎ByConity 存储计算分离架构和优势

供稿 | ByConity技术团队 出品 | CSDN 云计算 ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是采用存储计算分离的架构,实现了读写分离和弹性扩缩容。这种架构确保读操作和写操作不会相互影响,使得计算资源和存储资源解耦,…

SpringBoot 结合 MyBatis-plus 进行逻辑删除

一 、逻辑删除的概念 逻辑删除不会在数据库中删除数据,只是通过一个字段用来标识被删除的记录,数据仍然保存在数据库中。在实际的工作当中,因为数据非常重要,为了防止因用户误操作删除数据后无法恢复的问题,我们通常不…

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes Kubernetes 是目前最流行的容器编排平台之一,提供了一种灵活的方式来管理容器化应用程序。Spring Cloud Kubernetes 是一个基于 Spring Cloud 的项目,它提供了一种简单的方式来将…

探索可视化大屏:引领信息时代的视觉革命

可视化大屏是一种利用先进的数据可视化技术和交互技术,将大量的数据和信息以直观、易于理解的方式展示在大屏幕上的解决方案。可视化大屏通常由高分辨率的显示屏、强大的计算和处理设备以及专业的可视化软件组成,它通过图表、图形、动画等可视化元素&…

day08 Spring MVC

spring MVC相当于Servlet mvc解释:模型,视图,控制器 **使用该思想的作用:**减少耦合性,提高可维护性 Spring MVC前端控制器 方式1 1.在web.xml中配置前端控制器方式2 ​ 要是用前端控制器,必须在web.xml中配置DidpatcherServlet类 <!--前端控制器--> <servlet&g…

面试经验小结

1、为什么C有重载而C语言没有&#xff1f; C的编译过程中&#xff0c;将函数名后面的数据类型也加入到了编译阶段。 2、用异或完成两个数的数值交换。 x^y&#xff1b; y^x&#xff1b; x^y&#xff1b; 3、数组指针与指针数组&#xff1b;函数指针与指针函数 4、segment …

jdk15至17——sealed密封关键字

sealed关键字是从jdk15开始预览&#xff0c;直到jdk17成为正式版&#xff0c;可以对继承父类和实现接口进行更加细粒度的限制&#xff0c;之前的限制也只有final用于禁止继承&#xff0c;默认包权限限制在同一个包内&#xff0c;sealed密封类/接口可以明确指定哪些类可以进行继…

C# 调用Matlab打包的 DLL文件(傻瓜式操作)

1、准备Matlab代码 2. 打包 在matlab命令行窗口输入deploytool,打开MATLAB Complier,选择Library Compiler 在TYPE中选择.NET Assembly;在EXPORTED FUNCTIONS中选择要打包的文件&#xff1b;可以选择为自己打包的文件自定义NameSpace名称&#xff0c;本例中将NameSpace定义为…

Google Earth Engine(GEE):大数据林业应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

AcrelCloud-9500电瓶车充电桩收费平台 在苏州市某拆迁小区的应用

摘 要&#xff1a;全国各地电瓶车充电引发火灾的事故时有发生&#xff0c;对人民群众的生命财产安全造成了很大的威胁&#xff0c;本文介绍的苏州市某拆迁小区&#xff0c;是海虞镇为创建市级消防安全“331”示范社区选定的社区&#xff0c;该社区采用4G通信方式与服务器进行通…

一篇文章带你看懂5G网络(接入网+承载网+核心网)

通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧&#xff1a;手机或者集团客户通过基站…

mysql安装8.**版本

1. 下载MySQL 8.0.22 源码包: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz 2. 解压源码包: tar -zxvf mysql-8.0.22.tar.gz -C /usr/local 3. 创建用于编译的构建目录: …

LDO基本知识

本文引用TI文档 压降 压降电压 VDO 是指为实现正常稳压&#xff0c;输入电压 VIN 必须高出 所需输出电压 VOUT(nom) 的最小压差。 如果 VIN 低于此值&#xff0c;线性稳压器将以压降状态工作&#xff0c;不再调 节所需的输出电压。在这种情况下&#xff0c;输出电压 VOUT(drop…

【Docker】进入docker容器

进入已经在运行的docker容器 1、查看所有在运行的docker容器 docker ps2、进入指定的docker容器 docker attach 容器CONTAINERID docker attach 8ad850b602ff查看log docker logs -f 8ad850b602ff

普通本科机械设计毕业生,如何零基础转行数据分析?

作为本科生转行数据分析还是比较容易的&#xff0c;我们数据分析班里本科生占了一大半&#xff0c;专业也都是非计算机相关的&#xff0c;有机械、机电、会计、金融等专业的应届生&#xff0c;基本对于计算机方面接触都不算多&#xff0c;专业方面肯定都是零基础&#xff0c;会…

【案例教程】R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件&#xff0c;以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛&#xff0c;数据常多样而复杂。利用R语言进行多元统计分析&#xff0c;从复杂的现象中发现规律、探索机制正是R的优势。为此&#xff0c;本课程以鱼类、昆虫、水文、地形等多样…

Scrapy CrawlSpider介绍和使用

一、介绍CrawlSpider CrawlSpider其实是Spider的一个子类&#xff0c;除了继承到Spider的特性和功能外&#xff0c;还派生除了其自己独有的更加强大的特性和功能。其中最显著的功能就是”LinkExtractors链接提取器“。Spider是所有爬虫的基类&#xff0c;其设计原则只是为了爬取…

【Nodejs】Node-js概述

Node.js 文章目录 Node.js一、Node.js概述1.1、介绍1.2、官网1.3、Node.js应用场景1.4、安装Node.js1.5、npm包管理器1.5.1、介绍1.5.2、切换npm源1.5.3、生成JSON配置文件1.5.4、查看当前安装的树形模块1.5.5、安装模块1.5.6、自定义脚本命令1.5.7 、自动重启应用 1.6、模块化…