python最全的图像拼接 |
您所在的位置:网站首页 › pyq的照片怎么原图 › python最全的图像拼接 |
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")显示效果: 使用说明: 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/")显示效果: 使用说明: 你可以通过设置,只显示行或者只显示列都是可以的 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() # 调用函数显示效果: 循环读取大家自己写吧,我就不搞了,记得图片的resize大小一致即可 显示效果: 版权声明,请勿使用我家小可爱
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |