在这次学习中初步了解了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)最后结果:
我在写程序的过程中遇到的报错主要是少写逗号。
