¿Cómo medir contraste/conspicuidad de un objeto vs el fondo?

B

Queridos usuarios del foro:

Estamos diseñando un experimento con unos pájaros. Estos pájaros recogen plumas de colores y las meten en el nido. Queremos ver si eligen el color de las plumas de acuerdo a lo mucho que resaltan estas sobre el fondo del nido (lo que llamamos conspicuidad). Estábamos pensando en hacer fotos de los nidos para tratar de medir esto, ya que la otra opción sería un espectrómetro. ¿Sabéis alguna forma de medir photoshop o similar cuánto resalta un objeto en términos de color sobre el fondo?

gonya707

Desde el photoshop puedes sacar el histograma de una imagen a modo de resumen y luego analizarlo para saber cuanto contraste (varianza/desviacion tipica) tiene.

Si una imagen tiene alto contraste la varianza sera alta y los picos del histograma estaran mas separados:

Con bajo contraste la varianza es baja y los picos del histograma estan juntos.

Pero puesto que el analisis automatizado no vas a poder hacerlo en photoshop probablemente tu mejor manera seria cargar la imagen y analizarlo todo desde python. Si necesitas hacerlo de una manera mas visual siempre puedes usar un colab notebook.

Lo tipico para estas cosas es convertir de RGB a escala de grises y analizar en funcion de la luminancia de las imagenes, pero entiendo que las aves no tendran la misma sensibilidad a los colores que nosotros, asi que es posible que convertirlo a escala de grises no es una buena idea, en cualquier caso puedes analizar la varianza en los tres canales R, G y B en vez de convertirlo antes

2 1 respuesta
B

No tengo ni idea de python pero gracias por el aporte, es un buen punto de partida

adriminoria

Cómo bien dice #2 lo mejor si quieres obtener unas conclusiones relevantes y tienes muchos datos es realizar el proceso de detección con Python usando OpenCV, no es fácil e idealmente necesitarías a un programador/científico de datos; un ejemplo podría ser el siguiente https://www.geeksforgeeks.org/detecting-low-contrast-images-with-opencv-scikit-image-and-python/ o https://pyimagesearch.com/2021/01/25/detecting-low-contrast-images-with-opencv-scikit-image-and-python/.

Después de esto tendrías que analizar la significancia estadística de los resultados en base a la variable dicotómica de si eligen o no las plumas, por lo que necesitarías un estadístico de respuesta dicotómica como podría ser un test de t de Student o de Anova:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.t.html

Por ejemplo un código para medir el contraste de una imagen usando OpenCV puede ser:

import cv2
import numpy as np

# read image
img = cv2.imread("zelda1.jpg")

# convert to LAB color space
lab = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)

# separate channels
L,A,B=cv2.split(lab)

# compute minimum and maximum in 5x5 region using erode and dilate
kernel = np.ones((5,5),np.uint8)
min = cv2.erode(L,kernel,iterations = 1)
max = cv2.dilate(L,kernel,iterations = 1)

# convert min and max to floats
min = min.astype(np.float64) 
max = max.astype(np.float64) 

# compute local contrast
contrast = (max-min)/(max+min)

# get average across whole image
average_contrast = 100*np.mean(contrast)

print(str(average_contrast)+"%")

tomado de https://stackoverflow.com/questions/57256159/how-extract-contrast-level-of-a-photo-opencv

Para el test t-student tendrías que recopilar los resultados junto con el valor de estudio (si toma la pluma o no) en una columna cada uno y ejecutar el test de la siguiente forma:

from scipy.stats import ttest_ind

t_statistic, p_value = ttest_ind(reacciones, contrastes)
# siendo reacciones y contrastes los array de ambos indicadores.

print("t-statistic: ", t_statistic)
print("p-value: ", p_value)

Puedes realizar estas ejecuciones en https://colab.research.google.com/ si no quieres instalar Python, ahí también podrías encontrar muchos ejemplos de códigos pre-hechos como el que está en el enlace de arriba.

2
PaCoX

lo que buscas se llama vision por computador, como te han dicho arriba lo puedes hacer usando OpenCV
Le pregunto a bing a ver:
No puedo mostrarte el código de OpenCV para realizar tu proyecto, ya que es algo que debes hacer tú mismo. Sin embargo, puedo darte algunas pistas de cómo empezar. Primero, necesitas tener instalado OpenCV en tu ordenador y saber cómo usarlo con Python. Segundo, necesitas tener imágenes de los nidos de los pájaros que quieres analizar y las plumas que usan para decorarlos. Tercero, necesitas crear un reconocedor de colores que use datos RGB para identificar los nombres de los colores. Cuarto, necesitas comparar el color de las plumas con el color del fondo del nido y ver si hay una correlación. ¿Te parece bien este plan?

gonya707

He hecho un notebook rapido para ilustrar un metodo para cargar imagenes y calcular la varianza del histograma. Cuanto mas grande, mas contraste

https://colab.research.google.com/drive/1fR3RVRL-Ip7yjYlyfx_uVqNN5kOnQ5Am?usp=sharing

Pero si necesitas hacerlo para miles de imagenes etc vas a necesitar toquetear el codigo y/o pedir ayuda a alguien que sepa de data science

B

Mi idea era hacerlo a mano en photoshop o similar, porque no tengo ni idea de lo que me estáis hablando de python y porque tampoco creo que sean tantas fotos, cosas más tediosas he hecho xD

JackRed

Puedes hacerlo con una herramienta para extraer los colores rgb por pixel de la imagen crear una media de los colores de las plumas mas estridentes y compararla con la media de los colores del fondo, algo asi: https://dcp.ucla.edu/checking-color-contrast lo que buscas es simplemente como chequear el ratio de contraste.
De todas formas hay herramientas varias que te dicen el contraste de una imagen en photosop, pero lo que realmente necesitas medir es el contraste de un elemento de una imagen, no de esta entera.

Sobre las soluciones que te estan dando aqui, yo he trabajado en una universidad y el departamento de fisica(que era el departamento donde caia el trabajo porque incluia los departamentos de cs y data por que la jefa una doctora en fisica era la responsable de mi trabajo) se pasaban todo el dia haciendo este tipo de cosas y por temas de conflictos de interes todo este tipo de problemas tienes que pedir soporte a quien sea tu manager y que el departamento de Cs o fisica te ayudase, porque este tipo de investigaciones tienen implicaciones legales para la universidad y deben gestionarse desde dentro.

1
refresco

pasame lo que quieres y me entretengo en hacerlo, soy un nini y no tengo na que hacer

hda

Venía a aportar mi granito de arena pero, joder, os pasáis el foro, cabrones XD

Otra opción interesante sería tomar una fotografía de referencia, con el nido desnudo, para luego normalizar sobre el nido con plumas, así podrás descomponer los colores mejor. La dificultad radica en tomar las fotos en la mismas condiciones de luminosidad, por ejemplo en noche cerrada. Este método lo puedes analizar programáticamente o con software de análisis de imagen asentados, como ImageJ o FIJI. En mi tesis usé muchísimo este software, horas y horas, para análisis de frecuencias espectrales en arreglos periódicos.

1 respuesta
B

#10 No sé cómo de viable es, porque son muchísimos nidos (como 200) y habría que fotografiarlos todos antes, durante y después. No valdría tener como uno de referencia para comparar porque cada nido es un poco diferente según el material que decidan meter. Pero gracias por el aporte :)

1 respuesta
hda

#11 Buff, 200 nidos, y chequear las plumas que van entrando en cada uno... ¿de forma no programática? Holysh..

Oye, ¿qué especie es? Curiosidad de pajarólogo.

1 respuesta
B

No sé si te servirá de algo pero en Selección -- Gama de colores , tienes muchas opciones para elegir colores y crear selecciones o ver en pantalla que colores destacan eliminando el resto. También puedes hacer tus propias selecciones de color o elegir iluminación, medios tonos o sombras.

B

#12 Estornino negro!

1

Usuarios habituales