python图片预处理基本操作之

您所在的位置:网站首页 照片格式大小更改方法视频 python图片预处理基本操作之

python图片预处理基本操作之

2024-07-01 13:15| 来源: 网络整理| 查看: 265

最近学习需要,接触了一些图片预处理的工作(用python实现),但网上集中的篇幅不多,故整理如下,主要包括:

批量重命名大量图片修改格式(此处以.bmp转化为.jpg为例)统一图片大小(分辨率128*128)将上述操作后的图片另存为目标路径对图片进行灰度化处理对图片进行归一化处理,并将每个像素点的BGR保存在txt文件里

版本:python3.8 运行:PyCharm2019

下面开始详细讲解喽:

第一步:

分别批量重命名文件夹中的图片名称,并将.bmp格式的图片修改为.jpg格式。 下图是从网络上下载的量两组图: 上面一排是5张兔子Judy(.bmp格式), 下面一排是5张花朵(.jpg格式)。这些图名称随机,大小不一。这些原始图片的保存路径是 ./pictures在这里插入图片描述 主要语法:os.rename() 参考链接: https://blog.csdn.net/wowocpp/article/details/79460407

class BatchRename(): #定义一个重命名的类 def __init__(self): self.path = './pictures' def rename(self): filelist = os.listdir(self.path) total_num = len(filelist) i = 0 for item in filelist: if item.endswith('.bmp'): #将bmp格式的图片改为jpg src = os.path.join(os.path.abspath(self.path), item) dst = os.path.join(os.path.abspath(self.path), 'Judy' + str(i) + '.jpg') #重新命名并改格式 try: os.rename(src, dst) print('converting %s to %s ...' % (src, dst)) i = i + 1 except: continue for item in filelist: if item.endswith('.jpg'): src = os.path.join(os.path.abspath(self.path), item) dst = os.path.join(os.path.abspath(self.path), 'flower' + str(i) + '.jpg') ##重新命名 try: os.rename(src, dst) print('converting %s to %s ...' % (src, dst)) i = i + 1 except: continue if __name__ == '__main__': demo = BatchRename() demo.rename()

效果如下: 在这里插入图片描述

第二步:

统一所有图片大小为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’) 这句语法来实现对统一大小后的图片灰度化处理。

使用深度学习在进行图像分类或者对象检测时候,首先需要对图像做数据预处理,一种常见方法叫做归一化处理。图像归一化最常见的就是最大最小值归一化方法,公式如下: 在这里插入图片描述我们在这里介绍一种python调用OpenCV实现图像最大最小值归一化的操作。openCV是一个强大的图像处理和计算机视觉库,实现了很多实用算法,保留了python等的接口,以供调用。 在这里用到的归一化的语法是:cv2.normalize 这个函数的详解: https://blog.csdn.net/qq_29023939/article/details/81105806

注:需要在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 ) 在这里插入图片描述归一化后的图片(保存在 ./After_normalizing ) 由于这里是归一化到0-1范围内,所以恢复出来的图片看起来都是黑的(注:0是黑,255是白),这里只是顺手实现下保存的方法。 在这里插入图片描述为了方便之后一些机器学习的操作,有时需要将归一化后的数据保存下来,这里是写入了一个事先新建的txt文件中。由于文件较大,我用了Notepad ++打开,效果如下: 在这里插入图片描述 此部分参考: https://www.cnblogs.com/vocaloid01/p/9514142.html

至此,已经完成上述所需操作。

在此过程中,有一些小的细节需要注意: 1.如果以上代码有幸被你复现,请注意安装相关第三方库,站在巨人的肩膀上做一个平平无奇调包小可爱;

2.我的路径及其文件夹如下图所示: 在这里插入图片描述 3.在更改为你的路径后,如果要加载某个文件夹内的图片,相对路径是这样的:./Pic_SameSize/ 最后那个/不可少,不能写成 ./Pic_SameSize 否则会报错;

4.本文的代码还不完善,如有错误之处欢迎留言,一起改正。

祝大家码得顺利!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3