7

ile kopyalama İki tane PIL görüntüsü ve üçgeni oluşturan iki adet karşılık gelen 2B nokta var. ÖrneğinÜçgen görüntü bölgesini PIL

:

image1: 
100x100 pixels 
points = [(10,10), (20,20), (10,20)] 

image2: 
250x250 pixels 
points = [(35,30), (75,19), (50,90)] 

ben Image1 gelen üçgen bölge kopyalayıp IMAGE2 karşılık gelen üçgen bölgeye uyacak şekilde dönüştürmek istiyorum. Piksel ile piksel kopyalamak ve dönüşümü kendim hesaplamak zorunda kalmadan bunu PIL ile yapmanın bir yolu var mı?

cevap

3

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

src_before

bu (üçgen bölge ile doldurulmuş gibi 250x250 görüntü görünüyor hedef beyaz):

dst_before

sonra dönüşümü ve yapıştırdıktan sonra, des tination görüntü aşağıdaki gibidir: üçgen hizaya olmaz

dst_after

+0

Dönüşümü el ile hesaplamak istemediniz mi? – carlosdc

+0

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

0

Bu strateji hala bazı piksel manipülasyon içeren, ama biraz API'lardan yararlanarak

DÜZENLENMİŞ.

  1. Kaynak görüntüyü RGBA biçimine dönüştürür.
  2. Üçgeninizin en küçük çevreleyen dikdörtgeni bulun.
  3. Dikdörtgenin içindeki tüm pikselleri manüel olarak ayarlayın, ancak üçgenin parçası DEĞİL, tamamen şeffaf. (X/y değerlerini, map ve partial kümelerini kullanarak çok fazla sorun yaşamadan bunu yapabilirsiniz.)
  4. Üçgenin en küçük çevreleyen dikdörtgenini hedef görüntüde bulun.
  5. Kaynak kasa dikdörtgeni hedef boyutuna ölçeklendirerek dikdörtgeni hedef görüntüye kopyalayın.
+0

hala bu çalıştığını sanmıyorum IMAGE2 – jterrace

+0

koordinatlar ile Image1 içinde koordine eder. Sadece çeviri ve ölçeğe göre değil, makaslama ve döndürme ile ilgilenir. – jterrace

+0

Sorunuzda bundan bahsetmediniz. Eğer makas ile sapma anlamına gelirse, o zaman sadece hedefe yerleştirirken delta x/y eklemeniz gerekir. Rotasyon için, üçgenin merkezini hesaplayabilir ve daha sonra bu rotasyon formülünü uygulayabilirsiniz: http://stackoverflow.com/questions/6207480/how-to-rotate-a-two-dimensional-array-to-an-arbitrary- degree/6207584 # 6207584 – wberry