Witam towarzystwo serdecznie!

Mam problem z interpolacja dwuliniową:

otóż powiększając plik wielkości 2x2 oto on (w powiększeniu):
http://levik.pl/pliki/interpolacja/wejscie.jpg

do 200x200 mam otrzymać taki wynik:
http://levik.pl/pliki/interpolacja/wynik_true.jpg

ja natomiast dostaję coś takiego:
http://levik.pl/pliki/interpolacja/wynik_false.jpg

(można zauważyć, że w pierwszej ćwiartce wynik jest ok, a w pozostałych jest po prostu odwrócony)

Algorytm interpolacji:

  1. Wyznacz położenie punktu Pwe = (xwe, ywe) w przestrzeni obrazu pierwotnego
  2. Wyznacz indeksy piksela podstawowego A: j = int(xwe), i = int(ywe)
  3. Weź atrybuty pikseli: A, B=(i,j+1,), C=(i+1,j), D=(i+i,j+1)
  4. Wyznacz współczynniki interpolacji α = xwe – j, β=ywe-i
  5. Wylicz częściowe wartości atrybutów uzywając interpolacji względem α
    XAB= αB +(1- α)A, XCD= αD +(1- α)C
  6. Wylicz końcową wartość atrybutu:
    X= βXCD +(1- β)XAB,
  7. Zapisz w pikselu obrazu wynikowego atrybuty wzięte z piksela na pozycji (i,j) obrazu pierwotnego

Kod:

Matrix3x3reversMatrix=newMatrix3x3();
try{
    reversMatrix.value=Matrix3x3.inverse(mainMatrix.value);
}catch(Exceptione1){
    JOptionPane.showMessageDialog(frame,"Wyznacznik równy 0,albo coś jeszcze gorszego!","Błąd",JOptionPane.ERROR_MESSAGE);
}

//mnożenie każdego punktu tymczasowego obrazu wyjsciowego przezmacierz odwrotna względem macierzy transformacji
for(int i=0;i<rasterImage.getHeight();i++)
    for(int j=0;j<rasterImage.getWight();j++)
        rasterImage.getPixel(j,i).position=Matrix3x3.mul(rasterImage.getPixel(j,i).position,reversMatrix.value);

for(int i=0;i<rasterImage.getHeight();i++)
    for(int j=0;j<rasterImage.getWight();j++){

        double we_x=rasterImage.getPixel(j,i).getX();
        double we_y=rasterImage.getPixel(j,i).getY();
        
        //jeśli piksel jest poza obszarzem np. po przesunięciu ustawiamy jego kolor na kolor tła (biały)
        if( we_x<0 || we_x>rasImage.getWidth() || we_y<0 || we_y>rasImage.getHeight()){
            image.setRGB(j,i,newColor(255,255,255).getRGB());
            continue;
        }

        Color pkt_a,pkt_b,pkt_c,pkt_d;

        //Dobieranie sąsiednich pixel'i
        if(we_x+1<rasImage.getWidth()){
            if(we_y+1<rasImage.getHeight()){
                pkt_a=newColor(rasImage.getRGB((int)we_x,(int)we_y));
                pkt_b=newColor(rasImage.getRGB((int)we_x+1,(int)we_y));
                pkt_c=newColor(rasImage.getRGB((int)we_x,(int)we_y+1));
                pkt_d=newColor(rasImage.getRGB((int)we_x+1,(int)we_y+1));        
            }else{
                pkt_a=newColor(rasImage.getRGB((int)we_x,(int)we_y));
                pkt_b=newColor(rasImage.getRGB((int)we_x+1,(int)we_y));
                pkt_c=newColor(rasImage.getRGB((int)we_x,(int)we_y-1));
                pkt_d=newColor(rasImage.getRGB((int)we_x+1,(int)we_y-1));
            }
        }else{
            if(we_y+1<rasImage.getHeight()){
                pkt_a=newColor(rasImage.getRGB((int)we_x,(int)we_y));
                pkt_b=newColor(rasImage.getRGB((int)we_x-1,(int)we_y));
                pkt_c=newColor(rasImage.getRGB((int)we_x,(int)we_y+1));
                pkt_d=newColor(rasImage.getRGB((int)we_x-1,(int)we_y+1));
            }else{
                pkt_a=newColor(rasImage.getRGB((int)we_x,(int)we_y));
                pkt_b=newColor(rasImage.getRGB((int)we_x-1,(int)we_y));
                pkt_c=newColor(rasImage.getRGB((int)we_x,(int)we_y-1));
                pkt_d=newColor(rasImage.getRGB((int)we_x-1,(int)we_y-1));
            }
        }
        
        //Obliczanie interpolacji
        double alfa=we_x-(int)we_x;
        double beta=we_y-(int)we_y;
        //---
        double wsp_ab_red=(1-alfa)*pkt_a.getRed()+alfa*pkt_b.getRed();
        double wsp_cd_red=(1-alfa)*pkt_c.getRed()+alfa*pkt_d.getRed();

        double wsp_ab_green=(1-alfa)*pkt_a.getGreen()+alfa*pkt_b.getGreen();
        double wsp_cd_green=(1-alfa)*pkt_c.getGreen()+alfa*pkt_d.getGreen();

        double wsp_ab_blue=(1-alfa)*pkt_a.getBlue()+alfa*pkt_b.getBlue();
        double wsp_cd_blue=(1-alfa)*pkt_c.getBlue()+alfa*pkt_d.getBlue();
        //---
        double wsp_pkt_red=(1-beta)*wsp_ab_red+beta*wsp_cd_red;

        double wsp_pkt_green=(1-beta)*wsp_ab_green+beta*wsp_cd_green;

        double wsp_pkt_blue=(1-beta)*wsp_ab_blue+beta*wsp_cd_blue;
        //---
        int wsp_red=(int)Math.round(wsp_pkt_red);

        int wsp_green=(int)Math.round(wsp_pkt_green);

        int wsp_blue=(int)Math.round(wsp_pkt_blue);

        Color rgb=newColor(wsp_red,wsp_green,wsp_blue);
        image.setRGB(j,i,rgb.getRGB());
}

Gdzieś w moim toku rozumowania wkradł się błąd i nie sposób, żebym teraz sam go przeskoczył oj już długo wpatrywałem się w ten kod i nic nie wymyśliłem. Ja odnoszę wrażenie, że błąd może polegać na nieodpowiednim doborze sąsiednich pikseli do interpolacji.

Liczę na waszą pomoc! Pozdrawiam