Bunu afine dönüşümü ile yapabildim (this question sayesinde). Afin dönüşümünden sonra, hedef üçgen bir maskeye çekilir ve daha sonra hedef görüntüye yapıştırılır.
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)
100x100 görüntü (beyaz bindirilmiş üçgen) şöyle kaynak: Burada ben ile geldi ne
bu (üçgen bölge ile doldurulmuş gibi 250x250 görüntü görünüyor hedef beyaz):
sonra dönüşümü ve yapıştırdıktan sonra, des tination görüntü aşağıdaki gibidir: üçgen hizaya olmaz
Dönüşümü el ile hesaplamak istemediniz mi? – carlosdc
Evet, ancak bunu PIL ile yapmanın bir yolu yoktu.Başvurulan gönderiden formülü aldığım için çok fazla sorun çıkmadı ve numpy, benim için denklem sistemini çözdü. Önlemek istediğim şey, piksel pikselini kopyalamaktı. – jterrace