最近学习需要,接触了一些图片预处理的工作(用python实现),但网上集中的篇幅不多,故整理如下,主要包括:
版本: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()
让我们来逐个看下效果:
至此,已经完成上述所需操作。
在此过程中,有一些小的细节需要注意:
1.如果以上代码有幸被你复现,请注意安装相关第三方库,站在巨人的肩膀上做一个平平无奇调包小可爱;
2.我的路径及其文件夹如下图所示:
3.在更改为你的路径后,如果要加载某个文件夹内的图片,相对路径是这样的:./Pic_SameSize/ 最后那个/不可少,不能写成 ./Pic_SameSize 否则会报错;
4.本文的代码还不完善,如有错误之处欢迎留言,一起改正。
祝大家码得顺利!