2016-03-31 20 views
0

28x22 boyutunda bir matrisim var. İlk satır, son iki satır, ilk sütun ve son iki sütun (kırmızı ve yeşil renkle işaretlenmiştir) boştur. Bu sütun ve satırların bicubik enterpolasyon ile doldurulması gerekiyor.Bicubic enterpolasyonunu kullanarak bir matrisin sınırlarını doldurun

SO ve internette bicubic enterpolasyon ile ilgili birkaç yazı okudum ama maalesef bunu anlayamıyorum. Ayrıca, bikubik enterpolasyonun, enterpolasyona ihtiyaç duyulan piksel etrafında 4x4 ızgarası bilgisine ihtiyacı olduğunu okudum. Ancak, satırlar ve sütunlar sınırlandığından, çevremde 4 x 4 ızgaram yok.

image

+0

Eğer extrapolasyon yerine enterpolasyon için bakmak gerekir (Btw güzel Lena Simge avatar) – Spektre

+0

@Spektre: teşekkürler – skm

cevap

1

Prologue

bilinmeyen alanları tahmin etmek gerekir. Verileri tahmin etmek istediğiniz bilgilerden karar vermeniz gerekir. Örneğin, unknonw alanının yakınındaki noktaları kullanmak veya bilinen tüm alan boyunca dağılmış noktaları kullanmak istersiniz. Her iki yaklaşım da geçerlidir ancak farklı ihtiyaçları karşılayan farklı sonuçlara sahiptir.

Bilinmeyen bölgeye yakın noktaları kullanıyorum. Beni daha basit vaka ile başlayalım:

doğrusal tahmini 2 bilinen noktalar oluşturduğu çizgiyi kullanan

  1. 1D doğrusal tahmini. bu nedenle, örneğin, bu vektör varsayalım:

    1D linear extrapolation

    x ekseni vektör/dizi indeksi ve y ekseni hücre değeridir. Bu yüzden 2 bilinen son noktayı (mavi) aldım ve ondan bir çizgi oluşturdum (yeşil). Bir sonraki dizi konumlarını kesiştiği yerde, tahmin ettiğiniz değerler (kırmızı) vardır. Yani C++ o şuna benzer:

    float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown) 
    a[6]=a[4]+((a[5]-a[4])*2.0); // =4.0 
    a[7]=a[4]+((a[5]-a[4])*3.0); // =1.0 
    
  2. 1D kübik ekstrapolasyon

    O 1. benzer ancak bunun yerine hattın Eğer parametrik polinom formda 4 kontrol noktası kübik eğri kullanın. Kübik eğrilerin çoğu, t=0 parametresi ile ikinci kontrol noktası elde edersiniz ve eğer t=1 üçüncü kontrol noktası elde edersiniz. t=<0,1>'u kullanırsanız, aralarında sorunsuz bir şekilde yinelemeniz gerekir. Bir sonraki nokta için, t>=3 numaralı adımdan sonra, bir sonraki nokta pozisyonu için 1 adımı ile aralığı genişletmeliyiz. Yani:

    1D cubic extrapolation

    float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown) 
    float a0,a1,a2,a3; // your cubic curve polynomial coefficients (computed from 4 control points a[2],a[3],a[4],a[5]) 
    float t; // curve parameter 
    // here compute the a0,a1,a2,a3 
    t=3.0; a[6]=a0+a1*t+a2*t*t+a3*t*t*t*t; 
    t=4.0; a[7]=a0+a1*t+a2*t*t+a3*t*t*t*t; 
    

    Şimdi nasıl a0,a1,a2,a3 katsayılarını elde etmek? Herhangi bir enterpolasyon polinomunu kullanabilirsin.

    Yani burada

    (bir [2 + i] ile pi değiştirirken ederken bazı aptal endeks hata vermedi umut) olan: Benim favori Bu (mermi 3.) 'dir:

    float d1,d2; 
    d1=0.5*(a[4]-a[2]); 
    d2=0.5*(a[5]-a[3]); 
    a0=a[3]; 
    a1=d1; 
    a2=(3.0*(a[4]-a[3]))-(2.0*d1)-d2; 
    a3=d1+d2+(2.0*(-a[4]+a[3])); 
    
  3. 2D Bi-kübik ekstrapolasyon

    Bu, yalnızca sorunu 1D kübik ekstrapolasyonlara ayırıyor.

    2D bi-cubic extrapolation

    Bunun için ilk önce (ki yapabilirsiniz) bilinmeyen sütunları hesaplamak ve sonra ondan eksik satırları hesaplamak: Eğer # gelen grafikler bakarsak size yukarıdan 2 bu iki küp için göreceksiniz (ya da tam tersi).

+0

thanks..I upvoted. – skm

İlgili konular