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 redef 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.stringplt.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, 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].sizewidth, 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/")

显示效果:

2、PIL实现照片墙拼接

使用说明:

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

import PIL.Image as Image
import osIMAGES_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 ifos.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, ImageFontimport osIMAGES_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 ifos.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.TTFdraw.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 npimg1 = 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最全的图像拼接相关推荐

  1. PYTHON高级全栈开发工程师-老男孩教育

    PYTHON高级全栈开发工程师 最近开班日期:2016年4月17号                               课程周期:4至4.5个月 学习方式:全脱产面授学习(周一至周五,早9:3 ...

  2. python sanic orm_Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践

    SanicCRUD-vue Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践 背景 本项目将使用Sanic + Vue2 + Webpack2 配合最简单CRUD的逻辑来展示一个 ...

  3. Python机器学习全流程项目实战精讲(2018版)

    Python机器学习全流程项目实战精讲(2018版) 网盘地址:https://pan.baidu.com/s/16SSVq74YC07M0dW1iDekPg 提取码: vu7r 备用地址(腾讯微云) ...

  4. 零基础学python书籍-图书推荐:《零基础学Python(全彩版)》

    原标题:图书推荐:<零基础学Python(全彩版)> 书皮 书皮 内容简介 <零基础学 Python>是针对零基础编程学习者研发的 Python 入门教程.从初学者角度出发,通 ...

  5. python训练过程是什么_学了这么久,你知道Python机器学习全流程是怎样的么?

    今天呢,小编就带大家了解一下Python机器学习全流程 首先介绍一下机器学习的概念和地位,和其他的区别是? 机器学习的核心任务是? 机器学习的全流程是? 我们将上述流程拆解出来看: 1.需求来源是?需 ...

  6. Python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程

    python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程 Python高级全栈开发实战老男孩课程,是可以帮助同学们从零基础开始到项目开发实战的全栈课程,内容非 ...

  7. python很全的爬虫入门教程

    python很全的爬虫入门教程 一.爬虫前的准备工作 首先,我们要知道什么是爬虫 1.什么是网络爬虫? 网络爬虫是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁 ...

  8. 零基础学python pdf-零基础学Python PDF 全彩影印版

    给大家带来的一篇关于python编程相关的电子书资源,介绍了关于零基础学Python.明日科技方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小314 MB,明日科技编写,目前豆瓣.亚马逊 ...

  9. 2w字Python列表,全了!

    2w字Python列表,全了! 即使再小的帆也能远航~ 一.目录 序列 1.1 索引 1.2 切片 1.3 序列相加 1.4 乘法(Multiplying) 1.5 检查某个元素是否是序列的成员(元素 ...

最新文章

  1. 解决Windows10下无法对docker容器进行端口访问(端口映射的问题)
  2. Redis:事件驱动(IO多路复用)
  3. Windows中启动Redis走配置文件的bat脚本
  4. 【经验分享】来到新公司,我所遇到的三重障碍
  5. SpringBoot FK-关联表查询(三)
  6. Html中的map标签
  7. vim 环境写 markdown 的插件推荐
  8. c语言用字符串统计一个整数中数字的个数_全国计算机等级考试二级C语言
  9. Android 系统(146)----Android进程保活招数概览
  10. 高阻态是0还是1_羽毛球拍穿线,先拉横线还是竖线?是否横线要比竖线高1到2磅?...
  11. lumion自动保存_Lumion所有快捷键,值得收藏
  12. (秒杀项目) 4.9 削峰限流与防刷(核心)
  13. 2021 CVPR | 基于渐进感受局部区域推理的全方位监督点云分割
  14. 1030: [JSOI2007]文本生成器
  15. TF,数据转换和softmax()
  16. node.js连接数据库写接口
  17. 计算机中1kb等于多少字节,1mb等于多少kb
  18. 使用GerberTools的Gerber Panelizer工具进行gerber文件拼板的方法
  19. 程序员健身不完全指南
  20. 华为nova青春版是html手机吗,华为Nova青春版这款手机作为新青年良品:麒麟935+4G+64GB+18W快充...

热门文章

  1. Exif Editor For Mac(图像EXIF编辑器软件)
  2. openharmony容器组件之Refresh
  3. 按键精灵电脑版对接百度ai,告别字库(文字识别篇)
  4. AMR中的RO,RW和ZI
  5. Premiere Pro 快捷键大全(2023版)
  6. Webmin未经身份验证的远程代码执行
  7. 内存不能读写问题解决方案
  8. 关于汽油清洁剂,到底该不该加
  9. WINCE 实用技巧 之 创建快捷方式详解
  10. Git 远程篇之查看远程仓库信息