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")

显示效果:
python最全的图像拼接_第1张图片

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

显示效果:
python最全的图像拼接_第2张图片

__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")  # 保存新图

python最全的图像拼接_第3张图片

三、直接通过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大小一致即可
显示效果:
python最全的图像拼接_第4张图片
python最全的图像拼接_第5张图片

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

在这里插入图片描述



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

你可能感兴趣的:(9—opencv-python,Pillow图像处理)