基于Numpy数组的图像分割 基于PIL对图像进行拼接

简介: 基于Numpy数组的图像分割 基于PIL对图像进行拼接

一、要求

现在有一个多张图片构成的大图,要对图片进行分割和拼接。将下述图像分割成15个大小不同的子图像:

从中选择四个子图像,拼接成一个新得图像。例如:


二、代码

直接上代码:

1. import cv2
2. import numpy as np
3. import PIL.Image as Image
4. 
5. def func(cut_width,cut_length,time,picture):
6.     (width, length, depth) = picture.shape
7.     # 预处理生成0矩阵
8.     pic = np.zeros((cut_width, cut_length, depth))
9.     # 计算可以划分的横纵的个数
10.     num_width = int(width / cut_width)
11.     num_length = int(length / cut_length)
12.     # for循环迭代生成
13.     for i in range(0, num_width):
14.         for j in range(0, num_length):
15.             pic = picture[i * cut_width: (i + 1) * cut_width, j * cut_length: (j + 1) * cut_length, :]
16.             result_path ='{}_{}_{}.jpg'.format(time,i + 1, j + 1)
17.             pic = cv2.resize(pic,dsize=(100,100))
18.             cv2.imwrite(result_path, pic)
19. 
20. # 读取要分割的图片,以及其尺寸等数据
21. cut_width_1 = 310
22. cut_width_2 = 50
23. cut_length_1 = 345
24. cut_length_2 = 50
25. picture_1 = cv2.imread("photo.jpg")
26. picture_2 = cv2.imread("1_1_1.jpg")
27. picture_3 = cv2.imread("1_2_1.jpg")
28. picture_4 = cv2.imread("1_2_2.jpg")
29. func(cut_width_1,cut_length_1,1,picture_1)
30. func(cut_width_2,cut_length_2,2,picture_2)
31. func(cut_width_2,cut_length_2,3,picture_3)
32. func(cut_width_2,cut_length_2,4,picture_4)
33. to_image = Image.new('RGB', (200, 200))  # 创建一个新图
34. from_image_1 = Image.open("2_1_1.jpg")
35. from_image_2 = Image.open("3_1_1.jpg")
36. from_image_3 = Image.open("3_1_2.jpg")
37. from_image_4 = Image.open("4_2_2.jpg")
38. to_image.paste(from_image_1, (0,0))
39. to_image.paste(from_image_2, (100,0))
40. to_image.paste(from_image_3, (0,100))
41. to_image.paste(from_image_4, (100,100))
42. to_image.save("result.jpg")

三、程序解读

所用的库为cv2和numpy这两个机器学习经常会用的库,首先导入这两个库:import numpy as np;import cv2。

代码核心在于func这个函数,里面有四个形参:cut_width,cut_length,time,picture。分别代表着需要切割的宽度,需要切割的长度,第几次切割以及需要切割的图片。

  1. 首先,用picture.shape获得当前图片的大小并返回。由于图片本身是一个个像素组成的,可以看成是像素矩阵,这样我们切割合并就会方便很多。所以,先用np.zero按原图片大小填充0。Num_width和num_length代表着可以划分的纵横个数。
  2. 之后两个for循环在原图片上进行分割,关键在pic = picture[i * cut_width: (i + 1) * cut_width, j * cut_length: (j + 1) * cut_length, :]这句代码,这是在原图片上进行数组分割,并将结果返回到pic中。result_path是指定的保存路径及名称,这是我们的time参数就派上用场了,第几次切割名称前面就加几,这样可以有效避免因多次切割导致图片覆盖的问题。
  3. 最后将图片保存。

通过多次调用函数并传入不同的尺寸、time和要处理的图片进行分割:

切割结果依次为2_1_1,2_1_2,2_2_1,2_2_2,1_1_2,3_1_1,3_1_2,3_2_1,3_2_2,4_1_1,4_1_2,4_2_1,4_2_2,1_3_1,1_3_2这15个图片。

我选择 1_1_2,2_2_2,3_1_2,4_1_2这四张图片进行组合:

拼接的代码主要用到PIL.Image,基本逻辑就是挑选出我所要拼接的四张图片,将它们“粘贴”到固定位置。Paste第一个参数是要粘贴的图片,第二个参数是要粘贴的位置,注意这里是左上角。最后一步,将拼接好的图片保存。

好啦!关于基于Numpy数组的图像分割和基于PIL对图像进行拼接就分享到这里啦!感兴趣的同学欢迎评论区留言!


相关文章
|
8天前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
150 1
|
10月前
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
343 4
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
345 10
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
210 1
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
187 2
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
546 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
376 4
|
8天前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
70 0
|
2月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
218 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
2月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
167 0

热门文章

最新文章

下一篇
oss教程