Python图像处理之图片拼接和堆叠案例教程

业务说明:

此示例脚本作用,包含方法和逻辑:图像读取,图片尺寸读取,重置图片大小,图片等比缩放,图片拼接,图片覆盖与堆叠(子母图)

图片展示:

单张素材:

origin_image.jpg

result_image.jpg

face_image.jpg

 拼接结果示例图:

拼接和堆叠完成后示例:

拼接和堆叠完成后示例2:

拼接和堆叠完成后示例3: 

代码示例:

import os
import time
from os import listdir
from PIL import Image
from loguru import logger
from PIL import Image

def image_synthesis(mother_img, son_img, save_img, size_data, coefficient=2.5, coordinate=None):
    """
    mother_img="C:/Users/Administrator/Desktop/QRCode/b.jpg",
    son_img="C:/Users/Administrator/Desktop/QRCode/y.png",
    save_img="C:/Users/Administrator/Desktop/QRCode/newimg.png",
    coordinate=None#如果为None表示直接将子图在母图中居中也可以直接赋值坐标
    # coordinate=(50,50)
    :param mother_img: 母图
    :param son_img: 子图
    :param save_img: 保存图片名
    :param size_data: 母图的高
    :param coefficient: 子图相对于母图高度压缩系数
    :param coordinate: 子图在母图的坐标 (50, 100)- (距离Y轴水平距离, 距离X轴垂直距离)
    :return:
    """
    # 将图片赋值,方便后面的代码调用
    M_Img = Image.open(mother_img)
    S_Img = Image.open(son_img)

    # 给图片指定色彩显示格式
    M_Img = M_Img.convert("RGBA")  # CMYK/RGBA 转换颜色格式(CMYK用于打印机的色彩,RGBA用于显示器的色彩)

    # 获取图片的尺寸
    M_Img_w, M_Img_h = M_Img.size  # 获取被放图片的大小(母图)
    logger.info(f"母图尺寸:{M_Img.size}")
    S_Img_w, S_Img_h = S_Img.size  # 获取小图的大小(子图)
    logger.info(f"子图尺寸:{S_Img.size}")

    son_resize_h = size_data / coefficient
    factor = son_resize_h / S_Img_h if son_resize_h > S_Img_h else S_Img_h / son_resize_h  # 子图缩小的倍数1代表不变,2就代表原来的一半
    logger.info(f"子图重置比例: {factor}")
    size_w = int(S_Img_w / factor)
    size_h = int(S_Img_h / factor)

    # 防止子图尺寸大于母图
    if S_Img_w > size_w:
        logger.info(f"防止子图尺寸大于母图")
        S_Img_w = size_w
    if S_Img_h > size_h:
        logger.info(f"防止子图尺寸大于母图")
        S_Img_h = size_h

    # 重新设置子图的尺寸
    icon = S_Img.resize((S_Img_w, S_Img_h), Image.ANTIALIAS)
    logger.info(f"重置后子图尺寸:{(S_Img_w, S_Img_h)}")

    try:
        if not coordinate or coordinate == "":
            w = int((M_Img_w - S_Img_w) / 2)
            h = int((M_Img_h - S_Img_h))
            coordinate = (w, h)
            # 粘贴子图到母图的指定坐标(当前水平居中,垂直靠下)
            M_Img.paste(icon, coordinate, mask=None)
        else:
            logger.info("已经指定坐标")
            # 粘贴子图到母图的指定坐标(指定坐标)
            M_Img.paste(icon, coordinate, mask=None)
    except:
        logger.info("坐标指定出错 ")
    # 保存图片
    M_Img.save(save_img)
    return save_img

def image_stitching(origin_img_path, result_img_path, output_img_path, size_data):
    # 获取当前文件夹中所有JPG图像
    # im_list = [Image.open(fn) for fn in listdir() if fn.endswith('.jpg')]

    origin_data = Image.open(origin_img_path)
    result_data = Image.open(result_img_path)

    M_Img_w, M_Img_h = origin_data.size  # 获取被放图片的大小
    logger.info(f"待拼接图片的原尺寸: {(M_Img_w, M_Img_h)}")

    # 图片转化尺寸(注:此业务中,origin和result均为尺寸比例相同的图片(宽高比相同的图片))
    factor = M_Img_h / size_data if size_data > M_Img_h else size_data / M_Img_h  # 子图缩小的倍数1代表不变,2就代表原来的一半
    size_w = int(M_Img_w / factor)
    logger.info(f"待拼接图片重置尺寸: {(size_w, size_data)}")

    origin_img = origin_data.resize((size_w, size_data), Image.BILINEAR)
    result_img = result_data.resize((size_w, size_data), Image.BILINEAR)

    image_list = [origin_img, result_img]

    # 单幅图像尺寸
    width, height = image_list[0].size
    logger.info(f"--- width = {width}, height = {height}")

    # 创建空白长图
    result = Image.new(image_list[0].mode, (width * len(image_list), height))

    # # 拼接图片
    for i, im in enumerate(image_list):
        result.paste(im, box=(i * width, 0))

    # 保存图片
    result.save(output_img_path)
    return stitching_img_path

if __name__ == '__main__':
    """图片拼接与堆叠合成脚本"""

    # root_path = './1000x966'
    root_path = './500x841'
    # root_path = './1000x667'

    size_data = 1280  # 原图重制尺寸值 TODO 实现图片重制大小的时候按比例进行宽高的缩放
    origin_img_path = os.path.join(root_path, 'origin_image.png')
    result_img_path = os.path.join(root_path, 'result_image.png')
    face_img_path = os.path.join(root_path, 'face_image.png')
    stitching_img_path = os.path.join(root_path, 'stitching_.png')

    # 两图左右拼接
    last_img_path = image_stitching(origin_img_path, result_img_path, stitching_img_path, size_data)
    logger.info(f"左右拼接完成 ---")

    # 覆盖小图片到拼接图居中靠下
    synthesis_img_path = os.path.join(root_path, 'synthesis_.png')
    res = image_synthesis(last_img_path, face_img_path, synthesis_img_path, size_data,
                          # coordinate=(100, 500)
                          )
    logger.info(f"--- end --- res = {res}")

到此这篇关于Python图像处理之图片拼接和堆叠案例教程的文章就介绍到这了,更多相关Python图像处理之图片拼接和堆叠内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    图像素描特效 图像素描特效主要经过以下几个步骤: 调用cv.cvtColor()函数将彩色图像灰度化处理: 通过cv.GaussianBlur()函数实现高斯滤波降噪: 边缘检测采用Canny算子实现: 最后通过cv.threshold()反二进制阈值化处理实现素描特效. #coding:utf-8 import cv2 as cv import numpy as np #读取原始图像 img = cv.imread('d:/paojie.png') #图像灰度处理 gray = cv.cvtC

  • 2021年最新用于图像处理的Python库总结

    一.OpenCV OpenCV是最著名和应用最广泛的开源库之一,用于图像处理.目标检测.人脸检测.图像分割.人脸识别等计算机视觉任务.除此之外,它还可以用于机器学习任务. 这是英特尔在2002年开发的.它是用C++编写的,但是开发人员已经提供了Python和java绑定.它易于阅读和使用. 为了建立计算机视觉和机器学习模型,OpenCV有超过2500种算法.这些算法对于执行各种任务非常有用,例如人脸识别.目标检测等.让我们看一些可以使用OpenCV执行的示例: 灰度缩放 灰度缩放是一种将3通道图

  • 基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人距离较近时,则会被判定车辆为未礼让行人. 结果示例 实验流程 先通过视频截取一张图片来进行测试,如果结果满意之后再嵌套到视频中,从而达到想要的效果. 1.预处理(灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀)> 根据自己的需求来修改一些值 #灰度值转换 imgGray = cv2.cvtColor

  • python数字图像处理之估计噪声参数

    估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的. 只能使用由传感器生成的图像时,可由一小片恒定的背景灰度来估计PDF的参数. 来自图像条带的数据的最简单用途是,计算灰度级的均值和方差.考虑由 S S S表示的一个条带(子图像),并令 P S ( z i ) P_{S}(z_i) PS​(zi​), i = 0 , 1 , 2 , - , L − 1 i = 0, 1, 2, \dots, L-1 i=0,1,2,-,L−1表示 S S S中的像素灰度的概率估计(归一化直方图值)

  • python图像处理基本操作总结(PIL库、Matplotlib及Numpy)

    一.PIL库对图像的基本操作 1.读取图片 PIL网上有很多介绍,这里不再讲解.直接操作,读取一张图片,将其转换为灰度图像,并打印出来. from PIL import Image import matplotlib.pyplot as plt pil_im = Image.open("empire.jpeg") pil_image = pil_im.convert("L") plt.gray() plt.imshow(pil_image) plt.show() 输

  • Python图像处理之图像拼接

    一.前言 图像拼接技术就是将数张有重叠部分的图像(可能是不同时间.不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术. 二.特征点匹配 特征点具有局部差异性 动机:特征点具有局部差异性 图像梯度 Harris矩阵 以每个点为中心取一个窗口,窗口大小为55或者77,如果这个点具有差异性,往周围任意方向移动,周围的环境变化都是会比较大的,如果满足这个特性,我们就认为这个特征点具有明显的局部差异性.在工事中,I表示像素,如果是 彩色图像就是RGB,灰色图像就是灰度.(u,v)表示方

  • Python图像处理之膨胀与腐蚀的操作

    引言 膨胀与腐蚀是图像处理中两种最基本的形态学操作,膨胀将目标点融合到背景中,向外部扩展,腐蚀与膨胀意义相反,消除连通的边界,使边界向内收缩.在本文中我们将了解使用内核的图像膨胀与腐蚀的基本原理. 让我们开始吧,同样我们需要导入必需的库. import numpy as np import matplotlib.pyplot as plt from skimage.io import imread, imshow from skimage.draw import circle from skim

  • Python图像处理之图片拼接和堆叠案例教程

    业务说明: 此示例脚本作用,包含方法和逻辑:图像读取,图片尺寸读取,重置图片大小,图片等比缩放,图片拼接,图片覆盖与堆叠(子母图) 图片展示: 单张素材: origin_image.jpg result_image.jpg face_image.jpg  拼接结果示例图: 拼接和堆叠完成后示例: 拼接和堆叠完成后示例2: 拼接和堆叠完成后示例3:  代码示例: import os import time from os import listdir from PIL import Image f

  • Python爬虫之Scrapy环境搭建案例教程

    Python爬虫之Scrapy环境搭建 如何搭建Scrapy环境 首先要安装Python环境,Python环境搭建见:https://blog.csdn.net/alice_tl/article/details/76793590 接下来安装Scrapy 1.安装Scrapy,在终端使用pip install Scrapy(注意最好是国外的环境) 进度提示如下: alicedeMacBook-Pro:~ alice$ pip install Scrapy Collecting Scrapy Usi

  • Python三种打包exe方法案例教程

    cxfreeze,pyinstaller,py2exe三种方式 目前网上能获取的免费的Python打包工具主要有三种:py2exe.PyInstaller和cx_Freeze.其中PyInstaller最新版只支持Python2.7,py2exe计划开发支持python3.x版本,但是目前还没有完成.只有cx_Freeze支持python3.X版本,也支持python2.X版本.个人也觉得cxfreeze比较简单,不容易出错. cxfreeeze有几种文件形式,msi和whl.msi是安装包,直

  • python之django路由和视图案例教程

    django路由和视图 要了解django是如何运行的,首先要了解路由和视图两个概念,然后我们在项目中添加一些简单的路由和视图 路由和视图的概念 视图:一个视图函数(类),简称视图,是一个简单的Python一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应. 个人觉得django视图的概念其实是spring中的

  • python之OpenCV的作用以及安装案例教程

    OpenCV的作用及安装 OpenCV简介 OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.提供了Python.Ruby.MATLAB等语言的接口,并且实现了图像处理和计算机视觉方面的很多通用算法,可以给开发者调用. OpenCV应用领域 计算机视觉领域方向 人机互动 物体识别 图像分割 人脸识别 动作识别 运动跟踪 机器人 运动分析 机器视觉 结构分析 汽车安全驾驶 OpenCV涉及的技术 图像数据的操作: 分配.释放.

  • Python基础之标准库和常用的第三方库案例教程

    Python基础:标准库和常用的第三方库 Python的标准库有: 名称 作用 datetime 为日期和时间处理同时提供了简单和复杂的方法. zlib 直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile. random 提供了生成随机数的工具. math 为浮点运算提供了对底层C函数库的访问. sys 工具脚本经常调用命令行参数.这些命令行参数以链表形式存储于 sys 模块的 argv 变量. glob 提供了一个函数用于从目录通配符搜索中生成文

  • python之PySide2安装使用及QT Designer UI设计案例教程

    pyside2  >>> pip install pyside2  QT Designer >>> pip show pyside2 Location: c:\users\Administrator\appdata\roaming\python\python39\site-packages 文件位置 C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages\PySide2\designer.

  • python利用numpy存取文件案例教程

         NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. numpy格式的文件可以保存为后缀为(.npy/.npz)格式的文件 1. tofile()和fromfile() tofile()将数组中的数据以二进制格式写进文件 tofile()输出的数据不保存数组形状和元素类型等信息 fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改 import

  • Python图像处理之简单画板实现方法示例

    本文实例讲述了Python图像处理之简单画板实现方法.分享给大家供大家参考,具体如下: Python图像处理也是依赖opencv的Python接口实现的,Python语言简单易懂,简洁明了.本次实现画板涂鸦,一个是在里面画矩形,还有画线.其他也都可以扩展,本案例只做例程,思路是对鼠标事件的处理,以及滚动条调节颜色处理.鼠标事件就包含有左键按下,以及释放事件的处理. import cv2 import numpy as np # null function def nothing(x): pass

  • Python图像处理模块ndimage用法实例分析

    本文实例讲述了Python图像处理模块ndimage用法.分享给大家供大家参考,具体如下: 一 原始图像 1 代码 from scipy import misc from scipy import ndimage import matplotlib.pyplot as plt face = misc.face()#face是测试图像之一 plt.figure()#创建图形 plt.imshow(face)#绘制测试图像 plt.show()#原始图像 2 运行结果 二 高斯滤波 1 代码 fro

随机推荐