第二次学习
题目一:将示例代码修改为能够批量重命名目标文件、批量删除文件等。
在这次学习中初步了解了python中的函数,这个题目主要是要求将功能写入函数,再使用。
首先,批量处理需要一定数量的文件,所以先写一个批量创建文件的函数。因为刚开始学习,我先每个功能独立测试最后再拼到一起。
import os
def creatfile():
num=int(input("创建文件数:"))
for i in range(num):
f=open('d:/dump/hh'+str(i),'w')
f.close()
creatfile()
主要遇到的问题就是数据的类型转换。输入的num要强制转换为整数,i原先为整数,但在要作为文件名时要先转换为字符型。
之后,再写批量重命名和批量删除
import os
#批量创建文件
def creatfile():
num=int(input("创建文件数:"))
for i in range(num):
f=open('d:/dump/hh'+str(i),'w')
f.close()
def printName(dir):
filelist = os.listdir(dir)#读取文件路径
for i in filelist:
print(i)
path='D:/dump'#目标文件夹路径
# printName(path)
#这是一个示例代码,作用为批量打印目标文件下的文件名称
#批量改名
def rename(dir):
filelist=os.listdir(dir)
j=0
for i in filelist:
j=j+1
src=os.path.join(os.path.abspath(dir), i)#目标文件
dst=os.path.join(os.path.abspath(dir), ''+str(j) + '.jpg')#重命名文件名
os.rename(src,dst)
#批量改名
def removefile(dir):
filelist=os.listdir(dir)
num=int(input("删除文件数:"))
j=0
for i in filelist:
file=os.path.join(os.path.abspath(dir), i)
os.remove(file)
j=j+1
if j>=num:
break
#可根据以上代码修改为批量对目标文件下重命名文件名称、批量删除等
creatfile()
rename(path)
removefile(path)
print(os.listdir(path))
这其中要注意的是os.path模块中,os.path.abspath(path)方法和os.path.join()方法的运用。前者返回绝对路径,后者将目录和文件名合成一个路径。
题目二:自行实现几个图片基本操作并将改动后的图片保存在同一个文件夹中
这次的图片处理,主要用到了OpenCV库。需要做到读取图片、保存图片、截取部分图像、图像翻转、缩放图片、转化为灰度图片和在一个窗口中显示两张图片的功能。
结合函数部分所学的内容,我把各个功能做成了一个一个的函数。主要需要学习的是各个方法的使用。
import cv2
img="D:/imagetest/1.jpg"
def readimage(img):
img1=cv2.imread(img)
cv2.imshow("test1",img1)
def frameimage(img):
img1=cv2.imread(img)
frame=img1[100:300,100:300] #截取部分图像
cv2.imshow("test2",frame)
cv2.imwrite("D:/imagetest/2.jpg",frame)#可以改变图像格式
def flipimage(img):
img1=cv2.imread(img)
flipCode1=1#大于0左右翻转
flipCode2=0#等于0上下翻转
flipCode3=-1#小于0先上下翻转再左右翻转
img2=cv2.flip(img1,flipCode1)#filpCode控制图片翻转方向
img3=cv2.flip(img1,flipCode2)
img4=cv2.flip(img1,flipCode3)
cv2.imshow("test3",img2)
cv2.imshow("test4",img3)
cv2.imshow("test5",img4)
cv2.imwrite("D:/imagetest/3.jpg",img2)
cv2.imwrite("D:/imagetest/4.jpg",img3)
cv2.imwrite("D:/imagetest/5.jpg",img4)
def resizeimage(img):
img1=cv2.imread(img)
img2=cv2.resize(img1,(400, 400))#设置输出图片的尺寸
img3=cv2.resize(img1,None,fx=0.6,fy=0.6)#None的位置本来是输出图片的尺寸,这里设置了缩放因子
cv2.imshow("test6",img2)
cv2.imshow("test7",img3)
cv2.imwrite("D:/imagetest/6.jpg",img2)
cv2.imwrite("D:/imagetest/7.jpg",img3)
def grayimage(img):
img1=cv2.imread(img)#cv2.imread读进来的图片格式是BGR(W,H,C),而不是RGB
cv2.imshow("BGR",img1)
img2=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)#将图像转换为RGB格式
cv2.imshow("RGB",img2)
cv2.imwrite("D:/imagetest/RGB.jpg",img2)
img3=cv2.cvtColor(img2,cv2.COLOR_RGB2GRAY)#将图像转换为灰度图像
cv2.imshow("GRAY",img3)
cv2.imwrite("D:/imagetest/GRAY.jpg",img3)
def mulimage(img):
import numpy as np
img1=cv2.imread(img)
img2=cv2.imread(img)
imgs1=np.vstack([img1,img2])#在竖直方向上堆叠
imgs2=np.hstack([img1,img2])#在水平方向上平铺
cv2.imshow("mul_img1",imgs1)
cv2.imshow("mul_img2",imgs2)
cv2.imwrite("D:/imagetest/mul1.jpg",imgs1)
cv2.imwrite("D:/imagetest/mul2.jpg",imgs2)
readimage(img)
frameimage(img)
flipimage(img)
resizeimage(img)
grayimage(img)
mulimage(img)
cv2.waitKey(0)
最后结果:
这个程序做完之后,我在想可以结合之前所学的批量处理的知识,用循环来对大量的图片进行批量处理。
题目三:画一只猪
画一只小猪佩奇。
先了解一下基础的绘图功能。
cv2.putText(img, "hello", (150,300), font, 0.8, (25, 25, 25), 2,)
#文本 #图片对象、文本、 位置、 字体、字体大小、颜色、 字体粗细
cv2.line(img, (100,100), (200,200), (0, 0,0),5)
#线 #起点 终点 颜色 粗细
cv2.rectangle(img, (80,8), (200,100), (0, 255,0),2)
#矩形 #左上顶点 右下顶点 颜色 粗细
cv2.circle(img,(60,60),30,(0,0,213),1)
#圆形 #圆心 半径 颜色 控制是否填充 -1表示填充
cv2.ellipse(img,(100,300),(100,50),180,0,360,(20,213,79),1)
#椭圆 #中心点 长轴 短轴 偏转角度,起始角度,终止角度 颜色 控制是否填充 -1表示填充
注意
cv2.waitKey(0)
没有这一句图片会一闪而过
下面开始画猪
参照图:
import cv2
import numpy as np
img = 255*np.ones((640,640,3),np.uint8)
font = cv2.FONT_HERSHEY_DUPLEX
#cv2.rectangle(img,(175,20),(200,100),(0,255,0),-1)
cv2.ellipse(img,(250,220),(90,100),0,0,180,(249,134,227),1)#下巴
cv2.ellipse(img,(330,220),(170,110),180,0,112,(249,134,227),1)#脑壳
cv2.ellipse(img,(375,193),(50,20),-20,5,153,(249,134,227),1)#猪鼻拱
cv2.ellipse(img,(405,150),(35,25),-105,0,360,(249,134,227),1)#鼻子
cv2.circle(img,(395,152),7,(249,134,227),-1)#左鼻孔
cv2.circle(img,(415,148),7,(249,134,227),-1)#右鼻孔
cv2.circle(img,(310,150),20,(249,134,227),1)#右眼眶
cv2.circle(img,(260,170),20,(249,134,227),1)#左眼眶
cv2.circle(img,(303,152),8,(249,134,227),-1)#右眼球
cv2.circle(img,(253,172),8,(249,134,227),-1)#左眼球
cv2.ellipse(img,(280,250),(30,20),-15,0,180,(249,134,227),1)#嘴
cv2.ellipse(img,(200,220),(30,25),-105,0,360,(250,21,253),-1)#腮红
cv2.ellipse(img,(250,100),(28,17),75,30,330,(249,134,227),1)#右耳朵
cv2.ellipse(img,(200,120),(28,17),60,30,330,(249,134,227),1)#左耳朵
cv2.imshow("Draw", img)
cv2.waitKey(0)
最后结果:
我在写程序的过程中遇到的报错主要是少写逗号。