2024年C C++最全【21天python打卡】第20天 python经典案例(6)_a2=a2,被面试官问的C C++问题难倒了

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

其中,需要用到的方法:

  • 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】:指定生成数组的最小维度

代码如下

from PIL import Image
import numpy as np
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
depth = 10. # (0-100)
im = Image.open('fcity.jpg').convert('L')
a = np.asarray(im).astype('float')
grad = np.gradient(a) #取图像灰度的梯度值
grad_x, grad_y = grad #分别取横纵图像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
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.)
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('fcityHandDraw.jpg')

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

实验结果

运行程序后

拓展程序

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

代码如下
from PIL import Image
import numpy as np
try:
    vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
    vec_az = np.pi/4. # 光源的方位角度,弧度值
    depth = 10. # (0-100)
    im = Image.open('fcity.jpg').convert('L')
    a = np.asarray(im).astype('float')
    grad = np.gradient(a) #取图像灰度的梯度值
    grad_x, grad_y = grad #分别取横纵图像梯度值
    grad_x = grad_x*depth/100.
    grad_y = grad_y*depth/100.
    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.)
    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('fcityHandDraw.jpg')
    print("输出图像手绘成功")
except:
print("文件名错误")

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

我们来运行一下吧。

实验结果

实验前:

实验后

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

第三方库批量安装程序

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

代码实现

import os
libs = {"numpy","matplotlib","pillow","sklearn","requests",\
        "jieba","beautifulsoup4","wheel","networkx","sympy",\
        "pyinstaller","django","flask","werobot","pyqt5",\
        "pandas","pyopengl","pypdf2","docopt","pygame"}
try:
    for lib in libs:
        os.system("pip install "+lib)
    print("Successful")        
except:
    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中元素随机排列,返回打乱后的序列

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

[外链图片转存中…(img-0dAvJavp-1715532090424)]
[外链图片转存中…(img-z1W08vT8-1715532090425)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值