Schnell geshiftete Version zweier Bilder vergleichen.

cojack20

Mitglied
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:
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:
	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:
	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:
	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
 
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:
	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;
	}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück