¿Podemos encontrar qué color es dominante en una imagen usando java, imagemagick o jmagick?¿Cómo puedo encontrar el color dominante de una imagen?
Respuesta
en iterate java en cada píxel y determinar el color
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
public class ImageTester {
public static void main(String args[]) throws Exception {
File file = new File("C:\\Users\\Andrew\\Desktop\\myImage.gif");
ImageInputStream is = ImageIO.createImageInputStream(file);
Iterator iter = ImageIO.getImageReaders(is);
if (!iter.hasNext())
{
System.out.println("Cannot load the specified file "+ file);
System.exit(1);
}
ImageReader imageReader = (ImageReader)iter.next();
imageReader.setInput(is);
BufferedImage image = imageReader.read(0);
int height = image.getHeight();
int width = image.getWidth();
Map m = new HashMap();
for(int i=0; i < width ; i++)
{
for(int j=0; j < height ; j++)
{
int rgb = image.getRGB(i, j);
int[] rgbArr = getRGBArr(rgb);
// Filter out grays....
if (!isGray(rgbArr)) {
Integer counter = (Integer) m.get(rgb);
if (counter == null)
counter = 0;
counter++;
m.put(rgb, counter);
}
}
}
String colourHex = getMostCommonColour(m);
System.out.println(colourHex);
}
public static String getMostCommonColour(Map map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());
}
});
Map.Entry me = (Map.Entry)list.get(list.size()-1);
int[] rgb= getRGBArr((Integer)me.getKey());
return Integer.toHexString(rgb[0])+" "+Integer.toHexString(rgb[1])+" "+Integer.toHexString(rgb[2]);
}
public static int[] getRGBArr(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
return new int[]{red,green,blue};
}
public static boolean isGray(int[] rgbArr) {
int rgDiff = rgbArr[0] - rgbArr[1];
int rbDiff = rgbArr[0] - rgbArr[2];
// Filter out black, white and grays...... (tolerance within 10 pixels)
int tolerance = 10;
if (rgDiff > tolerance || rgDiff < -tolerance)
if (rbDiff > tolerance || rbDiff < -tolerance) {
return false;
}
return true;
}
}
Utilización de Java normal sólo puede iterar sobre cada píxel y contar con qué frecuencia se contiene cada color ...
pseudo-código:
Map<Color, Integer> color2counter;
for (x : width) {
for (y : height) {
color = image.getPixel(x, y)
occurrences = color2counter.get(color)
color2counter.put(color, occurrences + 1)
}
}
asumiendo que usa un esquema de color aditivo, donde (0,0,0) es negro y (255, 255, 255) es blanco (corríjame si me equivoco). Además, si solo quiere encontrar el color dominante de RGB:
Una idea que tengo, que cualquiera de ustedes es libre de examinar es tener 3 variables que almacenan cada uno de los valores RGB y agregar a cada uno de ellos el valor apropiado de cada píxel en la imagen y luego divida por (255 * numOfPixels) para obtener una proporción de color. Luego compare las 3 proporciones: .60 para rojo y .5 para verde significaría que el rojo es más dominante.
Esto es sólo una idea, y puede ser que necesite ajustar ...
utilicé jamagick para qué color se usa como tipo RGB pero de esta manera solo puedo encontrar el clor de imagen de avarage. Pero tengo una idea de que puedo recortar la imagen del medio para que pueda encontrar el color aproximado de esa parte, dará casi el mismo color otra vez. Solo encuentro el color dominante:/ –
@ ErçinAkçay Si quieres recortar la imagen, seguramente querrás el color principal en los bordes. p.ej. di que tienes un cuadrado grande rodeado de blanco. Desea detectar el color del blanco para recortarlo, no el cuadrado. –
Este es un problema difícil. Por ejemplo, si tiene un área pequeña de exactamente el mismo color y una gran área de tonos ligeramente diferentes de un color diferente, entonces simplemente buscando el color que más se usa es poco probable que le dé el resultado que desea. Obtendrá un mejor resultado definiendo un conjunto de colores y, para cada uno, los rangos de valores RGB que considere que "son" de ese color.
Este tema se analiza en profundidad en el servidor discurso ImageMagick, por ejemplo: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=12878
Ver también Fast way of getting the dominant color of an image
Me acaba de lanzar un algoritmo muy simple que se puede traducir en Java trivial. Se llama color-finder y funciona en JavaScript.
Las soluciones propuestas en este hilo pueden ser descartadas por unos pocos caracteres blancos en la imagen, mientras que la mía realmente trata de encontrar el color más prominente, incluso si todos los píxeles no son exactamente del mismo color.
Avísame si te parece útil.
- 1. ¿Cómo encontrar el color dominante en la imagen?
- 2. Python - Encuentra el color dominante/más común en una imagen
- 3. ¿Cómo clasificar automáticamente las imágenes por color dominante?
- 4. ¿Cómo puedo encontrar el ancho de una imagen usando PHP?
- 5. ¿Cómo puedo cambiar el color de una imagen en Silverlight/WP7 (máscara de color)?
- 6. CSS: cómo convertir una imagen en color a una imagen de color gris o negro/blanco
- 7. ¿Cómo puedo encontrar máximos locales en una imagen en MATLAB?
- 8. Encuentra el color más común en una imagen
- 9. ¿Cómo puedo cambiar el color de una imagen SVG en el vuelo estacionario?
- 10. Cómo cambiar el color de una imagen usando jquery
- 11. Cómo teñir una imagen/mostrar un color?
- 12. ¿Cómo puedo cambiar el color de fondo de una imagen usando GDI +?
- 13. Obtener color de imagen
- 14. Cómo encontrar una imagen dentro de otra imagen usando python
- 15. Cómo obtener una imagen en color en el iPhone SDK
- 16. Detectando una mancha de color en una imagen
- 17. ¿Cómo encontrar el valor de transparencia del canal alfa de un píxel en una imagen png?
- 18. Qt IZQUIERDA CTRL Código dominante
- 19. detectar el color más usado en una imagen usando python
- 20. ¿Cómo puedo detectar el fondo de una imagen mediante programación?
- 21. Efectivamente el ciclo de color de una imagen en Java
- 22. ¿Cómo puedo encontrar el centro del objeto?
- 23. Cambiar el color de una imagen con imagemagick
- 24. ¿Cómo puedo configurar el color accesorio de una UITableViewCell?
- 25. Calcular el color promedio de un área en una imagen
- 26. Obteniendo el color más común de una imagen
- 27. ¿Cómo obtener un color de mayoría en una imagen?
- 28. ¿Cómo puedo visualizar una imagen en el terminal?
- 29. ¿Dónde puedo encontrar temas de color para Visual Assist X?
- 30. ¿Cómo puedo convertir una imagen RGB a escala de grises pero mantener un solo color?
¿Te refieres al tono más utilizado en la imagen o el color promedio? –