搞这个图片拼接真的是搞了很久,尝试了很多种方法,现在都在这里列举一下,与大家分享一下,相互激励一下彼此吧!!!
首先说明一下:
我的测试图片文件夹是:test_img
,一共六张图片 与py文件同级
(小姐姐是谁,是my sweetheart ,请勿使用,谢谢!!!)
使用说明:
这种方法还算简单,经常会在绘制图的时候使用,但是也可以显示图片,我把它写成只显示两行图片,如果你想要多行,按照下面改一下相关的参数即可
不足之处:
- 不能够无缝拼接,图片之间是有空隙的
优点:
- 不用更改图片的尺寸,图片之间的尺寸大小可以不一致
错误: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() # 调用函数
__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") # 保存新图
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大小一致即可
显示效果:
版权声明,请勿使用我家小可爱
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠