Frage zu Polygonen

dapor

Mitglied
Hi,

ich möchte gern das Weiße aus diesem Bild in ein Polygon speichern ...
Weiß jemand wie das funktioniert?
Ich habe es schon als BufferedImage gespeichert, dann mit 2 for Schleifen es durchgegangen und immer falls das getRGB ungleich zu dem getRGB davor ist macht er einen Punkt ins Polygon.
Aber scheinbar verkraftet das Polygon nicht alle Punkte, sodass immer nur ein Teil herauskommt oder völlig sinnfreie Ergebnisse.
Habe ich einen Denkfehler oder woran liegt es? Oder gibt es noch eine andere Art und Weisse dieses Polygon zu speichern?
 
Folgende (laaaaangsame) Möglichkeit:

Geh vertikal oder horizontal durch das Bild, bis der erste weiße Pixel auftaucht. Den ins Polygon aufnehmen und dann in einer Richtung weiter suchen, bis der nächste weiße Pixel mit _mindestens einem_ schwarzen Nachbarpixel auftaucht. Den wieder ins Polygon usw.

Schneller gehts mit Scanline-Algorithmen (mal nach googlen).
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * @author Tom
 * 
 */
public class ExtractTrack {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage srcBufferedImage = ImageIO.read(new File(
                "c:/track_white.png"));
        int width = srcBufferedImage.getWidth();
        int height = srcBufferedImage.getHeight();

        List<Point> points = new ArrayList<Point>();

        //final int WHITE = -1;
        final int BLACK = -16777216;

        int[] lastScannedRow = new int[width];
        Arrays.fill(lastScannedRow, BLACK);
        
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int rgb = srcBufferedImage.getRGB(x, y);
                if (lastScannedRow[x] != rgb) {
                    // Color change
                    Point point = new Point(x, y);
                    points.add(point);
                }
                lastScannedRow[x] = rgb;
            }
        }

        BufferedImage destBufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = destBufferedImage.getGraphics();
        g.setColor(Color.RED);
        

        for (Point point : points) {
            g.drawLine(point.x,point.y,point.x,point.y);
        }
        
        Polygon polygon = transformPointsToPolygon(points);
        //g.fillPolygon(polygon);

        ImageIO.write(destBufferedImage, "jpeg", new File("c:/tack_poly.jpg"));

    }

    private static Polygon transformPointsToPolygon(List<Point> points) {
        Polygon polygon = new Polygon();
       //todo
        return polygon;
    }

}

So bekommst du zumindest mal alle Punkte heraus... nun musst du nur noch die Punkte klever zu einem Polygon verbinden.

Btw. auch wenn es dazu schneller Verfahren gibt, dauert dass ganze bei deinen Bildern bei mir gerade mal 200ms ;-) insofern sollte man die Optimierungsenergie "vielleicht" irgendwo anders unterbringen ;-)

Zur Loesung dieses Problems solltest du dich mal ueber die Themen Innere und aeussere konvexe Huelle informieren.

Gruß Tom
 
Hi,

ich versuche grad das Polygon so zu fühlen, dass es auch ordentlich aussieht.

Ich bedanke mich recht herzlich
 
Zurück