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()
抠图-仿射变换-贴图 简易代码段
最新推荐文章于 2023-02-05 11:48:57 发布
本文介绍如何通过OpenCV和Pillow库实现图像仿射变换,将倾斜的纹理应用到原始图片上。作者展示了如何计算变换矩阵并使用它来调整纹理,以匹配图像的特定区域。最后,通过mask操作实现纹理的精确替换。
摘要由CSDN通过智能技术生成