python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt

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

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

版本:python3.8
运行:PyCharm2019

下面开始详细讲解喽:

第一步:

分别批量重命名文件夹中的图片名称,并将.bmp格式的图片修改为.jpg格式。
下图是从网络上下载的量两组图:
上面一排是5张兔子Judy(.bmp格式), 下面一排是5张花朵(.jpg格式)。这些图名称随机,大小不一。这些原始图片的保存路径是 ./picturespython图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第1张图片
主要语法: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()

效果如下:
python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第2张图片

第二步:

统一所有图片大小为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")  #另存为的文件夹路径

效果如下:
python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第3张图片

第三步:

图片的灰度处理+归一化

背景介绍:

对于任何一张彩色图片,每个像素点有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 进行安装。
python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第4张图片

下面就可以具体实现:

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 )
    python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第5张图片
  • 归一化后的图片(保存在 ./After_normalizing )
    由于这里是归一化到0-1范围内,所以恢复出来的图片看起来都是黑的(注:0是黑,255是白),这里只是顺手实现下保存的方法。
    python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第6张图片
  • 为了方便之后一些机器学习的操作,有时需要将归一化后的数据保存下来,这里是写入了一个事先新建的txt文件中。由于文件较大,我用了Notepad ++打开,效果如下:
    python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第7张图片
    此部分参考:
    https://www.cnblogs.com/vocaloid01/p/9514142.html

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

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

2.我的路径及其文件夹如下图所示:
python图片预处理基本操作之——批量重命名,修改格式,统一大小,保存为其他路径,灰度化,归一化并将BGR写入txt_第8张图片
3.在更改为你的路径后,如果要加载某个文件夹内的图片,相对路径是这样的:./Pic_SameSize/ 最后那个/不可少,不能写成 ./Pic_SameSize 否则会报错;

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

祝大家码得顺利!

你可能感兴趣的:(python,opencv,图像识别,机器学习)