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:
- Wyznacz położenie punktu Pwe = (xwe, ywe) w przestrzeni obrazu pierwotnego
- Wyznacz indeksy piksela podstawowego A: j = int(xwe), i = int(ywe)
- Weź atrybuty pikseli: A, B=(i,j+1,), C=(i+1,j), D=(i+i,j+1)
- Wyznacz współczynniki interpolacji α = xwe – j, β=ywe-i
- Wylicz częściowe wartości atrybutów uzywając interpolacji względem α
XAB= αB +(1- α)A, XCD= αD +(1- α)C - Wylicz końcową wartość atrybutu:
X= βXCD +(1- β)XAB, - 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