miércoles, 25 de febrero de 2009

Manipulación de dos imágenes para realizar un montaje, usando código en Java

El código implementado nos indica que se procede a mezclar dos imágenes una como (background), imagen de fondo y la otra imagen (foreground)para ser montada sobre la primera.

La imagen background es multiplicada por un número alpha, la imagen foreground en primera instancia es duplicada y luego multiplicada por el número alpha con lo cual la imagen original (background no se modificará), dando como resultado una mezcla de las dos imágenes citadas.

A continuación se inserta el código.

import ij.IJ;
import ij.ImagePlus;
import ij.WindowManager;
import ij.process.*;
import ij.gui.GenericDialog;
import java.awt.*;
import ij.plugin.filter.*;

public class Alpha_Blending implements PlugInFilter {
ImagePlus fgIm = null;
static double alpha = 0.5;

public int setup(String arg, ImagePlus img) {
return DOES_8G;
}

public void run(ImageProcessor bgIp) {

if(runDialog()){
ImageProcessor fgIp=fgIm.getProcessor().convertToByte(false);
fgIp = fgIp.duplicate();
fgIp.multiply(1-alpha);
bgIp.multiply(alpha);
bgIp.copyBits(fgIp, 0, 0, Blitter.ADD);
}
}

boolean runDialog(){
int[] windowList = WindowManager.getIDList();
if (windowList == null){
IJ.noImage();
return false;
}
String[] windowTitles = new String[windowList.length];
for(int i = 0; i < windowList.length; i++)
{
ImagePlus im = WindowManager.getImage (windowList[i]);
if (im == null)
windowTitles[i] = "untitled";
else
windowTitles[i] = im.getShortTitle();
}
GenericDialog gd = new GenericDialog("Alpha Blending");
gd.addChoice("Foreground image: ", windowTitles, windowTitles[0]);
gd. addNumericField("Alpha value [0. . 1]: " , alpha, 2);
gd.showDialog();
if (gd.wasCanceled())
return false;
else {
int fgIdx = gd.getNextChoiceIndex();
fgIm = WindowManager.getImage(windowList[fgIdx]);
alpha = gd.getNextNumber ();
return true;
}
}
}

2 comentarios:

Carlos Jose dijo...

Estimado Pato, en esta linea de codigo puedes cambiar la operacion que deseas que realicen las imagemes:

bgIp.copyBits(fgIp, 0, 0, Blitter.ADD);
donde "Blitter.ADD" puede ir "Blitter.DIFFERENCE" o la operacion que desees.

Gaby Fiallo dijo...

Estimado Pato, muy interesante la breve introducción que publicas antes de mostrar el código. Pero sería interesante que además de la teoría y el código, muestres el resultado con las imágenes.