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

首先说明一下:
我的测试图片文件夹是: 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")

显示效果:
python最全的图像拼接

二、用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, i
height))


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

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)   # <class 'PIL.Image.Image'> (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/")

显示效果:
python最全的图像拼接

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()  # 调用函数

显示效果:
python最全的图像拼接


码字不易,且看且珍惜!

python最全的图像拼接支付宝收款码
python最全的图像拼接微信收款码

如果你热衷技术,想寻找志同道合的伙伴,欢迎加入我们!

python最全的图像拼接微信交流
python最全的图像拼接QQ技术交流群

相关文章: