文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2af2e2d7d906d32f5b7c3a921e420b7d.png)
第四周学习任务
- 1. 函数的定义及调用,自己设计完成一个小demo
- 2. Os,shutil库的学习及excel写任务
主要内容 os.path.join os.path.exists os.listdir os.mkdir shutil.copy等
具体任务 判断指定目录dir1(自己指定,非py文件的当前目录)是否存在,若不存在创建该目录,将已存在的另一目录dir2 中的若干张图片复制到dir1中,并将文件名写入一excel中,并保存。 - 3. Matplotlib,opencv初探
主要任务,在任务一的基础上,①使用matplotlib从dir2中读入每张图片,并用show函数可视化出来②用opencv从dir2中用不同的形式【灰度图,彩图】读入每张图片,并save到另一指定路径
注意:
- 可增加难度,图片格式采用jpg和png混合的方式,处理不同类型数据。
- 学有余力,学习opencv一些常用的处理图片的方法。
注意保存积累代码,讲解代码及实现过程。
2020.7.29 周三中午更新
(一)Os库的学习
os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含移动 复制 打包 压缩 解压等操作,这些os模块都没有提供。
主要内容:os.path.join os.path.exists os.listdir os.mkdir
一开始想要利用pip指令安装这个库,但是总是提示错误
后来度娘之后发现Os是内置库,我大概学的是个假Python…
由于在JupyterNotebook上面得到的路径都些许的奇怪
明明应该给我的结果是这种格式
所以这部分代码我都在PyCharm里面运行了
python os库的使用方法_CSDN
1、路径操作
os.path子库以path为入口,用于操作和处理文件路径
函数 | 描述 |
---|---|
os.path.abspath(path) | 返回path在当前系统中的绝对路径os.path.abspath('第四周学习记录.txt') 输出:'E:\20年暑假学习\第四周\PyCharm\第四周学习记录.txt’ 关于这个语句有一些疑问 但其实’第四周学习记录.txt’的路径是E:\Amusement\Python\第四周学习记录.txt, 这个函数 os.path.abspath(path) 返回的路径是我创建的Pycharm程序的路径(因为我是用这个路径下的Pycharm运行的这段代码),但是这个路径下并没有’第四周学习记录.txt’这个文件 |
os.path.normpath(path) | 归一化path的表示形式,统一用\分割路径os.path.normpath(r'E:\Amusement\Python\第四周学习记录.txt') 输出:'E:\Amusement\Python\第四周学习记录.txt’ os.path.normpath('E://Amusement//Python//第四周学习记录.txt') 输出:‘E:\Amusement\Python\第四周学习记录.txt’ |
os.path.relpath(path) | 返回当前程序与文件之间的相对路径(relative path)os.path.relpath(r'E:\Amusement\Python\第四周学习记录.txt') 输出:’…\Amusement\Python\第四周学习记录.txt’ |
os.path.dirname(path) | 返回path中的目录名称os.path.dirname(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘E:\Amusement\Python’ |
os.path.basename(path) | 返回path中最后的文件名称,如果最后一级也是目录,则返回目录名称os.path.basename(r'E:\Amusement\Python\第四周学习记录.txt') 输出:'第四周学习记录.txt’ os.path.basename(r'E:\Amusement\Python') 输出:‘Python’ |
os.path.split(path) | 返回path中目录和文件名称,如果path最后一集也是目录,则都返回目录名称如果path只有根路径,返回根路径和空路径os.path.split(r'E:\Amusement\Python\第四周学习记录.txt') 输出:’(‘E:\Amusement\Python’, ‘第四周学习记录.txt’)‘ os.path.split(r'E:\Amusement\Python') 输出:’(‘E:\Amusement’, ‘Python’)‘ os.path.split(r'E:') 输出:’(‘E:’, ‘’)’ |
os.path.join(path, *paths) | 组合path和paths,返回一个路径字符串os.path.join(r'E:', r'\Amusement\Python\第四周学习记录.txt') 输出:‘E:\Amusement\Python\第四周学习记录.txt’ |
os.path.exists(path) | 判断path对应文件或目录是否存在,返回True或Falseos.path.exists('第四周学习记录.txt') # 不在此程序的目录下 输出:'False’os.path.exists('Test.txt') # 在此程序的目录下 输出:‘True’ |
os.path.isfile(path) | 判断path所对应是否为已存在的文件,返回True或Falseos.path.isfile(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘True’ |
os.path.isdir(path) | 判断path所对应是否为已存在的目录,返回True或Falseos.path.isdir(r'E:\Amusement\Python') 输出:‘True’ |
os.path.getmtime(path) | 返回path对应文件或目录最近一次的修改时间os.path.getmtime(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘1596015422.8338652’ |
os.path.getatime(path) | 返回path对应文件或目录上一次的访问时间os.path.getatime(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘1596015422.8338652’ |
os.path.getctime(path) | 返回path对应文件或目录创建时间。windows系统中,上一次访问时间等于创建时间os.path.getctime(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘1596012914.8609786’ |
os.path.getsize(path) | 返回path对应文件的大小,以字节为单位os.path.getsize(r'E:\Amusement\Python\第四周学习记录.txt') 输出:‘96’ |
PyCharm中可执行代码如下
import os
# 返回path在当前系统中的绝对路径
# 但其实'第四周学习记录.txt'的路径是E:\Amusement\Python\第四周学习记录.txt,
# 这个函数返回的路径是我创建的Pycharm程序的路径
# (因为我是用这个路径下的Pycharm运行的这段代码),
# 但是这个路径下并没有'第四周学习记录.txt'这个文件
print(os.path.abspath('第四周学习任务.docx'))
print(os.path.abspath('第四周学习记录.txt'))
# 归一化path的表示形式,统一用\分割路径
print(os.path.normpath(r'E:\530实验室\政源学长\20年暑假学习\第四周\PyCharm\第四周学习任务.docx'))
print(os.path.normpath('E://530实验室//政源学长//20年暑假学习//第四周//PyCharm//第四周学习任务.docx'))
print(os.path.normpath(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.normpath('E://Amusement//Python//第四周学习记录.txt'))
# 返回当前程序与文件之间的相对路径(relative path)
print(os.path.relpath(r'E:\Amusement\Python\第四周学习记录.txt'))
# 返回path中的目录名称
print(os.path.dirname(r'E:\Amusement\Python\第四周学习记录.txt'))
# 返回path中最后的文件名称,如果最后一级也是目录,则返回目录名称
print(os.path.basename(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.basename(r'E:\Amusement\Python'))
# 返回path中目录和文件名称,如果path最后一集也是目录,
# 则都返回目录名称如果path只有根路径,返回根路径和空路径
print(os.path.split(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.split(r'E:\Amusement\Python'))
print(os.path.split(r'E:'))
# 组合path和paths,返回一个路径字符串
print(os.path.join(r'E:', r'\Amusement\Python\第四周学习记录.txt'))
# 判断path对应文件或目录是否存在,返回True或False
print(os.path.exists('第四周学习记录.txt')) # 不在此程序的目录下
print(os.path.exists('Test.txt')) # 在此程序的目录下
# 判断path所对应是否为已存在的文件,返回True或False
print(os.path.isfile(r'E:\Amusement\Python\第四周学习记录.txt'))
print(os.path.isfile(r'E:\Amusement\Python')) # 这里的路径是文件夹的路径,函数的结构为False
# 判断path所对应是否为已存在的目录,返回True或False
print(os.path.isdir(r'E:\Amusement\Python'))
# 返回path对应文件或目录最近一次的修改时间
print(os.path.getmtime(r'E:\Amusement\Python\第四周学习记录.txt')) # 1596015422.8338652
# 返回path对应文件或目录上一次的访问时间
print(os.path.getatime(r'E:\Amusement\Python\第四周学习记录.txt')) # 1596015422.8338652
# 返回path对应文件或目录创建时间。windows系统中,上一次访问时间等于创建时间
print(os.path.getctime(r'E:\Amusement\Python\第四周学习记录.txt')) # 1596012914.8609786
# 返回path对应文件的大小,以字节为单位
print(os.path.getsize(r'E:\Amusement\Python\第四周学习记录.txt')) # 96
2、进程管理
os.system(command)
- 执行程序或命令command
- 在windows系统中,返回值为cmd的调用返回信息
如下例,调用计算器返回值为0
import os
os.system(r'C:\Windows\system32\calc.exe') # 打开计算器 返回值为0
调用网易云音乐,成功打开但是出现了很多错误提示
import os
os.system(r'D:\ProgramFiles\CloudMusic\cloudmusic.exe')
- 部分错误提示:
- 调用Arctime Pro但是失败了
import os
os.system(r'D:\ProgramFiles\ARCTIME_PRO_2.4_WIN64\Arctime Pro.exe')
3、环境参数
3.1 os.mkdir()
概述
os.mkdir() 方法用于以数字权限模式创建目录。默认的模式为 0777 (八进制)。
数字权限管理(Digital Rights Management)是保护多媒体内容免受未经授权的播放和复制的一种方法。
语法
os.mkdir(path[, mode])
参数
- path – 要创建的目录
- mode – 要为目录设置的权限数字模式
返回值
没有返回值
实例
import os, sys
path = "E:\Amusement\TestMkdir"
os.mkdir(path, 0o755);
3.2 os.listdir()
概述
返回指定的文件夹包含的文件或文件夹的名字的列表
语法
os.listdir(path)
参数
- path – 需要列出的目录路径
返回值
返回指定路径下的文件和文件夹列表
实例
# 返回path目录下所有文件 以列表形式输出
import os
print(os.listdir(r'E:\Amusement'))
# 一个为一行输出
import os
# 打开文件
path = "E:\Amusement"
dirs = os.listdir(path)
# 输出所有的文件和文件夹
for file in dirs:
print(file)
(二)shutil库的学习
76_shutil模块_Python语法基础和常用模块使用_千锋教程_B站
python之模块之shutil模块_cnblogs
shutil-- --High-level file operations 高级的文件操作模块。
os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作。比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含移动 复制 打包 压缩 解压等操作,这些os模块都没有提供。
shutil则就是对os中文件操作的补充。–移动 复制 打包 压缩 解压,
1、shutil.copyfile(src,dst)
拷贝文件
import shutil
# shutil.copyfile('./Test.txt', './dstInPC')
# shutil.copyfile('./Test.txt', '../dstInProj')
# shutil.copyfile('./Os库学习.py', './Os库学习Copy')
shutil.copyfile('../第四周学习任务.docx', './FileCopy任务')
import shutil
shutil.copyfile('../JupyterNotebook/Os库学习.ipynb', './JN_Os库学习.ipynb')
路径也可以是非py文件的当前目录
import shutil
shutil.copyfile(r'E:\Amusement\count.txt', r'E:\Competition\countCopy.txt')
2、shutil.copy2(src,dst)
复制文件的内容以及文件的所有状态信息,如权限等
import shutil
shutil.copy2(r'D:\3D66\使用说明.txt', 'E:\使用说明.txt')
3、shutil.copytree(src,dst,symlinks,ignore=None)
递归的拷贝文件
import shutil
shutil.copytree(r'E:\电子书', r'E:\报名表\Copy')
拷贝文件夹中的每一个文件
忽略掉.png格式的照片,代码如下
shutil.copytree(r'F:\照片\壁纸',
r'E:\530实验室\照片',
ignore=shutil.ignore_patterns('*.png'))
4、shutil.rmtree(path)
删除
shutil.rmtree(r'E:\530实验室\dir1') # 结尾要是一个明确的文件名
5、shutil.move(src, dst)
剪切
shutil.move(r'E:\530实验室\dir1', r'E:\530实验室\dircopy') # 删除源文件,生成新文件
6、shutil.make_archive()
压缩
shutil.make_archive('压缩包', # 压缩后文件名
'gztar', # 指定的压缩格式
r'E:\530实验室\dircopy') # 被压缩的文件夹名字
支持的压缩格式
print(shutil.get_archive_formats()) # 返回支持的压缩包格式
7、shutil.unpack_archive()
解压
# 解压的文件名 解压到哪个路径下 压缩的格式
shutil.unpack_archive('./压缩包.tar.gz', r'E:\530实验室\Packege', 'gztar')
(三)Os,shutil库及excel的综合小练习
判断指定目录dir1(自己指定,非py文件的当前目录)是否存在,若不存在创建该目录,将已存在的另一目录dir2 中的若干张图片复制到dir1中,并将文件名写入一excel中,并保存
import shutil, os, openpyxl
# 判定指定目录dir1是否存在
print(os.path.exists(r'E:\Amusement\dir1_1'))
print(os.path.exists(r'E:\Amusement\dir1_2'))
# 第一种方法
# if not os.path.isdir(r'E:\Amusement\dir1_2'):
# os.mkdir(r'E:\Amusement\dir1_2', 0o775)
os.mkdir(r'E:\Amusement\dir1_1', 0o775) # 若不存在,用os.mkdir()创建
# 将dir2中的文件复制到dir1中,一个一个复制
shutil.copy2(r'E:\530实验室\政源学长\Python\dir2\宫崎骏.jpg', r'E:\Amusement\dir1_1\宫崎骏copy.jpg')
shutil.copy2(r'E:\530实验室\政源学长\Python\dir2\han3.png', r'E:\Amusement\dir1_1\han3copy.png')
# ...所有照片同理
# 第二种方法
# dir1_2不存在,创建dir1_2,将dir2中的内容复制到dir1_2
shutil.copytree(r'E:\530实验室\政源学长\Python\dir2', r'E:\Amusement\dir1_2')
# dir1中只保存.jpg格式的照片
shutil.copytree(r'F:\照片\壁纸',
r'E:\530实验室\dir1',
ignore=shutil.ignore_patterns('*.png'))
wb = openpyxl.Workbook() # 创建工作簿
ws = wb.create_sheet('PictureNames') # 创建表单
dirs = os.listdir(r'E:\Amusement\dir1_2') # 将dir1_2中的文件名以list保存至
ws.append(dirs) # 将dirs列表中的内容输入ws表单
wb.save('PictureNames.xlsx')
创建的Excel表格
dir2源文件
dir1_1文件
dir1_2文件
dir1文件,无.png格式的照片
2020.7.29 星期三 下午更新
(四)Matplotlib学习
1、安装
-
Win+R输入cmd进入到CMD窗口下,执行python -m pip install -U pip setuptools进行升级
-
输入python -m pip install matplotlib进行自动的安装,系统会自动下载安装包
-
注意安装环境噢,由于我的项目环境名为tensorflow37,所以我需要先激活这个环境再进行安装才能将matplotlib成功安装到我当前所需要的环境中,直接在默认环境中安装不会直接将matplotlib直接导入tensorflow37这个我在用的环境
2、matplotlib画廊
3、plot()绘制简单的折线图
# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25] # 创建列表
plt.plot(squares) # plot()函数尝试根据这些数字绘制有意义的图形
plt.show() # plt.show()打开matplotlib查看器,显示绘制的图形
3.1 修改标签文字和线条粗细
# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares, linewidth=5) # linewidth决定线条粗细
# 设置图表标题,并给坐标加上标签
plt.title("Square Numbers", fontsize=24) # 指定标题
plt.xlabel("Value", fontsize=14) # 横轴指定标题
plt.ylabel("Square of Value", fontsize=14) # 纵轴指定标题
# 设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14) # 设置刻度的样式
plt.show()
图标阅读容易得多
3.2 矫正图形
仔细观察我们可以发现上面的图形有错误!4^2=25!这是由于列表默认下标从0开始,而我们的列表数[1, 4, 9, …]是从1开始的数字的平方。
修复问题
当你向plot()提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的x值为1。所以为了改变这种默认行为,我们可以给plot()同时提供输入值和输出值。
# 导入pyplot模块(包含很多用于生成图表的函数),指定别名plt,以免反复输入pyplot
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5] # 提供输入
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
# 设置图表标题,给坐标加上标签
--snip--
3.3 使用scatter()绘制散点图并设置其样式
3.3.1绘制单个点
import matplotlib.pyplot as plt
plt.scatter(2, 4) # 绘制单个点,向scatter()传递x,y轴
plt.show()
3.3.2设置输出样式:添加标题,给轴加上标签,确保所有文本都大到能够看清
import matplotlib.pyplot as plt
plt.scatter(2, 4, s=200) # 设置点的大小
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
plt.tick_params(axis='both', labelsize=14)
plt.show()
3.4 使用scatter()绘制一系列点
向scatter()传递两个分别包含x值和y值的列表
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]
plt.scatter(x_values, y_values, s=100)
# 设置图表标题,并给坐标加上标签
--snip--
3.5 自动计算数据
利用scatter()绘制1000个点
import matplotlib.pyplot as plt
x_values = list(range(1, 10001))
y_values = [x**2 for x in x_values] # 推导式
plt.scatter(x_values, y_values, s=40)
# 设置图表标题,并给坐标加上标签
--snip--
# 设置每个坐标轴的取值范围
plt.axis([0, 1100, 0, 110000])
plt.show()
3.6 删除数据点的轮廓
各个点的颜色默认为蓝色点和黑色轮廓(但是我之前的图像没看到黑色轮廓啊!!),删除数据点的轮廓,可在调用scatter()函数时传递实参edgecolor=‘none’
plt.scatter(x_values, y_values, edgecolor='none', s=40)
2020.7.30 星期四 上午更新
(五)Matplotlib,opencv初探小练习
1、Matplotlib读取图片并可视化出来
# 使用matplotlib从dir2中读入每张图片,并用show函数可视化出来
import matplotlib.image as implt
import matplotlib.pyplot as plt
x = implt.imread(r'E:\Amusement\dir1_2\农田.jpg')
plt.imshow(x)
plt.waitforbuttonpress(0)
2、opencv读入不同形式的图【灰度图,彩图】,save到另一指定路径
import cv2
import numpy as np
# 读取
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8) # 用numpy创建kernel:values=1
# 大小 类型:unsigned integer of 8-bit。values range from 0-255
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200) # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
imgEroded = cv2.erode(imgDialation, kernel, iterations=1) # 变细
# 显示
cv2.imshow("Image", img) # 彩图
cv2.imshow("Gray Image", imgGray) # 灰度图
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.imshow("Canny Image", imgCanny) # 边缘
cv2.imshow("Dialation Image", imgDialation) # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded) # 边缘变细
# 保存
cv2.imwrite(r'E:\Competition\saveImg.jpg', img) # 保存为jpg类型的
cv2.imwrite(r'E:\Competition\saveImg.png', img)
cv2.imwrite(r'E:\Competition\GrayImg.png', imgGray)
cv2.imwrite(r'E:\Competition\BlurImg.png', imgBlur)
cv2.imwrite(r'E:\Competition\CannyImg.png', imgCanny)
cv2.imwrite(r'E:\Competition\DialationImg.png', imgDialation)
cv2.imwrite(r'E:\Competition\ErodedImg.png', imgEroded)
cv2.waitKey(0)
2020.8.1晚上更新
(六)opencv学习
0、安装
pip install opencv-python
安装成功
1、读取照片视频和摄像头——Read Images Videos and Webcams
1.1 cv2.imread 读取照片并显示
import cv2
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片到img
cv2.imshow('Output', img) # 显示照片 ("名字", 要显示的照片)
cv2.waitKey(0) # 0=infinite delay;如果是1则是1milliseconds
1.2 cv2.VideoCapture 读取视频并显示
import cv2
cap = cv2.VideoCapture(r'E:\Pictures\蝙蝠侠.mp4') # 选取视频路径
# we need a while loop to go through each frame one by one
while True: # 使用循环读取
success, img = cap.read() # 将cap的图片一个一个赋值给img
cv2.imshow("Video", img) # img显示出来
if cv2.waitKey(1) & 0xFF == ord('q'): # 当按下q结束循环
break
1.3 cv2.VideoCapture 调用摄像头并显示实时视频
import cv2
cap = cv2.VideoCapture(0) # 写摄像头的ID, 默认为0
cap.set(3, 640) # 长(ID=3)=640
cap.set(4, 480) # 宽(ID=4)=480
cap.set(10, 100) # 改变亮度(ID=10)
# we need a while loop to go through each frame one by one
while True: # 使用循环读取
success, img = cap.read() # 将cap的图片一个一个赋值给img
cv2.imshow("Video", img) # img显示出来
if cv2.waitKey(1) & 0xFF == ord('q'): # 当按下q结束循环
break
2、基础函数——Basic Functions
2.1 cv2.cvtColor-读取灰度图
import cv2
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
# 在opencv中照片是BGR
# cvtColor=converts(转化) image into different color spaces
# BGR to GRAY
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", imgGray)
cv2.waitKey(0)
2.2 cv2.GaussianBlur-blur增加模糊度
import cv2
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
cv2.imshow("Gray Image", imgGray) # 原版:进行对比
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.waitKey(0)
2.3 cv2.Canny:edge detector-边缘探测
import cv2
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200) # 值越大边缘越模糊
cv2.imshow("Gray Image", imgGray) # 原版:进行对比
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.imshow("Canny Image", imgCanny) # 识别边缘
cv2.waitKey(0)
imgCanny = cv2.Canny(img, 100, 100)
imgCanny = cv2.Canny(img, 150, 200) # 值越大边缘越模糊
2.4 dialation(膨胀,扩张):cv2.dilate 增加边缘的厚度(用到numpy)-变厚!
numpy:a library that helps us deal with matrices
install first:
import cv2
import numpy as np
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8) # 用numpy创建kernel:values=1
# 大小 类型:unsigned integer of 8-bit。values range from 0-255
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)
# iterations叠代次数
# 在显示边缘的基础上扩大边缘
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
cv2.imshow("Gray Image", imgGray) # 原版:进行对比
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.imshow("Canny Image", imgCanny) # 边缘
cv2.imshow("Dialation Image", imgDialation) # 边缘膨胀扩大
cv2.waitKey(0)
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1) # 叠代次数为1
imgDialation = cv2.dilate(imgCanny, kernel, iterations=5) # 叠代次数为5
2.5 erosion(降低):cv2.erode-边缘变细!
import cv2
import numpy as np
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8) # 用numpy创建kernel:values=1
# 大小 类型:unsigned integer of 8-bit。values range from 0-255
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200)
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)
imgEroded = cv2.erode(imgDialation, kernel, iterations=1) # 变细
cv2.imshow("Gray Image", imgGray) # 原版:进行对比
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.imshow("Canny Image", imgCanny) # 边缘
cv2.imshow("Dialation Image", imgDialation) # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded) # 边缘变细
cv2.waitKey(0)
3、调整大小和裁剪——RESIZING AND CROPPING
3.0 问题!!
- 相同的代码为什么png不报错,jpg报错?!!
import cv2
import numpy as np
img = cv2.imread('./粉色.jpg')
cv2.imshow('Image', img)
cv2.waitKey(0)
3.1 cv2.resize-改变图片大小
import cv2
import numpy as np
img = cv2.imread(r'E:\Pictures\dir2\han2.png')
# ↓返回shape来得知图片的大小:(900, 1600, 3)=(高,宽,ChannelNumber=3(BGR))
print(img.shape)
# ↓长 ↓高/宽
imgResize = cv2.resize(img, (500, 300)) # 改变大小
print(imgResize.shape)
cv2.imshow('Image', img)
cv2.imshow('Image Resize', imgResize)
cv2.waitKey(0)
3.2 crop:imgCropped = img[, ]-剪裁
import cv2
import numpy as np
img = cv2.imread(r'E:\Pictures\dir2\han2.png')
print(img.shape)
# ↓长 ↓高/宽
imgResize = cv2.resize(img, (500, 300)) # 改变大小
print(imgResize.shape)
# ↓高/宽 ↓长
imgCropped = img[0:200, 200:500] # 裁剪
cv2.imshow('Image', img)
# cv2.imshow('Image Resize', imgResize)
cv2.imshow('Image Cropped', imgCropped)
cv2.waitKey(0)
2020.8.3 周日 上午更新
4、形状和文本-SHAPES AND TEXTS
import cv2
import numpy as np
# 512*512pixels/boxes+,3=0-255
img = np.zeros((512, 512, 3), np.uint8)
# print(img)
# img[200:300, 100:300] = 255, 0, 0 # 蓝色
cv2.line(img, (0, 0), (img.shape[1], img.shape[0]), (0, 255, 0), 3)
cv2.rectangle(img, (0, 0), (250, 350), (0, 0, 255), 2) # 最后的2改成cv2.FILLED填充
cv2.circle(img, (400, 50), 30, (255, 255, 0), 5)
# ↓照片 ↓内容 ↓起始位置 ↓字体 ↓scale ↓颜色 ↓粗细
cv2.putText(img, "Esther", (300, 100), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 150, 0), 1)
cv2.imshow("Image", img)
cv2.waitKey(0)
2020.8.3 周日 下午
这周的学习内容就到这里了,因为还有别的任务,所以没有学完的库将在后续各自的专属博客中进行跟进和更新
溜了溜了…去忙别的了,5号之后继续学!!!在下一个博客见咯
(七)汇报中遇到的问题还有可以改进的地方(未完)~
1、上面的Os,shutil库及excel的综合小练习要用os.path.join再写一遍
2、上面的Matplotlib,opencv初探小练习的路径不要写固定,用input输入灵活一些
3、深入了解kernel、dilate和erode等的真正意义
kernel
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8) # 用numpy创建kernel:values=1 !!
# 大小 类型:unsigned integer of 8-bit。values range from 0-255
差操作和另一个对应的操作
# 差操作,先Dialation再Eroded! 光滑/光滑变粗
函数意义
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number 和机器学习里面的卷积不太一样
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200) # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1) # 了解参数!!
imgEroded = cv2.erode(imgDialation, kernel, iterations=1) # 变细
把这个代码吃透
import cv2
import numpy as np
# 读取
img = cv2.imread(r'E:\Pictures\dir2\han2.png') # 读取照片
# kernel:矩阵,定义大小和值
kernel = np.ones((5, 5), np.uint8) # 用numpy创建kernel:values=1 !!
# 大小 类型:unsigned integer of 8-bit。values range from 0-255
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# (7, 7): kernal size(卷积):odd number
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
imgCanny = cv2.Canny(img, 150, 200) # 值越大边缘越模糊
imgDialation = cv2.dilate(imgCanny, kernel, iterations=1) # 了解参数!!
imgEroded = cv2.erode(imgDialation, kernel, iterations=1) # 变细
# 差操作,先Dialation再Eroded! 光滑/光滑变粗
# 显示
cv2.imshow("Image", img) # 彩图
cv2.imshow("Gray Image", imgGray) # 灰度图
cv2.imshow("Blur Image", imgBlur) # 模糊版
cv2.imshow("Canny Image", imgCanny) # 边缘
cv2.imshow("Dialation Image", imgDialation) # 边缘膨胀扩大
cv2.imshow("Eroded Image", imgEroded) # 边缘变细
# 保存
cv2.imwrite(r'E:\Competition\saveImg.jpg', img) # 保存为jpg类型的
cv2.imwrite(r'E:\Competition\saveImg.png', img)
cv2.imwrite(r'E:\Competition\GrayImg.png', imgGray)
cv2.imwrite(r'E:\Competition\BlurImg.png', imgBlur)
cv2.imwrite(r'E:\Competition\CannyImg.png', imgCanny)
cv2.imwrite(r'E:\Competition\DialationImg.png', imgDialation)
cv2.imwrite(r'E:\Competition\ErodedImg.png', imgEroded)
cv2.waitKey(0)