基于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对图像进行拼接就分享到这里啦!感兴趣的同学欢迎评论区留言!


相关文章
|
2月前
|
存储 索引 Python
一文掌握python数组numpy的全部用法(零基础学python(二))
一文掌握python数组numpy的全部用法(零基础学python(二))
29 0
|
7天前
|
存储 算法 数据处理
《Numpy 简易速速上手小册》第3章:Numpy 数组操作与变换(2024 最新版)
《Numpy 简易速速上手小册》第3章:Numpy 数组操作与变换(2024 最新版)
28 0
|
7天前
|
存储 数据采集 数据挖掘
《Numpy 简易速速上手小册》第2章:Numpy 数据类型和数组构造(2024 最新版)
《Numpy 简易速速上手小册》第2章:Numpy 数据类型和数组构造(2024 最新版)
24 0
|
8天前
|
存储 机器学习/深度学习 数据挖掘
自定义数据类型与NumPy结构数组详解
【4月更文挑战第17天】本文详细介绍了NumPy中的自定义数据类型和结构数组。通过`numpy.dtype`可创建自定义数据类型,如示例中的包含整数和浮点数字段的数组。结构数组能存储不同类型的元素,每行作为一个记录,包含多个字段。创建结构数组时,定义字段及其数据类型,然后通过字段名进行访问和操作。掌握这些技术能提升数据处理效率和灵活性,尤其在科学计算和数据分析领域。
|
8天前
|
搜索推荐 数据挖掘 数据处理
NumPy数组统计与排序方法全览
【4月更文挑战第17天】本文介绍了NumPy在Python中的数组统计和排序功能。主要包括计算平均值、标准差和方差的`np.mean()`, `np.std()`, `np.var()`方法,以及求最大值、最小值、百分位数的功能。在排序方面,讲解了基本排序的`np.sort()`,获取排序索引的`np.argsort()`,逆序排序和随机排序的方法。这些工具对于数据分析和科学计算十分实用,能有效提升数据处理效率。
|
8天前
|
存储 数据处理 Python
NumPy数组运算:元素级与广播机制剖析
【4月更文挑战第17天】NumPy是Python数值计算库,提供元素级运算和广播机制。元素级运算针对数组每个元素单独计算,如加法、减法等;广播机制允许不同形状数组间运算,通过扩展小数组形状匹配大数组。了解这两点能帮助更好地运用NumPy进行数值计算和数据处理。
|
8天前
|
存储 索引 Python
深入解析NumPy数组的形状与重塑
【4月更文挑战第17天】本文深入解析了NumPy数组的形状和重塑。数组形状是表示数组维度和大小的元组,可通过`shape`属性获取。重塑允许改变数组形状而不改数据,需保证元素总数不变。`reshape`方法用于重塑,其中`-1`可让NumPy自动计算尺寸。注意重塑遵循元素总数相等、仅一次`-1`、内存存储顺序及返回新数组的原则。理解和掌握这些概念对高效使用NumPy处理多维数组至关重要。
|
2月前
|
C++ 索引 Python
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
25 0
|
3月前
|
存储 大数据 索引
【Python】NumPy数组和矢量计算
【1月更文挑战第26天】【Python】NumPy数组和矢量计算
|
3月前
|
C++ Python 索引
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
29 0
Python Numpy入门基础(二)数组操作