学号 20192428《Python程序设计》综合实践报告
课程:《Python程序设计》
班级: 1924
姓名: 魏来
学号:20192428
实验教师:王志强
实验日期:2020年6月8日
必修/选修: 公选课
1.实验内容
-Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
-我选择了一个简单的数据分析课题——Numpy库,一个开源的python科学计算基础库。
2. 实验过程及结果
Numpy库我在上学期就有自己的研究,曾经在网空导论课中有一个课题是图片处理,当时进行了简单的图像处理控制。如今我想对Numpy库进行深度的刨析,做出属于自己的滤镜。
我要用到的库有: Numpy库、PIL库、cv2
首先是Numpy库对图片的简单读取。下面这张图是我这次实验的主角——
(某天走在路上的随手一拍天空~)
下面让我们看看Numpy库对图片的数组处理:
如图,Numpy库实际上是把图片当作一个二维数组处理——长、宽,而在每一个单元格中会有三个值,是代表色彩的RGB值。让我们一起看看这个图片的长度和高度。
让我们看看运行结果:
让我们看看对不对呢
可以看到图片属性的长宽都一致
同时还有一种方法可以让我们将图片的RGB值读出来——CSV文件:是一种常用的文件格式,可以用来批量的保存数据。下面代码片段是写入一个csv文件
利用降维函数,我对“Aim”进行降维并将其储存为变量“test1”,并将其储存为csv文件格式,命名Aim.csv。
让我们用vscode打开一个文件一起来看看吧:
同时让我们看一下这个图片转化的数组的属性:
以及运行结果
Topic Ⅰ:翻转图片
代码片段:
对图片翻转的操作非常简单,将二维数组的横轴和竖轴对换即可。所以如图我利用for循环对图片横轴(Size[0])遍历,同时建立一个Aim11的数组(因为之前探究属性时知道type为uint8),将Aim11作为新图片的容器,最后使用save函数保存Aim11的副本。下面为我得到的副本:
至此第一个小课题正式成功。
Topic Ⅱ:颜色翻转
代码片段
这可以说是最简单的一个课题了,只需要一个满RGB值[255,255,255]减去之前的数组,使数组中的每个RGB值取255的补数,就能够得到负片的效果,让我们一起看看这个处理过后的图片吧:
Topic Ⅲ:赛博朋克风格滤镜~
代码片段
通过cv2库和Numpy库的运用可以设计一份专属于你的滤镜,可以先来看看我的滤镜最终的效果。
显然做的不是很好。。。但对图片过暗和过亮地方的处理的确处理的很得当:
light_gamma_high = np.power(image_lab[:, :, 0], 0.8)
light_gamma_high = np.asarray(light_gamma_high / np.max(light_gamma_high) * 255, np.uint8)
light_gamma_low = np.power(image_lab[:, :, 0], 1.2)
light_gamma_low = np.asarray(light_gamma_low / np.max(light_gamma_low) * 255, np.uint8)
即上段代码
- 实验过程中遇到的问题和解决过程
Numpy库的学习是我最大的问题,但幸亏与Mooc上的老师们,我成功学会了这个库,下面是我的学习过程笔记照片:
我遇见的问题也很多,更多的是编程时的小错误,我举一个小例子:
在实验中topic Ⅰ中for循环的错误,导致图片处理进行了一个死循环,当程序结束后得到的成果。
这个则为做赛博朋克时的模板,使用了cv2的模板进行滤镜的编辑,但我在最后输出滤镜成品时忽略了数组命名,导致输出白忙活一场——输出了模板。而我自己却甚至一度以为这个模板即为我编辑的滤镜效果。
其他(感悟、思考等)
对全课进行总结,并写课程感想体会、意见和建议等
Python是我进入大学以来第一个感兴趣的事物,从第一周进入大学接触到它我就开始研究,我对python的笔记甚至多于我大学其他科目所有笔记加起来的总和。所以对我来所这是一门得心应手的语言,因此我选择了这门课程为我的第一次选修课的内容。
但进入班级以后王老师细心教导下,我发现了之前自己的编程习惯非常繁琐复杂,而且在自学的时候养成了很多坏习惯,一些简便编程写法也不习惯。我明白了python虽然相比C、C++亦或是其他语言来说相对智能,可以不用太追求精准,但对于语言的效率,很大程度是取决于你的编程效率。
Python学习中,我最好的三个老师就是王志强老师、MOOC中的松老师还有实验楼。三位老师帮助我完成了很多艰巨的学习挑战,在我的学习之路中提供了信心和思路。
感谢志强老师的帮助,感谢这门选修课,将来我会Python的道路上继续坚定的走下去。
再次感谢王志强老师!
以下是我的代码全文:
"20192428 魏来 Python期末作业"
#启动第三方库
from PIL import Image
import numpy as np
#准备工作
Aim = np.array(Image.open("D:/Deskdop/topic/aim.jpg"))
Size = Aim.shape #展示图片的size
print("图像高度{}宽度{}".format(Size[0],Size[1]))
#写入CSV文件
test = Aim.flatten()
np.savetxt("aimcsv.csv",test,fmt="%d",delimiter=" ")
#查看图片数组属性 20192428魏来
print(Aim.shape,Aim.dtype)
print(Aim)
#操作一:对图片进行翻转 20192428魏来
LoopNum1 = 0
LoopNum2 = 0
Aim11 = Aim
for i in range(Size[0]):
Aim11[LoopNum1,LoopNum2] = Aim[Size[0] - 1 - LoopNum1,LoopNum2]
LoopNum1 = LoopNum1 + 1
Aim11 = Image.fromarray(Aim11.astype("uint8"))
Aim11.save("D:/Deskdop/topic/Aim11.jpg")
#操作二:对图片进行颜色翻转 20192428
Aim12 = [255,255,255] - Aim
Aim12 = Image.fromarray(Aim12.astype("uint8"))
Aim12.save("D:/Deskdop/topic/Aim12.jpg")
#操作三:赛博朋克滤镜制作 20192428
import cv2
image_hls = cv2.cvtColor(Aim, cv2.COLOR_BGR2HLS)
image_hls = np.asarray(image_hls, np.float32)
hue = image_hls[:, :, 0]
hue[hue < 90] = 180 - hue[hue < 90]
image_hls[:, :, 0] = hue
image_hls = np.asarray(image_hls, np.uint8)
image = cv2.cvtColor(image_hls, cv2.COLOR_HLS2BGR)
image_lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
image_lab = np.asarray(image_lab, np.float32)
light_gamma_high = np.power(image_lab[:, :, 0], 0.8)
light_gamma_high = np.asarray(light_gamma_high / np.max(light_gamma_high) * 255, np.uint8)
light_gamma_low = np.power(image_lab[:, :, 0], 1.2)
light_gamma_low = np.asarray(light_gamma_low / np.max(light_gamma_low) * 255, np.uint8)
# 调色至偏紫
dark_b = image_lab[:, :, 2] * (light_gamma_low / 255) * 0.1
dark_a = image_lab[:, :, 2] * (1 - light_gamma_high / 255) * 0.3
image_lab[:, :, 2] = np.clip(image_lab[:, :, 2] - dark_b, 0, 255)
image_lab[:, :, 2] = np.clip(image_lab[:, :, 2] - dark_a, 0, 255)
image_lab = np.asarray(image_lab, np.uint8)
Aim13 = cv2.cvtColor(image_lab, cv2.COLOR_Lab2BGR)
Aim13 = Image.fromarray(Aim13.astype("uint8"))
Aim13.save("D:/Deskdop/topic/Aim13.jpg")