Die Bilineare interpolation
Ich habe diesen code für die Skalierung Bild durch eine Bilineare interpolation.Ich weiß, das funktioniert, aber ich kann nicht herausfinden, eine Sache, was ist, wenn die angenähert pixel-Wert ist eine Kante(von Kante meine ich, es ist in der letzten Zeile bzw. letzten Spalte) pixel im Eingabe-Bild, dann kann ich i gt einen pixel mit der Koordinate (x+1,y+1) ,dies sollte dazu führen, dass ein array-index out of range Fehler, aber kein solcher Fehler tritt auf, warum?
Der code ist:
public int[] resizeBilinearGray(int[] pixels, int w, int h, int w2, int h2) {
int[] temp = new int[w2*h2] ;
int A, B, C, D, x, y, index, gray ;
float x_ratio = ((float)(w-1))/w2 ;
float y_ratio = ((float)(h-1))/h2 ;
float x_diff, y_diff, ya, yb ;
int offset = 0 ;
for (int i=0;i<h2;i++) {
for (int j=0;j<w2;j++) {
x = (int)(x_ratio * j) ;
y = (int)(y_ratio * i) ;
x_diff = (x_ratio * j) - x ;
y_diff = (y_ratio * i) - y ;
index = y*w+x ;
//range is 0 to 255 thus bitwise AND with 0xff
A = pixels[index] & 0xff ;
B = pixels[index+1] & 0xff ;
C = pixels[index+w] & 0xff ;
D = pixels[index+w+1] & 0xff ;
//Y = A(1-w)(1-h) + B(w)(1-h) + C(h)(1-w) + Dwh
gray = (int)(
A*(1-x_diff)*(1-y_diff) + B*(x_diff)*(1-y_diff) +
C*(y_diff)*(1-x_diff) + D*(x_diff*y_diff)
) ;
temp[offset++] = gray ;
}
}
return temp ;
}
- Haben Sie versucht, dies mit w=w2 h=h2 ?
- Nein, ich wusste nicht warum?
- Sollte es geben, die dasselbe Bild, wenn der Algorithmus korrekt waren. BTW, dieser ist Java ? Tag mit der Sprache, bitte
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund ist, dass
x_ratio
undy_ratio
berechnet werden falsch.Betrachten Sie das Letzte pixel in der letzten Zeile:
dann:
also der index ist immer kleiner als die Größe der
pixels
array.Beachten Sie jedoch, dass dies ein sehr schmutziger hack, die zu ungenauen Ergebnissen führen, vor allem für kleine Bilder.
Errechnen Sie Breite/Höhe-Verhältnis wie folgt:
und erstellen Sie eine Funktion, die konvertiert Koordinaten in array-index - nennen wir es
coord2index
. Diese Funktion nimmt out-of-range-Koordinaten berücksichtigt und implementiert eine so genannte boundary-option, die simuliert, dass es Pixel außerhalb der Bildbegrenzung.Gemeinsame Optionen für die Grenze sind:
symmetrischen - Pixel außerhalb des Bildes Grenzen berechnet werden, indem der Spiegel spiegelt das Bild an der Grenze. Dies ist wahrscheinlich die beste Möglichkeit in diesem Fall.
replizieren - Pixel außerhalb des Bildes Grenzen angenommen, gleich zu dem nächsten pixel an der Grenze. Dies ist der einfachste Weg.
kreisförmigen - das Bild ist praktisch wiederholt in regelmäßigen Abständen in alle Richtungen. Verwendet erweiterte Bildverarbeitungsalgorithmen; nicht gut für die Skalierung von Bildern.
Ich denke, der trick ist in
x_ratio = (float)(w-1))/w2
, die berechnet das Verhältnis, als wenn das ursprüngliche Bild waren ein pixel kleiner als es wirklich ist. Aber ich bin mir nicht sicher, ob dies ist absolut sicher und korrekt (ich würde es nicht - denken Sie zum Beispiel der Fall w=w2 h=h2 die sollte genau das gleiche Bild). Ich weiß wirklich nicht, wie dieser Ansatz.