python最全的图像拼接

您所在的位置:网站首页 图片怎么可以拼接一起 python最全的图像拼接

python最全的图像拼接

2024-07-10 01:20| 来源: 网络整理| 查看: 265

python最全的图像拼接文章目录: 一、用matplotlib实现图像的拼接二、用PIL实现图像的拼接1、PIL实现长图的拼接2、PIL实现照片墙拼接 三、直接通过numpy 进行数组值的拼接

搞这个图片拼接真的是搞了很久,尝试了很多种方法,现在都在这里列举一下,与大家分享一下,相互激励一下彼此吧!!!

首先说明一下: 我的测试图片文件夹是: test_img,一共六张图片 与py文件同级 (小姐姐是谁,是my sweetheart ,请勿使用,谢谢!!!)

一、用matplotlib实现图像的拼接

使用说明:

这种方法还算简单,经常会在绘制图的时候使用,但是也可以显示图片,我把它写成只显示两行图片,如果你想要多行,按照下面改一下相关的参数即可 不足之处:

不能够无缝拼接,图片之间是有空隙的

优点:

不用更改图片的尺寸,图片之间的尺寸大小可以不一致 错误:https://cuiqingcai.com/1707.html """ __Author__ = 'Shliang' from PIL import Image import matplotlib.pyplot as plt import os import re def plt_images_wall(img_path): imgs_path = [] imgs_name = os.listdir(img_path) for img in imgs_name: imgs_path.append(os.path.join(img_path + "/", img)) if int(len(imgs_path) / 2) != 0: # 想要显示多行图片更改一下就可以 for i in range(len(imgs_path)): print(int(str(2) + str(int(len(imgs_path) / 2)) + str(i + 1))) # 引入正则是为了解决浮点数的错误问题 tmp = str(int(len(imgs_path) / 2)) tmp = re.match("[0-9]", tmp) tmp = tmp.string plt.subplot(int(str(2) + str(tmp) + str(i + 1))) plt.title("image" + str((i + 1))) plt.axis("off") # 如果想要显示坐标轴,把这行代码注释即可 plt.imshow(Image.open(imgs_path[i])) plt.savefig("plt_wall.jpg") plt.show() if __name__ == "__main__": plt_images_wall("test_img")

显示效果: 在这里插入图片描述

二、用PIL实现图像的拼接 1、PIL实现长图的拼接

使用说明:

1、读取文件夹下所有的“.jpg”图片,当然你也可以读取其他图片 2、用PIL把每一个图片数据读到images列表中 3、创建一个空白长图 result = Image.new(images[0].mode, (width, heightlen(images)), color=0) # 默认填充一张图片的像素值是黑色,当然你也可以设置“red”色,或其他色,但是没有必要,我们要的就是一张贴图片的“墙” 4、把图片贴到“墙”上 result.paste(img, box=(0, iheight))

注意: 如果图片比设定的空白图片大,就会出现一部分图片贴出去了,所以你才会干酒有部分图片贴出去了,如果比设定的空白图片小,就会看到“墙壁”的颜色,懂了吧,所以最好的方式是刚刚好!!!

def long_img(imgs_path): root = "test_img/" imgs = [] images = [] # 获取当前文件夹中的所有jpg图像 # imgs = [Image.open(fn) for fn in os.listdir(imgs_path) if fn.endswith('.jpg')] for img_name in os.listdir(imgs_path): if img_name.endswith(".jpg"): imgs.append(os.path.join(root, img_name)) print("======", imgs) for img in imgs: image = Image.open(img) images.append(image) print(images) # 单幅图像尺寸 width, height = images[0].size width, height = images[0].resize((500, 500)).size # 创建空白长图 result = Image.new(images[0].mode, (width, height*len(images)), color=0) # 默认填充一张图片的像素值是黑色 print(type(result), result.size) # (500, 3000) # 拼接 for i, img in enumerate(images): img = img.resize((500, 500)) result.paste(img, box=(0, i*height)) # 把每一张img粘贴到空白的图中,注意,如果图片的宽度大于空白图的长度 result.save("result_long_img.jpg") if __name__ == "__main__": long_img("test_img/")

显示效果: 在这里插入图片描述

2、PIL实现照片墙拼接

使用说明:

你可以通过设置,只显示行或者只显示列都是可以的

import PIL.Image as Image import os IMAGES_PATH = 'test_img/' # 图片集地址 IMAGES_FORMAT = ['.jpg', '.JPG'] # 图片格式 IMAGE_SIZE = 256 # 每张小图片的大小 IMAGE_ROW = 2 # 图片间隔,也就是合并成一张图后,一共有几行 IMAGE_COLUMN = 3 # 图片间隔,也就是合并成一张图后,一共有几列 # 获取图片集地址下的所有图片名称 image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if os.path.splitext(name)[1] == item] print(image_names) # 简单的对于参数的设定和实际图片集的大小进行数量判断 if len(image_names) != IMAGE_ROW * IMAGE_COLUMN: raise ValueError("合成图片的参数和要求的数量不能匹配!") # 定义图像拼接函数 def image_compose(): to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) # 创建一个新图 # 循环遍历,把每张图片按顺序粘贴到对应位置上 for y in range(1, IMAGE_ROW + 1): for x in range(1, IMAGE_COLUMN + 1): from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1]).resize( (IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS) to_image.paste(from_image, ((x - 1) * IMAGE_SIZE, (y - 1) * IMAGE_SIZE)) return to_image.save("result.jpg") # 保存新图 if __name__ == "__main__": image_compose() # 调用函数

显示效果: 在这里插入图片描述

__Author__ = 'Shliang' import PIL.Image as Image from PIL import Image, ImageDraw, ImageFont import os IMAGES_PATH = 'test1/' # 图片集地址 IMAGES_FORMAT = ['.jpg', '.JPG'] # 图片格式 IMAGE_SIZE = 256 # 每张小图片的大小 IMAGE_ROW = 1 # 图片间隔,也就是合并成一张图后,一共有几行 IMAGE_COLUMN = 3 # 图片间隔,也就是合并成一张图后,一共有几列 # 获取图片集地址下的所有图片名称 image_names = [name for name in os.listdir(IMAGES_PATH) for item in IMAGES_FORMAT if os.path.splitext(name)[1] == item] print(image_names) # 简单的对于参数的设定和实际图片集的大小进行数量判断 if len(image_names) != IMAGE_ROW * IMAGE_COLUMN: raise ValueError("合成图片的参数和要求的数量不能匹配!") image_heiht, image_width = Image.open(IMAGES_PATH + image_names[0]).size # 定义图像拼接函数 def image_compose(): # to_image = Image.new('RGB', (IMAGE_COLUMN * IMAGE_SIZE, IMAGE_ROW * IMAGE_SIZE)) # 创建一个新图 to_image = Image.new('RGB', (IMAGE_COLUMN * image_heiht, IMAGE_ROW * image_width)) # 创建一个新图 text = ["原图", "增强亮度", "增强对比度", "锐化"] # 循环遍历,把每张图片按顺序粘贴到对应位置上 for y in range(1, IMAGE_ROW + 1): for x in range(1, IMAGE_COLUMN + 1): from_image = Image.open(IMAGES_PATH + image_names[IMAGE_COLUMN * (y - 1) + x - 1])#.resize((IMAGE_SIZE, IMAGE_SIZE), Image.ANTIALIAS) # typeface = ImageFont.truetype('xindexingcao57.ttf', 60) # 参数: 字体 字体大小 draw = ImageDraw.Draw(from_image) typeface = ImageFont.truetype('STKAITI.TTF', 40) # 参数: 字体 字体大小 STXINGKA.TTF draw.text((20,550), image_names[IMAGE_COLUMN * (y - 1) + x - 1] , fill=(255, 0, 0), font=typeface) to_image.paste(from_image, ((x - 1) * image_heiht, (y - 1) * image_width)) return to_image.save("result_smooth_white.jpg") # 保存新图

在这里插入图片描述

三、直接通过numpy 进行数组值的拼接 import cv2 import numpy as np img1 = cv2.imread("lover.jpg") img2 = cv2.imread("lover.jpg") img3 = cv2.imread("lover.jpg") heng = np.hstack((img1, img2, img3)) img4 = cv2.imread("lover.jpg") img5 = cv2.imread("lover.jpg") img6 = cv2.imread("lover.jpg") shu = np.vstack((img4, img5, img6)) cv2.imwrite("hstack.jpg", heng) cv2.imwrite("vstack.jpg", shu) cv2.imshow("hstack", heng) cv2.imshow("vstack", shu) cv2.waitKey(0)

循环读取大家自己写吧,我就不搞了,记得图片的resize大小一致即可 显示效果: 在这里插入图片描述 在这里插入图片描述

版权声明,请勿使用我家小可爱

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3