python裁剪图片并粘贴到另一图片上

本文介绍如何使用Python的PIL库进行图片裁剪,并将裁剪后的图片粘贴到另一张图片上,同时展示了如何生成背景图片和保存处理后的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# python裁剪图片并粘贴到另一图片上
from PIL  import Image
import matplotlib.pyplot as plt

srcPath = '/workspace/tlt-experiments/data_fire_2/cat.jpg'
dstPath = '/workspace/tlt-experiments/data_fire_2/cat_crop.jpg'

# 图片颜色
color = [200,200,200]
# 生成背景图片
image = Image.new('RGB',(1242,375),(color[0],color[1],color[2]))
# 读取图片
img_read = Image.open(srcPath)
# 设置裁剪的位置
crop_box = (150,100,240,200)
# 裁剪图片
img_crop = img_read.crop(crop_box)
# 粘贴图片
image.paste(img_crop,(0,0))
image.paste(img_crop,(300,200,300 + img_crop.size[0],200 + img_crop.size[1]))
image.paste((0,255,0),(200,10,250,100))
# 保存图片
image.save(savePath + "001.png")
plt.imshow(image)
plt.show()

在这里插入图片描述

### 实现像的随机裁剪与重新拼接 为了实现像的随机裁剪将其重新拼接,在Python中有多种方法可以完成这操作。这里介绍种基于`OpenCV`和`NumPy`的方法来执行此任务。 #### 随机裁剪函数定义 首先,创建一个用于从原始像中提取子的功能模块。该功能会根据指定的高度宽度参数以及步长(即每次移动的距离),在原内选取多个不重叠或部分重叠的小区域作为新的训练样本[^4]。 ```python import cv2 import numpy as np from random import randint def random_crop(image, crop_height, crop_width): max_x = image.shape[1] - crop_width max_y = image.shape[0] - crop_height if max_x <= 0 or max_y <= 0: raise ValueError('Image size is smaller than the specified crop dimensions.') x = randint(0, max_x) y = randint(0, max_y) cropped_image = image[y:y + crop_height, x:x + crop_width] return cropped_image ``` 上述代码实现了单次随机位置的选择,从中截取固定大小的部分;当输入图片不足以满足所设条件时,则抛出异常提示错误信息。 #### 处理多张碎片化后的重组逻辑 接下来构建一个辅助工具用来管理这些被切割出来的片段将它们按照定规律组合回去形成完整的形。考虑到实际应用中的灵活性需求,下面给出的例子允许用户自定义最终输出画布的具体规格: ```python def reassemble_patches(patches_list, target_shape=(None, None)): rows = [] row_images = [] current_row_height = sum([p.shape[0] for p in patches_list]) total_cols = max([p.shape[1] for p in patches_list]) canvas_height = target_shape[0] if all(target_shape) else current_row_height canvas_width = target_shape[1] if all(target_shape) else total_cols * len(patches_list) empty_patch = np.zeros((canvas_height//len(patches_list), canvas_width)) index = 0 while True: try: patch = patches_list[index] if not row_images or sum([ri.shape[1] for ri in row_images]) + patch.shape[1] <= canvas_width: row_images.append(patch) elif any(row_images): combined_row = np.hstack(tuple(row_images)) padding_needed = canvas_width - combined_row.shape[1] padded_row = cv2.copyMakeBorder(combined_row, top=0,bottom=0,left=0,right=padding_needed, borderType=cv2.BORDER_CONSTANT,value=[0,0,0]) rows.append(padded_row) row_images.clear() index += 1 except IndexError: break last_combined_row = np.hstack(tuple(row_images)) if row_images else empty_patch remaining_space = canvas_height - last_combined_row.shape[0] final_canvas = cv2.vconcat(rows + [last_combined_row,cv2.copyMakeBorder(last_combined_row,top=remaining_space,bottom=0,left=0,right=0,borderType=cv2.BORDER_CONSTANT,value=[0,0,0])][:-(not bool(rows)+1)]) return final_canvas[:target_shape[0], :target_shape[1]] if all(target_shape) else final_canvas ``` 这个过程涉及到水平方向上的连接(`np.hstack`)和平铺式的垂直堆叠(`cv2.vconcat`)两个主要步骤。此外还加入了必要的边界填充以确保所有组件都能适配到预设的目标框架之内[^3]。 通过以上两段核心算法的支持,就可以方便地对任意给定的大尺寸影像文件实施多次不同方位/尺度下的局部采样动作,同时也能保证经过系列变换之后的数据能够顺利恢复原型以便后续分析使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值