Ich habe tagelang gehunkelt, um herauszufinden, was mit meiner nächsten Nachbarinterpolation nicht stimmt, wenn ich ein Bild halb so groß skaliere. Im mit Rust, aber ich glaube nicht, dass so viel wie der Algorithmus zählt:Was ist falsch mit diesem Algorithmus für den nächsten Nachbarn zur Bildskalierung?
/// Interpolate using nearest neighbor.
pub fn nearest(mut src: &mut Image, w2: i32, h2: i32) -> RasterResult<()> {
// Compute scale
let x_scale: f64 = src.width as f64/w2 as f64;
let y_scale: f64 = src.height as f64/h2 as f64;
// Create destination image
let mut dest = Image::blank(w2, h2);
// Loop thru destination image's pixels
for y2 in 0..h2 {
for x2 in 0..w2 {
// Get location from src using nearest neighbor
let x1: i32 = (x2 as f64 * x_scale).floor() as i32;
let y1: i32 = (y2 as f64 * y_scale).floor() as i32;
let pixel = try!(src.get_pixel(x1, y1));
// Apply the pixels
try!(dest.set_pixel(x2, y2, pixel));
}
}
// Update the source image
src.width = dest.width;
src.height = dest.height;
src.bytes = dest.bytes;
Ok(())
}
Meine Telefonvorwahl:
// Open
let mut image = raster::open(r"test.png").unwrap();
// Resize to half
raster::interpolate::nearest(&mut image, 256, 128).unwrap();
// Save
raster::save(&image, r"out.png").unwrap();
Es funktioniert gut für normale Bilder aber nicht auf Sonderfälle. Hier ist das Testbild:
zur Hälfte mit meinem Code Scaled:
Zum Vergleich hier ist Photoshop:
ich mit GD getestet und es ergibt ähnliche Ergebnisse wie Photoshop.
Meine Untersuchung führt mich zu glauben, dass meine Berechnung der Quellpixel (rote Quadrate) von einem aus ist im Vergleich zu den anderen (grünen Quadraten):
Ich habe auch versucht into GD's source code die Suche nach bekomme einen Hinweis, aber ich verstehe nicht ganz, was es tut.
Um zu verdeutlichen, spreche ich nicht über eine andere Interpolationsmethode wie Bilinear und Bikubic. Ich vergleiche meinen nächsten Nachbaralgorithmus und sein Ergebnis mit dem Ergebnis von Photoshop und dem nächsten Nachbaralgorithmus von GD. Ich frage nicht, warum meine Ergebnisse in Photoshop hässlich sind, weil ich den nächsten Nachbaralgorithmus verwendet habe.
(Testbild mit freundlicher Genehmigung von Jonas Berlin über Eric Brasseur)
Sie haben ein Testbild verwendet, das zeigen soll, dass einfache Skalierungsalgorithmen wie der nächste Nachbar unzureichend sind. Und das hat sich tatsächlich gezeigt. Alles funktioniert wie beabsichtigt. Wenn Sie bessere Ergebnisse wünschen, verwenden Sie einen besseren Skalierungsalgorithmus. – interjay
@interjay - Nein. Ich denke, du verstehst die Frage falsch. Ich habe den nächsten Nachbarn in Photoshop und GD verwendet und die Ergebnisse unterscheiden sich mit meinem nächsten Nachbaralgorithmus. Ich frage nicht nach einer anderen Interpolationsmethode. – kosinix