抠图-仿射变换-贴图 简易代码段

抠图-仿射变换-贴图 简易代码段,第1张

抠图-仿射变换-贴图 简易代码段
import cv2
import numpy as np
from PIL import Image
from PIL import ImageDraw


obliq_img = cv2.imread('1.png')  #倾斜影像,新的纹理
rows,cols,_ = obliq_img.shape

# img_texture = cv2.imread('2.png') #原始纹理
img_texture = Image.open('3.png')
print('img_texture.size:', img_texture.size)
width, height= img_texture.size

img_texture = np.array(img_texture)

# 平面方式变换: 仿射变换, 对图像进行变换(三点得到一个变换矩阵)
obliq_triangle = [[345,95],[306,257],[390,263]]
obliq_points = np.float32(obliq_triangle)

texture_triangle = [[255,224],[203,423],[310,428]]
texture_points = np.float32(texture_triangle)
matrix = cv2.getAffineTransform(obliq_points,texture_points) #变换矩阵
img_affine = cv2.warpAffine(obliq_img, matrix, (width, height))  #仿射变换后的图像,提供新的纹理
cv2.imwrite( './affine3.png', img_affine)

#需要替换的原始纹理 mask
# fill_mask = np.array([texture_triangle])
# texture_mask = np.zeros([rows, cols], dtype = np.uint8)
# cv2.fillPoly(texture_mask, fill_mask, 255)
# cv2.imwrite( './mask.png', mask)

new_texture = Image.open('./affine3.png')
print(new_texture.size)

new_texture = np.array(new_texture)
texture_triangle_list = [[[255,224],[203,423],[310,428]], [[270,230],[210,400],[305,390]]]

#Pillow Image: 需要替换的原始纹理 mask
mask = np.zeros((height, width), dtype=np.uint8)
mask = Image.fromarray(mask)

for texture_triangle in texture_triangle_list:
	xy = [tuple(point) for point in texture_triangle]


	draw = ImageDraw.Draw(mask)
	draw.polygon(xy, outline=255, fill=255)

mask.save('./mask4.png')
# for i in range(3):

# result_mask_1 = np.where(mask, new_texture[:,:,0], img_texture[:,:,0])
# result_mask_1 = Image.fromarray(result_mask_1)
# result_mask_2 = np.where(mask, new_texture[:,:,1], img_texture[:,:,1])
# result_mask_2 = Image.fromarray(result_mask_2)
# result_mask_3 = np.where(mask, new_texture[:,:,2], img_texture[:,:,2])
# result_mask_3 = Image.fromarray(result_mask_3)

# merge_result = Image.merge('RGB', (result_mask_1, result_mask_2, result_mask_3))


# # result_mask = result_mask.convert('RGB')
# merge_result.save('./result2.png')

# #遍历替换
# # 在纹理图片中,根据mask的位置替换新的纹理
# for i in range(rows):
# 	for j in range(cols):
# 		if texture_mask[i,j] == 255:  #0代表黑色的点
# 			img_texture[i,j] = img_affine[i,j] #此处替换颜色,为BGR通道, 更新texture

# cv2.imshow('res',img_texture)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5495907.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存