• 【21天python打卡】第20天 python经典案例(6)


    ​大家好,今天是21天python打卡的第20天。今天我们重点通过案例图像的手绘效果,学习python中numpy库的相关知识,通过自己所学的知识进行拓展,使用try语句实现对异常结果的处理,其次,我们分享了如何批量安装python的第三方库文件,最后,我们通过案例体育竞技分析,学习了random的相关知识,相信大家每天学习一点知识,总有一天会变得越来越厉害。

     


    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。


    目录

    图像的手绘效果

    概念与原理

    核心原理:

    图像的数组形式与变换

    实现思路步骤:

    1、梯度的重构

    2、构造guan光源效果

    3、梯度归一化

    4、图像生成

    实验相关库

    【numpy库介绍】

    【numpy库安装】

    【numpy库基本使用】

    代码如下

    实验结果

    拓展程序

    代码如下

    实验结果

     第三方库批量安装程序

    代码实现

    体育竞技分析

    一.random简介

    二、各函数使用方法

    代码实现

    实验结果


    图像的手绘效果

    概念与原理

    我们都知道手绘图效果的特征主要有:

    • 黑白灰色

    • 边界线条较重

    • 相同或相近色彩趋于白色

    • 略有光源效果

    核心原理:

    利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的模拟程度。

    把图像看成二维离散函数,灰度梯度其实就是这个二维离散函数的求导,用差分代替微分,求取图像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。

    以Sobel 梯度计算来解释:

    梯度方向及图像灰度增大的方向,其中梯度方向的梯度夹角大于平坦区域的梯度夹角。如下图所示,灰度值增加的方向梯度夹角大,此时梯度夹角大的方向为梯度方向。对应在图像中寻找某一点的梯度方向即通过计算该点与其8邻域点的梯度角,梯度角最大即为梯度方向。

    图像的数组形式与变换

    其中,需要用到的方法:

    • Image.open( ): 打开图片

    • np.array( ) : 将图像转化为数组

    • convert("L"): 将图片转换成二维灰度图片

    • Image.fromarray( ): 将数组还原成图像uint8格式

    实现思路步骤:

    1、梯度的重构

    numpy的梯度函数np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度。

    离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2,而c的梯度是: (c-b)/1。

    当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。

    代码如下:

    grad=np.gradient(a)
    grad_x,grad_y=grad
    grad_x = grad_x * depth / 100.#对grad_x值进行归一化
    grad_y = grad_y * depth / 100.#对grad_y值进行归一化

    2、构造guan光源效果

    设计一个位于图像斜上方的虚拟光源,光源相对于图像的视角为Elevation,方位角为Azimuth,建立光源对各点梯度值的影响函数,运算出各点的新像素值:

    其中:

    np.cos(evc.el) : 单位光线在地平面上的投射长度。

    dx、dy、dz :光源对xyz三方向的影响程度。

    3、梯度归一化

    • 构造x和y轴梯度的三维归一化单位坐标系;

    • 梯度与光源相互作用,将梯度转化为灰度。

    4、图像生成

    im2 = Image.fromarray(a2.astype('uint8')) #重构图像
    im2.save('fcityHandDraw.jpg')

    实验相关库

    numpy库介绍

    numpy的全称是Numerical Python,是Python的一个扩展程序库,它不仅针对数组运算提供了大量的函数库,而且它还能够支持维度数组与矩阵运算。重要的是,numpy内部解除了CPython中的全局解释器锁(GIL),运行效率非常好,是处理大量数组类结构和机器学习框架的基础库!

    numpy库安装】

    一般使用pip install numpy进行安装,对于进行机器学习和大数据分析的小朋友,强烈推荐安装Anaconda,其中含有大量的机器学习和数据相关的Python模块,安装成功后即可使用了,不用浪费时间了。

    安装成功后,我们在Python编译器中进行测试,使用import numpy,如果不报错,说明我们的numpy安装无误了。

    【numpy库基本使用】

    Numpy中定义的最重要使用最频繁的对象就是ndarray的N维数组类型。

    它描述相同类型(dtype)的元素集合,可以使用基于零的索引访问集合中的项目,它的类似Python中的列表索引。我们学习numpy库,首先得学习ndarray对象。

    ndarray的创建方式如下:

    numpy.array(object, dtype =None, copy =True, order =None, subok =False, ndmin =0)

    各参数解释如下:

    【object】:数组或嵌套的数列

    【dtype】:数组元素的数据类型,可选

    【copy 】:对象能否复制,可选

    【order】:创建数组的样式,C为行方向,F为列方向,A为任意方向,默认为A

    【subok】:默认返回一个与基类类型一致的数组

    【ndmin】:指定生成数组的最小维度

    代码如下

    1. from PIL import Image
    2. import numpy as np
    3. vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
    4. vec_az = np.pi/4. # 光源的方位角度,弧度值
    5. depth = 10. # (0-100)
    6. im = Image.open('fcity.jpg').convert('L')
    7. a = np.asarray(im).astype('float')
    8. grad = np.gradient(a) #取图像灰度的梯度值
    9. grad_x, grad_y = grad #分别取横纵图像梯度值
    10. grad_x = grad_x*depth/100.
    11. grad_y = grad_y*depth/100.
    12. dx = np.cos(vec_el)np.cos(vec_az) #光源对x 轴的影响
    13. dy = np.cos(vec_el)np.sin(vec_az) #光源对y 轴的影响
    14. dz = np.sin(vec_el) #光源对z 轴的影响
    15. A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
    16. uni_x = grad_x/A
    17. uni_y = grad_y/A
    18. uni_z = 1./A
    19. a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
    20. a2 = a2.clip(0,255)
    21. im2 = Image.fromarray(a2.astype('uint8')) #重构图像
    22. im2.save('fcityHandDraw.jpg')

     我们导入一个图片试试看什么效果。

    实验结果

    运行程序后

     

    拓展程序

    我们可以运用我们之前学习的异常处理方法加入到现有的程序。

    代码如下

    1. from PIL import Image
    2. import numpy as np
    3. try:
    4. vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
    5. vec_az = np.pi/4. # 光源的方位角度,弧度值
    6. depth = 10. # (0-100)
    7. im = Image.open('fcity.jpg').convert('L')
    8. a = np.asarray(im).astype('float')
    9. grad = np.gradient(a) #取图像灰度的梯度值
    10. grad_x, grad_y = grad #分别取横纵图像梯度值
    11. grad_x = grad_x*depth/100.
    12. grad_y = grad_y*depth/100.
    13. dx = np.cos(vec_el)np.cos(vec_az) #光源对x 轴的影响
    14. dy = np.cos(vec_el)np.sin(vec_az) #光源对y 轴的影响
    15. dz = np.sin(vec_el) #光源对z 轴的影响
    16. A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
    17. uni_x = grad_x/A
    18. uni_y = grad_y/A
    19. uni_z = 1./A
    20. a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
    21. a2 = a2.clip(0,255)
    22. im2 = Image.fromarray(a2.astype('uint8')) #重构图像
    23. im2.save('fcityHandDraw.jpg')
    24. print("输出图像手绘成功")
    25. except:
    26. print("文件名错误")

    这样就把我们之前学到的异常处理的例子学以致用了。

    我们来运行一下吧。

    实验结果

    实验前:

     实验后

     

     我们看到我们这个程序对文件名用严格的要求,如果文件名有误,程序就无法运行,就会报错。我们接下来用错误的文件名试一下,看看会输出什么。

     第三方库批量安装程序

    大家经常在运行python文件时,经常报错,缺少第三方库文件,我们一个一个安装十分麻烦,我们就编写了一个可以批量安装第三方库文件的程序。大家也可以在如下程序中libs中添加自己想要的库文件。

    代码实现

    1. import os
    2. libs = {"numpy","matplotlib","pillow","sklearn","requests",\
    3. "jieba","beautifulsoup4","wheel","networkx","sympy",\
    4. "pyinstaller","django","flask","werobot","pyqt5",\
    5. "pandas","pyopengl","pypdf2","docopt","pygame"}
    6. try:
    7. for lib in libs:
    8. os.system("pip install "+lib)
    9. print("Successful")
    10. except:
    11. print("Failed Somehow")

    体育竞技分析

    一.random简介

    random库是用于产生并运用随机数的标准库。Python中的主要使用是让其掌握在程序中运用随机数的能力。

    random常见随机函数有9个:seed()、random()、randint()、getrandbits()、randrange()、uniform()、choice()、shuffle()、sample().

    二、各函数使用方法

    • random.seed(a)作用:设置初始化随机数种子a

    参数:

    a:随机数种子,可以是整数或浮点数

    用random库产生随机数不一定要设置随机数种子,如果不设置,则random库默认以系统时间产生当作随机数种子。设置种子的好处是可以重复再现相同的随机数序列

    作用:设置初始化随机数种子a

    • random.random()作用:生成一个[0.0,1.0)之间的随机小数参数:无
    • random.randint(a,b)作用:生成一个[a,b]之间的随机整数

    参数:

    a:随机区间的开始值,整数

    b:随机区间的结束值,随机数包含结束值整数

    • random.getrandbits(k)作用:生成一个k比特长度的随机整数

    参数:

    k:长度的整数值

    • random.randrange(start,stop[,step])作用:生成一个[start,stop)之间以step为步数的随机整数参数:start:随机区间的开始值,整数stop:随机区间的结束值,随机数包含结束值,整数step:随机区间的步长值,整数。步长值可选,如果不设定步长,默认步长为1
    • random.uniform(a,b)作用:生成一个[a,b]之间的随机小数

    参数:

    a:随机区间的开始值,整数或浮点数

    b:随机区间的结束值,随机数包含结束值,整数或浮点数

    • random.choice(seq)作用:从序列类型(例如列表)seq中随机返回一个元素

    参数:

    seq:序列类型,例如列表类型

    • random.shuffle(seq)作用:从序列类型seq中元素随机排列,返回打乱后的序列

    参数:

    seq:序列类型,例如列表类型

    调用该函数后,序列类型变量seq将被改变

    • random.sample(pop,k)作用:从pop类型中随机选取k个元素,以列表类型返回。

    参数:

    pop:序列类型,例如列表类型

    k:选取的个数,整数

    代码实现

    1. from random import random
    2. def printIntro():
    3. print("这个程序模拟两个选手A和B的某种竞技比赛")
    4. print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
    5. def getInputs():
    6. a = eval(input("请输入选手A的能力值(0-1): "))
    7. b = eval(input("请输入选手B的能力值(0-1): "))
    8. n = eval(input("模拟比赛的场次: "))
    9. return a, b, n
    10. def simNGames(n, probA, probB):
    11. winsA, winsB = 0, 0
    12. for i in range(n):
    13. scoreA, scoreB = simOneGame(probA, probB)
    14. if scoreA > scoreB:
    15. winsA += 1
    16. else:
    17. winsB += 1
    18. return winsA, winsB
    19. def gameOver(a,b):
    20. return a==15 or b==15
    21. def simOneGame(probA, probB):
    22. scoreA, scoreB = 0, 0
    23. serving = "A"
    24. while not gameOver(scoreA, scoreB):
    25. if serving == "A":
    26. if random() < probA:
    27. scoreA += 1
    28. else:
    29. serving="B"
    30. else:
    31. if random() < probB:
    32. scoreB += 1
    33. else:
    34. serving="A"
    35. return scoreA, scoreB
    36. def printSummary(winsA, winsB):
    37. n = winsA + winsB
    38. print("竞技分析开始,共模拟{}场比赛".format(n))
    39. print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    40. print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
    41. def main():
    42. printIntro()
    43. probA, probB, n = getInputs()
    44. winsA, winsB = simNGames(n, probA, probB)
    45. printSummary(winsA, winsB)
    46. main()

    实验结果


    今天就讲到这里,下一篇我们继续分享python的案例。

  • 相关阅读:
    【3D物体检测】VoxelNet论文和代码解析
    jupyter lab常用插件集合
    民安智库开展城市管理考核工作第三方测评
    记一次.net加密神器 Eazfuscator.NET 2023.2 最新版 使用尝试
    (PKCS1) RSA 公私钥 pem 文件解析
    Tomcat 源码解析一请求处理的整体过程-黄泉天怒(下)
    兄弟机床联网
    strings包详细文档+示例
    全链路自研:腾讯混元大模型释放企业全新可能性
    (数据科学学习手札152)geopandas 0.13版本更新内容一览
  • 原文地址:https://blog.csdn.net/BROKEN__Y/article/details/126422352