tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
1
ZUGRIFFE
406
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cojack20 cojack20 ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    47
    Hallo,

    ich habe folgendes Problem:
    Es existiert ein Vordergrundbild und ein Hintergrundbild. Bild A ist zu Bid B mit einem Offset in X und Y Richtung verschoben. Der Offset ist unbekannt und muss "gelernt" werden.

    Ich habe foldenden Ansatz:
    1: Generiere mir "Edge Detection" Bilder mit Java Advanced Imaging API:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    private BufferedImage doEdgeDetection(BufferedImage inputImage) {
            PlanarImage image = JAIHelper.colorToGray(PlanarImage.wrapRenderedImage(inputImage));
     
            // Create the two kernels.
            float data_h[] = new float[] { 1.0F,   0.0F,   -1.0F,
                    1.414F, 0.0F,   -1.414F,
                    1.0F,   0.0F,   -1.0F};
            float data_v[] = new float[] {-1.0F,  -1.414F, -1.0F,
                    0.0F,   0.0F,    0.0F,
                    1.0F,   1.414F,  1.0F};
     
            KernelJAI kern_h = new KernelJAI(3,3,data_h);
            KernelJAI kern_v = new KernelJAI(3,3,data_v);
     
            // Create the Gradient operation.
            PlanarImage result = (PlanarImage)JAI.create("gradientmagnitude", image,kern_h, kern_v);
     
            return result.getAsBufferedImage();
        }

    2: Generiere mir ein verschobenes Bild vom Referenzbild:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
        private PlanarImage getShiftedVersion(PlanarImage image2, int offsetX, int offsetY) {
            
            GraphicsConfiguration gfxConf = GraphicsEnvironment.getLocalGraphicsEnvironment(). 
            getDefaultScreenDevice().getDefaultConfiguration(); 
            BufferedImage image = gfxConf.createCompatibleImage( image2.getWidth(), image2.getHeight() );
            
            BufferedImage bufferedImage = image2.getAsBufferedImage();
            Graphics2D g = image.createGraphics(); 
            g.drawImage(bufferedImage, offsetX, offsetY, bufferedImage.getWidth(), bufferedImage.getHeight(), null);    
            return PlanarImage.wrapRenderedImage(image);
        }


    3. Merge die Bilder in ein Bild:

    Code :
    1
    2
    3
    4
    5
    6
    
        public static PlanarImage minImages(PlanarImage image, PlanarImage background){
            ParameterBlock pb = new ParameterBlock();
            pb.addSource(image);
            pb.addSource(background);
            return (PlanarImage)JAI.create("min", pb);
        }

    4. Vergleiche die Bilder mit Hilfe des MIN-Images Histogram (Viel schwarz == gut)

    Code :
    1
    2
    3
    4
    5
    6
    7
    
        private int calculateMatchingDegree(PlanarImage image1, PlanarImage image2) {
            PlanarImage minImage = JAIHelper.minImages(image1, image2);
            Histogram histogram = JAIHelper.createHistogram(minImage);
     
            int result = histogram.getBins()[0][0];
            return result;
        }


    Jetzt zu meiner Frage:
    1) Hat einer ne Bessere Idee als die iterative Methode?
    2) Der Schritt mit dem Generieren des verschobenen Referenzbildes braucht unglaublich lange 20 Sekunden pro Offset. Wie kann ich das schneller machen?

    Danke
     

  2. #2
    cojack20 cojack20 ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    47
    Ich habe eine Lösung zum zweiten Problem gefunden:


    Der Translate operator der JAI macht genau das. Ich weiß nur noch nicht, wie ich in den verschobenen/leeren Bereich schwarze Pixel nachziehe. Das macht wohl die InterpolatorTable Klasse. Aber wie!?



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        private PlanarImage getShiftedVersion(PlanarImage image2, int offsetX, int offsetY) {
             // Create a ParameterBlock and specify the source and parameters.
             ParameterBlock pb = new ParameterBlock();
             pb.addSource(image2);                  // The source image
             pb.add((float)offsetX);                // The x translation
             pb.add((float)offsetY);                // The y translation
             pb.add(new InterpolationNearest());    // The interpolation
     
             // Create the translate operation
             PlanarImage result = JAI.create("translate", pb, null);
             
             return result;
        }
    Geändert von cojack20 (10.12.10 um 16:07 Uhr)
     

Ähnliche Themen

  1. Werte zweier Arrays vergleichen
    Von loddarmattheus im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.08.08, 10:41
  2. Werte zweier Felder vergleichen
    Von msycho im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 09.12.07, 15:03
  3. werte zweier aggregatfunktionen vergleichen
    Von zeroxp1 im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 13.12.06, 18:36
  4. Inhalt zweier Verzeichnisse miteinander vergleichen
    Von swingnewbie im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 08.09.06, 13:27
  5. Antworten: 1
    Letzter Beitrag: 12.08.05, 01:21