python图片预处理基本操作之 |
您所在的位置:网站首页 › 照片批量修改格式 › python图片预处理基本操作之 |
最近学习需要,接触了一些图片预处理的工作(用python实现),但网上集中的篇幅不多,故整理如下,主要包括: 批量重命名大量图片修改格式(此处以.bmp转化为.jpg为例)统一图片大小(分辨率128*128)将上述操作后的图片另存为目标路径对图片进行灰度化处理对图片进行归一化处理,并将每个像素点的BGR保存在txt文件里版本:python3.8 运行:PyCharm2019 下面开始详细讲解喽: 第一步:分别批量重命名文件夹中的图片名称,并将.bmp格式的图片修改为.jpg格式。 下图是从网络上下载的量两组图: 上面一排是5张兔子Judy(.bmp格式), 下面一排是5张花朵(.jpg格式)。这些图名称随机,大小不一。这些原始图片的保存路径是 ./pictures 效果如下: 统一所有图片大小为128*128,,更改尺寸后保存到另一目录 ./Pic_SameSize 这里用到了PIL (Python Image Library),一个第三方的图像处理库。具体介绍的链接: https://blog.csdn.net/leemboy/article/details/83792729 from PIL import Image import os.path import glob def convertSize(jpgfile,outdir,width=128,height=128): #图片的大小 img=Image.open(jpgfile) try: new_img = img.resize((width, height), Image.BILINEAR) if new_img.mode == 'P': new_img = new_img.convert("RGB") if new_img.mode == 'RGBA': new_img = new_img.convert("RGB") new_img.save(os.path.join(outdir, os.path.basename(jpgfile))) except Exception as e: print(e) for jpgfile in glob.glob("./pictures/*.jpg"): #修改该文件夹下的jpg图片 convertSize(jpgfile,"./Pic_SameSize") #另存为的文件夹路径效果如下: 图片的灰度处理+归一化 背景介绍: 对于任何一张彩色图片,每个像素点有RGB(即red 红,green 绿, blue 蓝)三个值。如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有分量法 最大值法平均值法加权平均法四种方法对彩色图像进行灰度化。 在这里,我们调用PIL 里的 Img.convert(‘L’) 这句语法来实现对统一大小后的图片灰度化处理。 使用深度学习在进行图像分类或者对象检测时候,首先需要对图像做数据预处理,一种常见方法叫做归一化处理。图像归一化最常见的就是最大最小值归一化方法,公式如下: 注:需要在PyCharm里安装openCV这个库。 File -> Settings -> 左侧找到 Project: XX 下的Project Interpreter ->点击右侧的+按钮,分别输入opencv-python 和 opencv-contrib-python 进行安装。 下面就可以具体实现: import numpy as np from PIL import Image import os from numpy import * import cv2 #导入openCV input_dir = './Pic_SameSize/' #文件夹名字后一定要加/,才能识别为打开文件夹中的内容 out_dir1 = './After_graying_' #进行灰度化后的图片保存在该文件夹下 out_dir2 = './After_normalizing_' #进行灰度化和归一化后的图片保存在该文件夹下 #3.1灰度化 a = os.listdir(input_dir) for i in a: print(i) Img = Image.open(input_dir + i) #用PIL的库来逐个读取图片 Img_gray = Img.convert('L') #灰度化L Img_gray.save('./After_graying' + out_dir1 + i) #用PIL的库来逐个保存图片到指定路径下 print('~~~~~~~~~~~~~This is a picture after graying~~~~~~~~~~') print(Img_gray) #3.2对上述灰度化后的Img_gray进行归一化 b = os.listdir('./After_graying/') for j in b: print(j) photo = cv2.imread("./After_graying/" + j) #cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255,通道格式为(W,H,C) result = np.zeros(photo.shape, dtype=np.float32) cv2.normalize(photo, result, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F, mask=None) print('~~~~~~~~~~This is data of BGR after normalizing : ~~~~~~~~~~~~~~~~~~') print(result) cv2.waitKey(0) cv2.destroyAllWindows() Img_output = Image.fromarray(np.uint8(result)) # 将array恢复成图片 Img_output,不能直接把result保存在文件夹里。 Img_output.save('./After_normalizing' + out_dir2 + j) #将归一化后的图片保存在指定路径下 #3.3下面将以上每张图归一化后的数据保存下项目文件夹下的 txtfile.txt 中 fname = open("E:/python_work/PictureProcessing/txtfile.txt", 'a') #a是向txt中追加写入 fname.write("Name of the Picture:" + str(j) + '\n') fname.write("图像的形状,返回一个图像的(行数,列数,通道数):" + str(result.shape) + '\n') fname.write("图像的像素数目:"+str(result.size)+'\n') fname.write("图像的数据类型:"+str(result.dtype)+'\n') Xlenth = result.shape[1] #图片列数 Ylenth = result.shape[0] #图片行数 m = 1 for p in range(Ylenth): #外循环是行 fname.write(str(m) + ':'+'\n') for q in range(Xlenth): #内循环是列 fname.write(str(result[p][q])+' ') m += 1 fname.write('\n') fname.close()让我们来逐个看下效果: 灰度化后的图片(保存在./After_graying )![]() ![]() ![]() 至此,已经完成上述所需操作。 在此过程中,有一些小的细节需要注意: 1.如果以上代码有幸被你复现,请注意安装相关第三方库,站在巨人的肩膀上做一个平平无奇调包小可爱; 2.我的路径及其文件夹如下图所示: 4.本文的代码还不完善,如有错误之处欢迎留言,一起改正。 祝大家码得顺利! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |