之前因为交接已毕业师兄的工作,从交接内容中找到了一个批量处理来裁剪图像的程序。对我这个python小白来说友善多了,可以以这段代码作为模板,方便日后工作中的批量处理图像(因为我每次要处理的岩心图像就是256张或512张,我代码能力一般,所以通过这个批量处理的模板可以很方便地进行后来的工作)。
代码部分:(这里是以批量裁剪图像为例,想做什么操作把那个裁剪图像的函数换掉就可以)
import os#导入批量处理模块
from PIL import Image#导入图像处理模块
path = r"E:/rock data/sandstone2 19.9"#导入图像的路径
filelist =os.listdir (path)#列出路径下所有的文件,并存储在filelist的列表里
def Cutigure(figurepath):#定义裁剪图像的函数
im = Image.open(figurepath)#读取当前图像并转换为二维矩阵格式
x = 256
y = 256
w = 128
h = 128
region = im.crop((x, y, x+w, y+h))#裁剪出选择的像素区域并存储在region矩阵中
region.save("E:/rock data/cut_sandstone2 19.9/" + figurepath.split("\\")[-1])#将region矩阵保存为图片格式,命名为.split就是将一个字符串分隔成多个字符串组成的列表
for filename in filelist:#循环,范围为filelist从1到结束
filefullpath =os.path.join (path, filename)#os.path.join 函数为路径拼接
Cutigure(filefullpath)#调用裁剪图像的函数
代码解读:
代码从以下三部分开始分析。
第一部分:path导入图像的路径,然后用os函数把路径下的文件名存储在列表filelist里。
第二部分:定义裁剪图像的函数,函数的输入参数就是figurepath,即绝对路径下的该图像;最后存储的时候也是把处理完的图像存在指定目录下并且命名为原图像的名称。
第三部分:写一个for循环,遍历filelist中存储的每一个图像的名称,然后和图像的父目录的路径拼接成该图像的绝对路径,调用上述函数进行处理。
难点是在for循环的路径拼接上以及定义的函数最后一步保存图像上,这里我理解了很久才看得懂,但是自己写还是不会写.....(手动狗头)
代码运行结果:
这张图中左半部分为采集的原始CT图像,右半部分是裁剪完的128*128的图像。
最后再放上单张图片裁剪的代码:
from PIL import Image#导入图像处理模块
import cv2 as cv
def Cutigure(img):#定义裁剪图像的函数
# im = Image.open(img)#读取当前图像并转换为二维矩阵格式
x = 555
y = 555
w = 512
h = 512
region = img.crop((x, y, x+w, y+h))#裁剪出选择的像素区域并存储在region矩阵中
return region
img = Image.open('E:/circular.bmp')#读取数据
img_cut = Cutigure(img)#调用函数裁剪图片
img_cut.save("E:/circular2.bmp")#保存图片