python视觉实战


练习一

第一题

(25分)在桌面/quiz/Q1/data目录下,有一组不同品种的猫的图片。编写python代码,命名为 Q1.py,在data目录下创建train和test子目录,并按照8:2的比例随机抽取图片放在子目录下,在 train目录下的文件按照序号命名为train_001.jpg,train_002.jpg,train_003.jpg以此类推 ,test 目录下的文件命名为test_001.jpg,test_002.jpg,test_003.jpg以此类推。最后,将代码文件 Q1.py,及目录data保存在桌面/user/Q1目录下。

1
2
3
4
5
#1.导包
#2.找到图片所在的路径
#3.创建两个文件夹(train,test)
#4.对图片随机二八分类
#5.移动图片到文件夹中并重命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2  #本题用不到
import os #找路径,创文件
import random #随机数
import shutil #
path= "C:/Users/j/Desktop/test1/Q11/data/" #路径无空格、中文(斜杆方向)
# file_list=os.listdir(path) #查看图片 改进
file_list=[x for x in os.listdir(path) if x.endswith("jpg")] #列表表达式(重点)
random.shuffle(file_list) #数组中的元素随机排列
print(file_list)
# os.mkdir(os.path.join(path,"train")) #执行完注释
# os.mkdir(os.path.join(path,"test")) #执行完注释
rate=int(len(file_list)*0.8)
train_list=file_list[:rate] #0-15 16
test_list=file_list[rate:] #16-19 4
print(test_list)

for index,file in enumerate(train_list):
new_file=os.path.join(path+"train","train_{0:0>3d}.jpg".format(index+1)) #正则表达式
old_file=os.path.join(path,file) #正则表达式
print(new_file)
shutil.copy(old_file,new_file)

for index,file in enumerate(test_list):
new_file=os.path.join(path+"test","train_{0:0>3d}.jpg".format(index+1)) #正则表达式
old_file=os.path.join(path,file) #正则表达式
print(new_file)
shutil.copy(old_file,new_file)

第二题

(30分)在桌面/quiz/Q2/data目录下有10张各类品种的猫的图片,因为图片较少,需要进行增广。 编写python代码,命名为Q2.py,完成左右翻转,10度内的随机旋转,将图像增加到30张。并将 所有图片统一大小到256*256。原图像重命名为001.jpg, 002.jpg 等,翻转后的图像命名增加 “flipped_”,重命名为flipped_001.jpg,flipped_002.jpg等。旋转后的图像命名增加“rotated_”, 重命名为rotated_001.jpg,rotated_002.jpg等,并保存在aug目录下。最后,将代码文件Q2.py, 及目录aug保存在桌面/user/Q2目录下。

1
2
3
4
5
#1.导包
#2.找到图片的路径
#3.创建aug文件夹
#4.图像增广
#5.移动图片并重命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 导包
import os
import cv2
import numpy as np
import random
import shutil
# 找到图片路径
path="C:/Users/CHJ/Desktop/shijue/Q12/data/"
file_list=[x for x in os.listdir(path) if x.endswith("jpg")]

# 创建aug文件夹
# os.mkdir(os.path.join(path,"aug"))

# 新建列表
old_list=[]
rotated_list=[]
flipped_list=[]

# 遍历打开图片
for i in file_list:
img=cv2.imread(path+i)

# 原图改(256,256)
old_list.append(cv2.resize(img,(256,256)))

# 随机旋转
h,w,c=img.shape
M=cv2.getRotationMatrix2D((w/2,h/2),random.randint(1,10),1)
rotated_list.append(cv2.resize(cv2.warpAffine(img,M,(h,w)),(256,256)))

# 左右翻转
flipped_list.append(cv2.resize(cv2.flip(img,1),(256,256)))

# 遍历保存
for index,res in enumerate(old_list):
# 新路径构建
new_file=os.path.join(path+"aug","{0:0>3d}.jpg".format(index))
# 保存
cv2.imwrite(new_file,res)
for index,res in enumerate(rotated_list):
new_file=os.path.join(path+"aug","rotated_{0:0>3d}.jpg".format(index))
cv2.imwrite(new_file,res)
for index,res in enumerate(flipped_list):
new_file=os.path.join(path+"aug","flipped_{0:0>3d}.jpg".format(index))
cv2.imwrite(new_file,res)

第二题

1
2
3
4
5
#1.导包
#2.找到图片的路径
#3.创建aug文件夹
#4.图像增广
#5.移动图片并重命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
import cv2
# import numpy as np
import random
import shutil
path="C:/Users/CHJ/Desktop/shijue/quiz/Q2/data/"
file_list=[x for x in os.listdir(path) if x.endswith("jpg")]
# os.mkdir(path+"aug")
# os.mkdir(os.path.join(path,"aug"))
for index,file in enumerate(file_list):
file_jpg=os.path.join(path,file)
print(file_jpg)
img=cv2.imread(file_jpg)
img_resize=cv2.resize(img,(256,256))

new_file=os.path.join(path+"aug","{0:0>3d}.jpg".format(index+1))
cv2.imwrite(new_file,img_resize)
# 翻转
img_flipped=cv2.flip(img_resize,1)
new_file=os.path.join(path+"aug","flipped_{0:0>3d}.jpg".format(index+1))
cv2.imwrite(new_file,img_flipped)
# 随机旋转
h,w,c=img_resize.shape #高,长,通道数
M=cv2.getRotationMatrix2D((w/2,h/2),random.randint(1,10),1)
img_rotated=cv2.warpAffine(img_resize,M,(w,h))
new_file=os.path.join(path+"aug","rotated_{0:0>3d}.jpg".format(index+1))
cv2.imwrite(new_file,img_rotated)

第三题

(25分)在桌面/quiz/Q4/data目录下,有cat_10.json文件,该文件包含了模型对cat_10.jpg图像 的推理检测结果,包括猫品种的标签和猫的位置信息。请编写python代码,命名为Q4.py,在图像 cat_10.jpg上使用红色矩形框绘制出检测结果,并在矩形框的左上方写明标签,将绘制后的图像命 名为cat_10_detected.jpg。最后,将代码文件Q4.py,及cat_10_detected.jpg保存在桌面 /user/Q4目录下。

1
2
3
4
5
#1.导包
#2.找到图片的路径
#3.读取和解析json文件
#4.绘制矩形和文字
#5.保存图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2
import os
import json
img_path="C:/Users/CHJ/Desktop/shijue/quiz/Q4/data/cat_10.jpg"
json_path="C:/Users/CHJ/Desktop/shijue/quiz/Q4/data/cat_10.json"
img=cv2.imread(img_path)
with open(json_path,"r",encoding="utf-8") as f:
content=json.load(f) #读取json文件

text=content["results"][0]["classes"] #第一个results中的classes值
dian1=content["results"][0]["box"][0] #第一个results中第一个box值
dian2=content["results"][0]["box"][1] #第一个results中第二个box值

x1=dian1[0]
y1=dian1[1]
x2=dian2[0]
y2=dian2[1]
cv2.rectangle(img,(x1,y1),(x2,y2),(0,0,255),3) #画矩形 (图片,左上角点,右上角点,颜色,边框的厚度)
# text=content.get("results")[0].get("classes")
# dian1=content.get("results")[0].get("box")[0]
# dian2=content.get("results")[0].get("box")[1]
cv2.putText(img,text,(x1-5,y1-5),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
cv2.imshow("img",img)
cv2.imwrite("C:/Users/CHJ/Desktop/shijue/quiz/Q4/cat_10_detected.jpg",img)
cv2.waitKey()
cv2.destroyAllWindows()
print(content)

练习二

第一题

(20分)在桌面/quiz/Q1/data目录下有20张在网上爬取的图片文件,由于其图片名非常混乱不便 于后续操作,所以需将其重命名为序号+当今日期的格式,例如1_2020_09_30.jpg, 2_2020_09_30.jpg等格式,并将其移动到 picture 文件夹,使用Python代码实现。最终将代码保 存在桌面/user/Q1目录下,名称为Q1.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# # 导入time模块
# import time
# # 优化格式化化版本
# print(time.strftime('%Y_%m_%d',time.localtime(time.time())))

import os
import shutil
import time
now_time=time.strftime('%Y_%m_%d')
path="C:/Users/gundam/Desktop/python/quiz2/Q21/data/"
os.mkdir(path+"picture")#创建文件夹
file_list=[x for x in os.listdir(path) if x.endswith("jpg")]
for index,file in enumerate(file_list):
new_list=os.path.join(path+"picture","{0}_{1}.jpg".format(index+1,now_time))
old_list=os.path.join(path,file)
shutil.copy(old_list,new_list)#复制文件到新路径

第二题

(30分)在桌面/quiz/Q2/data目录下保存了一组10张水果图像,为了更好的扩展训练集, (1)请对图像完成灰度变换,线性变换函数的斜率1.3,截距-30, (2)原始图像使用直方图均衡化的方式调节亮度,最后将所有图像统一到jpg格式,保存到 augment目录下, (3)文件命名为0-0.jpg,0-1.jpg,0-2.jpg,0-3.jpg 等,以此类推,新产生的图像为20张, 最终将代码保存在桌面/user/Q2目录下,名称为Q2.py

1
2
3
4
5
#1.导包
#2.找到图片所在路径
#3.把彩色图变成灰度图,采用线性变换 y=ax+b = 1.3x-30
#4.直方图均衡化
#5.重命名与保存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import os
import cv2
import numpy as np
import shutil
path='C:/Users/CHJ/Desktop/shijue/quiz2/Q2/data/'
# os.mkdir(os.path.join(path,'augment'))
file_list=[x for x in os.listdir(path) if x.endswith('jpg')]
for index,file in enumerate(file_list):
file_img=os.path.join(path,file)
img_ori=cv2.imread(file_img)
img_gray=cv2.imread(file_img,0) # 原图:彩色 用0以灰度图打开
h,w=img_gray.shape
#线性变换 构造一副空的图,像素全0
zeros=np.zeros((h,w),dtype='uint8') #空图片
for i in range(h):
for j in range(w):
cvt=img_gray[i,j]*1.3-30 # 线性变化=1.3x-30
if cvt>255:
cvt=255
elif cvt<0:
cvt=0
zeros[i,j]=cvt
cv2.imwrite(path+'augment/0_{0}.jpg'.format(index),zeros)
#直方图均衡化
b,g,r=cv2.split(img_ori) #通道分离
# 均衡化
bb=cv2.equalizeHist(b)
gg=cv2.equalizeHist(g)
rr=cv2.equalizeHist(r)
# 均衡化后的新通道组成新图片
img_hist=cv2.merge([bb,gg,rr])
# 写入
cv2.imwrite(path+'augment/1_{0}.jpg'.format(index),img_hist)
cv2.waitKey(0)
cv2.destroyAllWindows()


第三题

(30分)在桌面/quiz/Q4/data目录下有一张包含齿轮的图片gear.jpg,还有一张对应json文件 gear.json,表明齿轮的遮罩多边形,请绘制出齿轮的分割图片,背景是白色,遮罩部分是黑色,图 像尺寸和原图一致。类似如下:

1
2
3
4
5
#1.导包
#2.找到文件所在路径
#3.读取和解析json
#4.按数据绘制轮廓
#5.保存图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import cv2
import os
import json
import numpy as np
img_path="C:/Users/gundam/Desktop/python/quiz2/Q24/data/gear.jpg"
json_path="C:/Users/gundam/Desktop/python/quiz2/Q24/data/gear.json"

# 读取json
with open(json_path,'r',encoding="utf-8") as f:
content=json.load(f)
# print(content)
big_points=content['shapes'][0]['points'] #齿轮部分
print(big_points)
small_points=content['shapes'][1]['points'] #背景部分

#转换
big_pts=np.array(big_points,dtype=np.int32)
small_pts=np.array(small_points,dtype=np.int32)

# print(small_points)
img=cv2.imread(img_path)

#创建全黑的多边形,(ones是创建一个全为1的数组)
bg=np.ones(img.shape,dtype='uint8')*255

cv2.fillPoly(bg,[big_pts],(0,0,0))#齿轮部分黑色
cv2.fillPoly(bg,[small_pts],(255,255,255)) #背景部分白色
cv2.imshow('bg',bg)
cv2.waitKey(0)
cv2.destroyAllWindows()

可能需要的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
file_list=[x for x in os.listdir(path) if x.endswith("jpg")]  #列表表达式(重点),此为循环遍历目录下后缀为jpg的文件

random.shuffle(file_list) #数组中的元素随机排列,此为将遍历到的文件名随机排列

train_list=file_list[:rate] #将该数组中下标为0-15的16个元素赋予该变量

for index,file in enumerate(train_list): #enumerate输出数据下标和数据组成的序列,所以需要两个变量赋予下标和数据

os.path.join(path+"train","train_{0:0>3d}.jpg".format(index+1))#连接生成一个新字符串,此为创建一个新的保存路径与文件名,{0:0>3d}为格式化一个三位字符串

shutil.copy(old_file,new_file)#将文件从旧文件路径复制到新文件路径.并修改文件名.

img1=cv2.resize(img,(256,256))#将图片变量的分辨率修改为256x256,并赋给新的图片变量

h,w,c=img.shape#读取矩阵长度,这里读取的是高,宽,通道数

M=cv2.getRotationMatrix2D((w/2,h/2),random.randint(1,10),1)#旋转函数,(w/2,h/2)为旋转中心点,这里表示是图片中点为旋转点、random.randint(1,10)为旋转角度,这里为随机旋转1-10度、1为缩放比例,这里为等比例缩放。(输出的是转换矩阵,不是图片变量)

img2=cv2.warpAffine(img,M,(h,w))#仿射变换函数,此为将上面的旋转函数导出的旋转矩阵M应用到图片变量img,并赋给新图片变量img1。(h,w)为img1的图片分辨率大小

rotated_list.append#在数组中添加元素

img1=cv2.flip(img,1) #图像翻转,此为将图片y轴翻转,0为0轴翻转,1为y轴翻转,-1为x和y轴翻转

img=cv2.imread(file_jpg,0)#读取该路径的图片,0为以灰度图读取,读取原图不加0

with open(json_path,"r",encoding="utf-8") as f:
content=json.load(f)
#此为读取json文件

text=content["results"][0]["classes"] #将json文件中第一个results中的classes值赋予text变量

cv2.rectangle(img,(x1,y1),(x2,y2),(0,0,255),3) #画一个矩形 (图片,左上角点,右上角点,边框颜色,边框的厚度)PS:边框的厚度为负值是,则为填充整个矩形

cv2.putText(img,"文字",(x1-5,y1-5),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)#在图片输入文字,(x1-5,y1-5)为输入文字的坐标,cv2.FONT_HERSHEY_SIMPLEX为字体,1为字体,(0,0,255)为颜色,2为字体厚度

now_time=time.strftime('%Y_%m_%d')#读取本地时间,此为读取本地的年月日

os.mkdir(path+"picture") #此为创建文件夹

zeros=np.zeros((h,w),dtype='uint8')#创建一个全为0的数组,此为创建一个高度为h,宽为w,像素为0的图

cvt=img_gray[i,j]*1.3-30 #线性变化公式为y=ax+b,斜率1.3,截距-30,此为将将图片中特定像素的值按公式修改,赋给cvt变量

b,g,r=cv2.split(img_ori) #通道分离

bb=cv2.equalizeHist(b) # 均衡化

img_hist=cv2.merge([bb,gg,rr])# 均衡化后的新通道组成新图片

big_pts=np.array(big_points,dtype=np.int32)#big_points数组转换为int32格式

bg=np.ones(img.shape,dtype='uint8')*255 #创建一个全为1的数组,此为创建全黑的多边形

cv2.fillPoly(bg,[big_pts],(0,0,0))#填充多边形,此为填充黑色[big_pts]为多边形顶点数,(0,0,0)为填充颜色



← Prev 创建vue项目 | 黑盒测试zuoye Next →