어파인 변형으로이 작업을 수행 할 수있었습니다 (this question 덕택에). 아핀 변환 후 대상 삼각형이 마스크로 그려지고 대상 이미지에 붙여 넣어집니다.
import Image
import ImageDraw
import numpy
def transformblit(src_tri, dst_tri, src_img, dst_img):
((x11,x12), (x21,x22), (x31,x32)) = src_tri
((y11,y12), (y21,y22), (y31,y32)) = dst_tri
M = numpy.array([
[y11, y12, 1, 0, 0, 0],
[y21, y22, 1, 0, 0, 0],
[y31, y32, 1, 0, 0, 0],
[0, 0, 0, y11, y12, 1],
[0, 0, 0, y21, y22, 1],
[0, 0, 0, y31, y32, 1]
])
y = numpy.array([x11, x21, x31, x12, x22, x32])
A = numpy.linalg.solve(M, y)
src_copy = src_img.copy()
srcdraw = ImageDraw.Draw(src_copy)
srcdraw.polygon(src_tri)
src_copy.show()
transformed = src_img.transform(dst_img.size, Image.AFFINE, A)
mask = Image.new('1', dst_img.size)
maskdraw = ImageDraw.Draw(mask)
maskdraw.polygon(dst_tri, fill=255)
dstdraw = ImageDraw.Draw(dst_img)
dstdraw.polygon(dst_tri, fill=(255,255,255))
dst_img.show()
dst_img.paste(transformed, mask=mask)
dst_img.show()
im100 = Image.open('test100.jpg')
im250 = Image.open('test250.jpg')
tri1 = [(10,10), (20,20), (10,20)]
tri2 = [(35,30), (75,19), (50,90)]
transformblit(tri1, tri2, im100, im250)
100 × 100 이미지 (흰색에 중첩 삼각형)과 같다 출처 : 여기에 내가 무엇을 최대 온의
이 (삼각 지역으로 채워처럼 250x250 크기의 이미지가 보이는 대상 흰색)
그리고 변환 붙이기 후, 데스 큐틴 이미지는 다음과 같습니다 삼각형을 줄 수 없습니다
변형을 수동으로 계산하고 싶지 않습니까? – carlosdc
네,하지만 PIL로 그렇게 할 수있는 것처럼 보이지 않았습니다.참조 된 게시물에서 수식을 얻었으므로 numpy는 나를위한 방정식 시스템을 해결하기 때문에 너무 많은 문제가 아니 었습니다. 내가 정말로 피하고 싶었던 것은 픽셀 단위로 복사하는 것이 었습니다. – jterrace