Cómo fusionar imágenes e imponerse unas a otras
Supongamos que estoy subiendo dos o más de dos fotos en algún Framelayout
. Por lo tanto estoy subiendo tres fotos con una misma persona en tres posiciones diferentes en todas esas tres imágenes. Entonces qué librerías de procesamiento de imágenes en Android o java o Native están disponibles para hacer algo como se muestra en la imagen.
Me gustaría imponer imágenes múltiples entre sí.
- Cómo encontrar las esquinas de un objeto Rect en openCV?
- ¿Cómo deformar imágenes en Android?
- Error al establecer ROI OpenCV Android
- Uso de ImageMagick en mi aplicación Android
- ¿Cómo manejar la limitación de memoria de la GPU para el procesamiento de imágenes de alta resolución en la GPU?
Algo como esto: –
Una idea es:
- Hacer algunas capas en todas esas imágenes y encontrar las áreas de desajuste en las fotos y combinarlas.
¿Cómo se puede combinar múltiples imágenes con otras? ¿Comprobando la similitud y fusionándose entre sí?
¿Hay algún Api de terceros o algún servicio de Photoshop que pueda ayudarme a hacer este tipo de procesamiento de imágenes?
- Programaticamente encuentre imágenes trémulas o fuera de foco
- Tiempo de procesamiento de OpenCV Mat
- Detectar los límites de un documento en una imagen usando opencv java
- Transmisión de matriz a rsForEach en Renderscript Compute
- Incluir OpenCV en el paquete de aplicaciones de Android
- Android: procesamiento de imágenes en tiempo real
- No se puede construir caffe en android
- Android jpeg pictureCallback en escala de grises Opencv Mat
En este caso, no sólo intenta combinar las imágenes. Realmente desea combinar una escena que contiene el mismo objeto en diferentes posiciones.
Por lo tanto, no es sólo una combinación simple o una compositve alfa donde el color de un píxel dado en la imagen de salida es la suma del valor de este píxel en cada imagen, dividido por el número de imágenes.
En este caso, usted puede hacer:
- Determine el fondo de escena analizando los píxeles que no cambian teniendo en cuenta múltiples imágenes.
- Comience con la imagen de salida que es sólo el fondo.
- Para cada imagen, elimine el fondo para obtener el objeto deseado y compártalo con la imagen de salida.
Hay un plugin de Marvin para realizar esta tarea, llamada MergePhoto. El programa a continuación usa ese plug-in para combinar un conjunto de fotos de parkour.
import marvin.image.MarvinImage; import marvin.io.MarvinImageIO; import marvin.plugin.MarvinImagePlugin; import marvin.util.MarvinPluginLoader; public class MergePhotosApp { public MergePhotosApp(){ // 1. load images 01.jpg, 02.jpg, ..., 05.jpg into a List List<MarvinImage> images = new ArrayList<MarvinImage>(); for(int i=1; i<=5; i++){ images.add(MarvinImageIO.loadImage("./res/0"+i+".jpg")); } // 2. Load plug-in and process the image MarvinImagePlugin merge = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.combine.mergePhotos"); merge.setAttribute("threshold", 38); // 3. Process the image list and save the output MarvinImage output = images.get(0).clone(); merge.process(images, output); MarvinImageIO.saveImage(output, "./res/merge_output.jpg"); } public static void main(String[] args) { new MergePhotosApp(); } }
Las imágenes de entrada y la imagen de salida se muestran a continuación.
No sé si esto calificará para ser en su definición de "nativos", pero hay la biblioteca siguiente de .NET que podría ayudar: http://dynamicimage.apphb.com/
Si la biblioteca en sí puede dar que desea que desee, a continuación, dependiendo de su arquitectura podría configurar un pequeño sitio ASP.NET para hacer la manipulación de imágenes en el servidor.
Compruebe la respuesta aceptada aquí .
En el enlace anterior existe la fusión de dos imágenes que se realiza mediante openCV sdk.
Si no quieres usar openCV y solo quieres probar con tu auto entonces tendrás que jugar poco con framlayout y con tres imageview. Dar opciones al usuario para seleccionar una parte específica de la imagen para mostrar para las tres imágenes. Así se mostrará la parte seleccionada de la imagen seleccionada. De esta manera obtendrás el resultado como arriba de lo que has dicho.
Espero que tengas mi punto. Si no, entonces hágamelo saber.
Disfruta de la codificación … 🙂
Puedes superponer las imágenes con openCV que puedes comprobar en OpenCV y aquí o aquí
// Read the main background image cv::Mat image= cv::imread("Background.png"); // Read the mans character image to be placed cv::Mat character= cv::imread("character.png"); // define where you want to place the image cv::Mat newImage; //The 10,10 are the initial coordinates in pixels newImage= image(cv::Rect(10,10,character.cols,character.rows)); // add it to the background, The 1 is the aplha values cv::addWeighted(newImage,1,character,1,0,newImage); // show result cv::namedWindow("with character"); cv::imshow("with character",image); //Write Image cv::imwrite("output.png", newImage);
O puede crearlo como un efecto de filigrana
O puedes probarlo en java como fusionar dos imágenes
Trate de usar esta clase
public class MergeImages { public static void main(String[] args) { File inner = new File("Inner.png"); File outter = new File("Outter.png"); try { BufferedImage biInner = ImageIO.read(inner); BufferedImage biOutter = ImageIO.read(outter); System.out.println(biInner); System.out.println(biOutter); Graphics2D g = biOutter.createGraphics(); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); int x = (biOutter.getWidth() - biInner.getWidth()) / 2; int y = (biOutter.getHeight() - biInner.getHeight()) / 2; System.out.println(x + "x" + y); g.drawImage(biInner, x, y, null); g.dispose(); ImageIO.write(biOutter, "PNG", new File("Outter.png")); } catch (Exception e) { e.printStackTrace(); } } }
- Cargando video de Youtube a través de i-frame en android webview
- Jacoco Android createDebugCoverageReport no encontrado