下面几个分别实现批处理图像,单个处理图像
安个数划分和安分割后图像大小划分
图像裁剪
- 1 批处理安个数
- 2 批处理安像素值
- 3 单个图像安分割后个数
- 4 单个图像安像素值
- 5 裁剪和拼接的小案例
- 1、裁剪成15张106*100的图像,上代码
- 2 拼接起来
1 批处理安个数
from PIL import Image
import os
######## 需要裁剪的图片位置#########
path_img = './GAN_img/'
img_dir = os.listdir(path_img)
print(img_dir)
'''
(左上角坐标(x,y),右下角坐标(x+w,y+h)
'''
for i in range(len(img_dir)):
#####根据图片名称提取id,方便重命名###########
id = int((img_dir[i].split('.')[0]).split('_')[1])
img = Image.open(path_img + img_dir[i])
size_img=img.size
print(size_img)
x = 0
y = 0
########这里需要均匀裁剪几张,就除以根号下多少,这里我需要裁剪25张-》根号25=5(5*5)####
w = int(size_img[0]/5)
h = int(size_img[0]/5)
for k in range(5):
for v in range(5):
region = img.crop((x+k*w, y+v*h, x + w*(k+1), y + h*(v+1)))
#####保存图片的位置以及图片名称###############
region.save('./new_1/' + 'gen1' + '%d%d' % (k,v) + '_%d' % id + '.png')
2 批处理安像素值
from PIL import Image
import os
# 默认像素值较小,这里设置一下
Image.MAX_IMAGE_PIXELS = 2300000000
######## 需要裁剪的图片位置#########
path_img = r'G:/zhongxian/统计的图片/'
img_dir = os.listdir(path_img)
print(img_dir)
'''
(左上角坐标(x,y),右下角坐标(x+w,y+h)
'''
for i in range(len(img_dir)):
#####记住x就是横的方向上的宽,y就是高###########
img = Image.open(path_img + img_dir[i])
size_img = img.size
# print(size_img)
size_x, size_y = size_img
x = 0
y = 0
########这里需要均匀裁剪几张,就除以根号下多少,这里我需要裁剪25张-》根号25=5(5*5)####
x_num = int(size_x/608)
y_num = int(size_y/608)
w = 608
h = 608
for k in range(x_num):
for v in range(y_num):
region = img.crop((x + k * w, y + v * h, x + w * (k + 1), y + h * (v + 1)))
#####保存图片的位置以及图片名称###############
region.save('./裁剪后放/' + '第%d张'%i + '%d%d' % (k, v) + '.jpg')
print("处理完毕")
3 单个图像安分割后个数
from PIL import Image
import os
######## 需要裁剪的图片位置#########
path_img = r'G:\zhongxian\裁剪图像\实验图片\z1.jpg'
'''
(左上角坐标(x,y),右下角坐标(x+w,y+h)
'''
img = Image.open(path_img)
size_img = img.size
print(size_img)
x = 0
y = 0
########这里需要均匀裁剪几张,就除以根号下多少,这里我需要裁剪25张-》根号25=5(5*5)####
x_num = 10
y_num = 2
w = int(size_img[0] / x_num)
h = int(size_img[0] / y_num)
for k in range(x_num):
for v in range(y_num):
region = img.crop((x + k * w, y + v * h, x + w * (k + 1), y + h * (v + 1)))
#####保存图片的位置以及图片名称###############
region.save('./裁剪后放/' + '裁剪11图' + '%d%d' % (k, v) + '.jpg')
print("处理完毕")
4 单个图像安像素值
from PIL import Image
import os
######## 需要裁剪的图片位置#########
path_img = r'G:\zhongxian\忠县图像统计\二次分割\zx101.jpg'
'''
(左上角坐标(x,y),右下角坐标(x+w,y+h)
'''
img = Image.open(path_img)
size_img = img.size
# print(size_img)
# 得到图像的宽和高
size_x, size_y = size_img
x = 0
y = 0
########这里需要均匀裁剪几张,就除以根号下多少,这里我需要裁剪25张-》根号25=5(5*5)####
x_num = int(size_x/608)
y_num = int(size_y/608)
print(x_num)
print(y_num)
w = 608
h = 608
for k in range(x_num):
for v in range(y_num):
region = img.crop((x + k * w, y + v * h, x + w * (k + 1), y + h * (v + 1)))
#####保存图片的位置以及图片名称###############
region.save('./裁剪后放/' + '裁剪11图' + '%d%d' % (k, v) + '.jpg')
print("处理完毕")
5 裁剪和拼接的小案例
有一张530*300大小的猫的图像
1、裁剪成15张106*100的图像,上代码
from PIL import Image
import os
######## 需要裁剪的图片位置#########
path_img = r'G:\猫.jpg'
'''
(左上角坐标(x,y),右下角坐标(x+w,y+h)
'''
img = Image.open(path_img)
size_img = img.size
print(size_img)
x = 0
y = 0
########这里需要均匀裁剪几张,就除以根号下多少,这里我需要裁剪25张-》根号25=5(5*5)####
x_num = 5
y_num = 3
w = int(size_img[0] / x_num)
h = int(size_img[1] / y_num)
# 注意这里是从上到下,再从左到右裁剪的
for k in range(x_num):
for v in range(y_num):
region = img.crop((x + k * w, y + v * h, x + w * (k + 1), y + h * (v + 1)))
#####保存图片的位置以及图片名称###############
region.save('./裁剪后放/' + '裁剪' + '%d%d' % (k, v) + '.jpg')
print("处理完毕")
2 拼接起来
上面的裁剪是从上到下,再从左到右裁剪
所以这里按顺序先是从上到下拼接,再从左到右拼接
# 实现图像的拼接
# 两步走
# 1 先拼成一列一列的
# 2 再把拼好的列左右拼接起来
from PIL import Image
import os
import numpy as np
# 输入图像的路径
path = r'G:\zhongxian\裁剪图像\裁剪后放'
filenames = os.listdir(path)
print("目录:",path)
print("图像的总个数:",len(filenames))
print('开始执行:')
# 定义计数的
i = 0
# 定义空字符串存储数组
list_a = []
# 1 下面的for循环用于将图像合成列,只有一个参数,就是num_yx,每列有几行图像
for filename in filenames:
# 定义每列有几张图像
num_yx = 3
# i用于计数
i +=1
print("第%d张"%i)
# t用于换列
t = (i-1)//num_yx
# 获取img
im = Image.open(os.path.join(path, filename))
# 转换为numpy数组
im_array = np.array(im)
# 如果取的图像输入下一列的第一个,因为每列是3张图像,所以1,4,7等就是每列的第一张
if (i-1) % num_yx == 0:
# list_a[t] = im_array
list_a.append(im_array)
# 否则不是第一个数,就拼接到图像的下面
else:
list_a[t] = np.concatenate((list_a[t], im_array), axis=0)
# 2 合成列以后需要将列都拼接起来
for j in range(len(list_a)-1):
list_a[0] = np.concatenate((list_a[0], list_a[j+1]),axis=1)
im_save = Image.fromarray(np.uint8(list_a[0]))
im_save.save("./图像/pinjie.jpg")
print("执行完毕")
复原:
# 6 批量图像拼接
一个文件夹包含38个文件夹,38个文件夹中的图片用来合成38张图像
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021041122204414.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW90aWln,size_16,color_FFFFFF,t_70)
```python
# 忠县影像的拼接
import numpy as np
import os
import time
from PIL import Image
# 开始计时
time_start=time.time()
# 输入图像的路径
path = r'G:\zhongxian\忠县图像统计\5语义分割后'
filenames = os.listdir(path)
print("目录:",path)
print("内容:")
k = 0 # 记录拼接好几张图象了
for filename in filenames:
path1 = os.path.join(path, filename) # G:\zhongxian\忠县图像统计\3分开40组\第01组
files = os.listdir(path1)
# 定义计数的
i = 0
# 定义空字符串存储数组
list_a = []
# 1 下面的for循环用于将图像合成列,只有一个参数,就是num_yx,每列有几行图像
print("多少张:",len(files))
for file in files:
# 定义每列有几张图像
num_yx = len(files)//7
# i用于计数每张拼接图像的计数
i += 1
# print("第%d张" % i)
# t用于换列
t = (i - 1) // num_yx
# 获取img
im = Image.open(os.path.join(path1, file))
# 转换为numpy数组
im_array = np.array(im)
# 如果取的图像输入下一列的第一个,因为每列是3张图像,所以1,4,7等就是每列的第一张
if (i - 1) % num_yx == 0:
# list_a[t] = im_array
list_a.append(im_array)
# 否则不是第一个数,就拼接到图像的下面
else:
list_a[t] = np.concatenate((list_a[t], im_array), axis=0)
# 2 合成列以后需要将列都拼接起来
for j in range(len(list_a) - 1):
list_a[0] = np.concatenate((list_a[0], list_a[j + 1]), axis=1)
im_save = Image.fromarray(np.uint8(list_a[0]))
k +=1
im_save.save("G:/zhongxian/忠县图像统计/6拼接好/"+filename+".jpg")
print("拼接好第%d张"%k)
# 清空列表
list_a.clear()
time_end = time.time()
print('总耗时', time_end - time_start)