La sacerdotisa (centro de gravedad)

Posted · Añadir comentario

Una vez separada la figura del fondo, recortado todo lo que hemos considerado relevante y eliminadas aquellas partes que hemos determinado como superfluas, ¿Cómo podemos realizar un primer análisis? ¿Cómo podemos empezar a entender la imagen del mismo modo en que lo hace el ordenador y trabajar con una amalgama de pixeles ordenados uno detrás de otro? ¿Cómo extraer de dicha amalgama propiedades que nos hablen de un cuerpo en el espacio?

centro-de-gravedad-01

Entendamos la imagen como un todo, como un cuerpo sin órganos, un continuum de cualidades intensivas (la luminosidad de cada pixel). Si asignamos un peso a cada pixel en función de su luminosidad y averiguamos donde está situado en la imagen, podremos calcular el centro de gravedad de dicho cuerpo, la zona de la imagen donde se acumula la masa, y empezar a comprender un poco más la amalgama informe.

No necesitamos detalles para hacer un análisis tan sencillo, así que con el fin de simplificar el trabajo y facilitar los cálculos al ordenador podemos trabajar con una imagen de muy baja resolución, 18×9 pixeles bastan para conseguir buenos resultados.

centro-de-gravedad_02

Para cada pixel crearemos un vector en el que guardar la posición X e Y que le corresponden en la imagen.

int total = 18 * 9;
vector<ofVec2f> vectores;

for (int i=0; i<total; i++) {
	int x = i % 18;
	int y = (i - x) / 18;
	vectores.push_back(ofVec2f(x, y));
}

Recorriendo todos los pixeles de la imagen podremos utilizar el valor en escala de grises de sus colores y dividirlo entre 255 para obtener una cifra entre 0 y 1 que consideraremos su peso específico. De este modo los pixeles claros con luminosidades cercanas a 255 tendrán pesos cercanos a 1 y los pixeles oscuros tendrán pesos cercanos a 0, dichos pesos nos permitirán promediar la suma de los vectores de posición de todos los pixeles.

centro-de-gravedad-04

El cálculo resulta sencillo, simplemente debemos multiplicar cada vector de posición por el peso específico del pixel que le corresponde antes de sumarlos, y, al final, dividir el resultado entre la suma de los pesos de cada pixel. Obteniendo como resultado una posición promediada por los pesos de los pixeles, que consideraremos el centro de gravedad de la imagen.

vector vectores;
unsigned char * pixeles;

int total = 18 * 9;
ofVec2f vector_promedio(0, 0);
float peso_promedio = 0;

for (int i=0; i<size; i++) {
	/* la posición es distinta en el array de vectores que en la imagen
	porque por cada pixel se almacenan tres valores r, g y b */
	int posicion = vectores[i].y * 3 + vectores[i].x * 3;  
	float gris = 0.2126 * pixeles[posicion] + 0.7152 * pixeles[posicion+1] + 0.0722 * pixeles[posicion+2];
	float peso = gris/255.0;
	vector_promedio += vectores[i] * peso;
	peso_promedio += peso;
}

vector_promedio /= peso_promedio;

centro-de-gravedad_03

https://github.com/alg-a/herm3TICa/tree/master/of2

 
 

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies