Me pregunto si existe una forma "inteligente" de dividir una imagen basada en ciertas características.Cómo separar una imagen en dos con java
Las imágenes son 300x57, blanco y negro (realmente en escala de grises, pero la mayoría de los colores son negros o blancos), se compone de dos características principales (llamémoslas blobs) separadas por espacio negro, cada burbuja varía ligeramente de ancho y altura, la posición de las manchas también varía, ¡las manchas NUNCA se superponen!
Esto es lo que una imagen "ve" como:
-------------------------
----WWW---------WWWWW----
---WWWWWWW----WWWWWW-----
-----WWWW-------WWW------
-------------------------
La división resultante sería algo como esto:
------------ -------------
----WWW----- ----WWWWW----
---WWWWWWW-- --WWWWWW-----
-----WWWW--- ----WWW------
------------ -------------
Pasos planeo tomar con el fin de dividir la imagen:
- Escanee la imagen de un lado a otro.
- Determine los bordes de los blobs.
- Tome la distancia entre los dos bordes interiores.
- Divida la imagen en el medio de la distancia interior.
- Guarde las dos imágenes como archivos separados.
Sería bueno si normalizo los anchos de imagen, por lo que todas mis imágenes tienen un ancho uniforme cuando se guardan.
No tengo experiencia en la manipulación de imágenes, así que no sé cuál es una forma eficiente de hacerlo. Actualmente estoy usando una Imagen Buffered, obtengo el ancho/alto, iterando sobre cada píxel, etc. No hay una solución incorrecta para mi problema, pero estoy buscando una más eficiente (menos código + más rápido). También he estado buscando en java.awt.Graphics ...
Agradecería que obtuviera algunas ideas para formas más eficientes de realizar esta tarea. Quiero quedarme con las bibliotecas integradas de Java, ¿así que BufferedImage o Graphics2D son las cosas más eficientes para usar en este caso?
EDIT: Este es el código después de leer las sugerencias:
public void splitAndSaveImage(BufferedImage image) throws IOException
{
// Process image ------------------------------------------
int height = image.getHeight();
int width = image.getWidth();
boolean edgeDetected = false;
double averageColor = 0;
int threshold = -10;
int rightEdge = 0;
int leftEdge = 0;
int middle = 0;
// Scan the image and determine the edges of the blobs.
for(int w = 0; w < width; ++w)
{
for(int h = 0; h < height; ++h)
{
averageColor += image.getRGB(w, h);
}
averageColor = Math.round(averageColor/(double)height);
if(averageColor /*!=-1*/< threshold && !edgeDetected)
{
// Detected the beginning of the right blob
edgeDetected = true;
rightEdge = w;
}else if(averageColor >= threshold && edgeDetected)
{
// Detected the end of the left blob
edgeDetected = false;
leftEdge = leftEdge==0? w:leftEdge;
}
averageColor = 0;
}
// Split the image at the middle of the inside distance.
middle = (leftEdge + rightEdge)/2;
// Crop the image
BufferedImage leftImage = image.getSubimage(0, 0, middle, height);
BufferedImage rightImage = image.getSubimage(middle, 0, (width-middle), height);
// Save the image
// Save to file -------------------------------------------
ImageIO.write(leftImage, "jpeg", new File("leftImage.jpeg"));
ImageIO.write(rightImage, "jpeg", new File("rightImage.jpeg"));
}
Nota: después de que se detecta el borde derecho, simplemente se puede salir del bucle for. – Kiril