python+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