Pregunta

Woohoo, he venido a los arreglos ahora, gracias a Dios.

¡Ahora tengo 2 matrices!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

Imagínelo como una imagen de 4x4 píxeles

Ahora, quiero crear un histograma, la distribución de valores de color de 0 a 255. Por ejemplo, aquí tengo 2 * 255, 2 * 127, 5 * 34 y así sucesivamente.

Así que he creado un histograma int [] = new int [255];

Para probar si mis valores de color son correctos, escribí:

 for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
         System.out.println("Colorvalue in Array " + i + "." + j + " is" + colorvalues[i][j]);
     }
 }

Hasta ahora, todo bien. Ahora, ¿cómo escribo un procedimiento que va en el histograma [255] de 0 a 255 y lo compara con el valor de los valores de color [] [], y si, por ejemplo, el histograma [34] se compara con los valores de color [] [] agrega 5 al histograma [34]. Porque hay 5 veces 34 en valores de color [] [].

Tal vez mi pensamiento es incorrecto y se suponía que tenía un histograma [255] [], 255 para valores de color de 0 a 255 y el otro para el contador. Incluso entonces, ¿cómo me doy cuenta?

¿Fue útil?

Solución

En realidad, no debe iterar sobre el histograma y por cada valor posible iterar sobre la imagen. Iterar sobre la imagen debería ser suficiente:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

Puede simplemente tomar el valor de claridad de su imagen como un índice en la matriz de histograma.

Y no necesita crear una matriz de matrices solo para guardar el contador. Recuerde que una matriz no es más que una lista de '' celdas '' por un cierto valor. un int [] es solo un rango de '' celdas '' que puede contener un valor entero. Esa es tu cuenta. El índice en esa lista de celdas es su valor de brillo para el histograma. Para cada matriz tiene esos dos datos: un índice de la celda y el valor en esa celda. Solo necesita descubrir cómo usar ambos.

Y como PSpeed ?? señala en el comentario, puede asegurarse de que el código no intente acceder realmente valores fuera de los límites de esa matriz:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

Eso es necesario porque sus valores de color son int s, es decir, pueden contener valores desde & # 8722; 2147483648 a 2147483647. Que es un rango mucho mayor que el que puede acomodar su histograma. Entonces, si un valor de color es 3456, por ejemplo, el programa se detendría en el bucle debido a una ArrayIndexOutOfBoundsException . Porque el código trid para acceder a un valor en la matriz histogram con el índice 3456, que está mucho más allá del índice máximo utilizable de 255.

ETA: en cuanto a que su histograma sea int [255] : lo olvidé por completo, lo siento. Al crear una nueva matriz en Java, especifique la longitud , no el índice máximo. Entonces, lo que sea que use allí es mayor en exactamente uno que el índice máximo que se puede usar en la matriz. Entonces new int [256] es una matriz que tiene índices de 0 a 255.

Otros consejos

Me vería tentado a agregar los valores del histograma en un TreeMap donde la clave del mapa es el valor del color y el valor del mapa es el recuento.

El mapa aumentará de tamaño automáticamente, sin problemas con el índice fuera de límites, etc. se ordenará automáticamente en orden de tamaño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top