Python实现图像的裁剪与拼接

下面几个分别实现批处理图像,单个处理图像
安个数划分和安分割后图像大小划分

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("处理完毕")

参考资料
https://blog.csdn.net/weixin_40446557/article/details/102913984
感谢博主

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)
  • 10
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓码bigdata

如果文章给您带来帮助,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值