ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python+pillow不规则图片合成合并

2021-03-12 10:57:06  阅读:469  来源: 互联网

标签:img tgt python iw dec1 不规则 coords pillow 图片


需求

在这里插入图片描述

大部分查到的图片合成,都是将矩形图片贴到模板上,或者通过权重的方式,将几张图片合成到一张图片上。对于上图这种不规则的图片合成,尝试了两种方法:

  • 方法1:生成一个和模板图同等大小的空图,将目标图片裁切、旋转后贴到空图上,再进行图片的位运算合成。
  • 方法2:利用透视变换,将目标图片裁切后,变换到指定图形,再进行贴图。

从最终实现的结果来看,方法1只适合用于合成区域垂直于视线的场景,效果等同于方法2。方法2则适用面更广一些,可以处理一些复杂的场景。

摘要

技术栈如下:

代码演示:python
图像处理:pillow

演示

在进行处理前,需要先把图片中,将要贴图进去的位置扣掉,保存为png图片,用于后续的贴图。

在这里插入图片描述
这里将贴入空白区域的图片称为目标图片,大图称为模板图片。

import numpy as np
from PIL import Image

def find_coeffs(source_coords, target_coords):
    """
    PIL透视变换转换
    :param source_coords: 源区域点数组,类型数组
    :param target_coords: 目标区域点数组,类型数组
    :return:
    """
    matrix = []
    for s, t in zip(source_coords, target_coords):
        matrix.append([t[0], t[1], 1, 0, 0, 0, -s[0]*t[0], -s[0]*t[1]])
        matrix.append([0, 0, 0, t[0], t[1], 1, -s[1]*t[0], -s[1]*t[1]])
    A = np.matrix(matrix, dtype=np.float)
    B = np.array(source_coords).reshape(8)
    res = np.dot(np.linalg.inv(A.T * A) * A.T, B)
    return np.array(res).reshape(8)


img = Image.open('目标图片')
dec1 = Image.open(‘模板图片’)
dec1 = dec1.convert('RGBA')
img = img_square_pil(img)
iw, ih = img.size
dw, dh = dec1.size
tgt_w, tgt_h = 560, 650    # 目标图片裁切后的宽高。空白区域为矩形,需要裁切图片。
p1, p2, p3, p4 = (357, 395), (804, 510), (708, 1135), (138, 996)  # 空白区域四个点的坐标
img = img.resize((int(iw / (ih / tgt_h)), tgt_h), Image.ANTIALIAS)
iw, ih = img.size
img = img.crop((int((iw - tgt_w) / 2), 0, int((iw - tgt_w) / 2 + tgt_w), tgt_h))
iw, ih = img.size
coeffs = find_coeffs(
    [(0, 0), (iw, 0), (iw, ih), (0, ih)],  # 四个点顺序和下面四个点顺序相同,比如都是顺时针
    [p1, p2, p3, p4]
)
img = img.transform(dec1.size, Image.PERSPECTIVE, coeffs, Image.BICUBIC)
img.paste(dec1, (0, 0, dw, dh), mask=dec1.split()[-1])

效果展示

在这里插入图片描述

在这里插入图片描述




更多功能,或者想体验一下,可以扫下方二维码”:


在这里插入图片描述
主业前端程序猿一枚。图片处理方面,作为业余爱好。如有错误,请各位大佬轻喷,谢谢!!

标签:img,tgt,python,iw,dec1,不规则,coords,pillow,图片
来源: https://blog.csdn.net/weixin_43048291/article/details/114686006

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有