Ajuste de la exposición (brillo / contraste) según el histogtwig usando Python

Estoy tratando de hacer un progtwig con una GUI (probablemente usando Kivy) en Python para que coincida con la exposición de dos imágenes. Quiero mostrar ambas imágenes (RGB o escala de grises) junto con sus histogtwigs correspondientes y tener un control deslizante para poder controlar la exposición en la imagen seleccionada. Me gustaría un consejo sobre cómo hacer esto.

Hasta ahora he leído varias publicaciones y parece que hay varias formas de aproximar el cálculo del histogtwig de una imagen (numpy, matplotlib, openCV y PIL), pero estoy confundido sobre cuál sería la mejor (menos bibliotecas / dependencias para instalar) ) para que lo implemente. También he leído acerca de cómo cambiar la exposición en una imagen y algunas personas mencionan el cambio en el brillo y el contraste, ¿por lo tanto, es necesario cambiar ambas para cambiar la exposición? Sé que openCV ha igualado aHist pero eso lo hace automáticamente y lo que me gustaría es que ambas imágenes tengan la exposición general más cercana posible; Por eso estaba pensando en hacerlo manualmente. Sería genial si pudiera hacerlo automáticamente, pero todavía estoy pensando en cómo hacerlo.

Sé que ustedes le dan un gran valor a su tiempo, así que lo entenderé si no tiene tiempo para responder esto en profundidad.

Tenemos un ejemplo de ajuste de histogtwig aquí: http://scikit-image.org/docs/dev/auto_examples/plot_equalize.html#example-plot-equalize-py

Sin embargo, parece que estás interesado en la comparación de histogtwigs. Tengo algún código para ese propósito aquí, pero no está bien probado:

https://github.com/stefanv/supreme/blob/master/supreme/photometry/register.py#L30

Si encuentra ese código útil, no dude en realizar una solicitud de extracción a scikit-image y podemos intentar integrarlo en el paquete.

Vamos a definir el término de exposición que usas. Puede exponer escenas shinys y oscuras durante, por ejemplo, 1 segundo y tener imágenes totalmente diferentes. Alternativamente, es posible que desee que las imágenes tengan contrastes similares, pero esto no significa necesariamente la misma exposición.

Como mencionó la ecualización de histogtwigs, eventualmente puede igualar los histogtwigs de dos imágenes para que se vean con el mismo contraste. La ecualización del histogtwig hará que cada histogtwig de la imagen se vea plano, por lo que todas las intensidades son igualmente probables (y por lo tanto se distribuyen de manera óptima para maximizar el contraste, no siempre un efecto agradable a la vista). Es posible que desee crear sus propios perfiles de histogtwig no planos individualmente para cada imagen y modificarlos hasta que las imágenes tengan el aspecto que usted desea.

Aquí hay un pseudocódigo: 1. Calcule un histogtwig de cada imagen: H [i] 2. Suma los histogtwigs como histogtwigs acumulativos: C [i] = H [i] + C [i-1] para cada imagen por separado; 3. Normalice cada uno: C [i] / = sum (C (i)) 4. En la ecualización tradicional de histogtwigs, vuelve a asignar las intensidades de píxeles para que sean igualmente probables: i2 = 255 * C [i1]; en su caso, solo desea que sigan su propio perfil de histogtwig (para que pueda tener un control deslizante para modificar la distribución de la intensidad de cada imagen y luego comparar los resultados visualmente); por ejemplo, intente algo como esta reasignación: i2 = i1 * k + 255 * C [i1] * (1-k), donde el control deslizante cambia los valores de k, de 0.0 a 1.0. Cuando k = 1 obtiene su imagen original y cuando k = 0 tiene ecualización completa del histogtwig. A continuación se muestra una función de ecualización de histogtwig que utilicé para el mapeo de color de la profundidad de Kinect que tiene 10000 niveles a 255 niveles de gris. Tendrá que modificar y ajustar la función para su caso.

// histogram equalization float histEq[10000]; void histEqualize(unsigned short* src, unsigned short* dst, int sz) { if (sz==0) return; memset(histEq, 0, DEPTH_LEVELS*sizeof(float)); // 1. depth histogram for (int i=0; i0) dst[i] = (unsigned char)(255-histEq[src[i]]+0.5f); else dst[i] = 0; } } // histEqualization()