Ulises Alejandro
290554
Ramos Juárez.
TAREA 4
Ecualización del histograma.
FECHA 24/03/2023
Visión por computadora
Catedrático: Dr. Vargas Vázquez Damián.
Materia: Visión por computadora.
1
INDICE
INTRODUCCIÓN. ......................................................................................................................... 3
OBJETIVOS. .................................................................................................................................. 3
MARCO TEÓRICO........................................................................................................................ 3
Detección de objetos ................................................................. ¡Error! Marcador no definido.
Análisis de imágenes o videos .................................................. ¡Error! Marcador no definido.
Comparación estadística ........................................................... ¡Error! Marcador no definido.
Trackbar. ................................................................................... ¡Error! Marcador no definido.
Eventos del mouse. ................................................................... ¡Error! Marcador no definido.
METODOLOGÍA. .......................................................................................................................... 4
Pseudocódigo. ............................................................................................................................. 4
Diagrama de flujo ....................................................................................................................... 4
Código. ........................................................................................................................................ 4
RESULTADOS............................................................................................................................... 7
CONCLUSIONES. ....................................................................................................................... 11
REFERENCIAS BIBLIOGRÁFICAS Y ANEXOS. ................................................................... 11
Visión por computadora
2
INTRODUCCIÓN.
El análisis y procesamiento de imágenes se realiza a través de computadoras, debido a la
complejidad y el número de cálculos necesarios para realizarlo. Es por esto que, si bien la
formulación matemática necesaria para su realización data de varios siglos atrás, la posibilidad
real de utilizarla de forma cotidiana en la práctica clínica ha sido posible recién en las últimas
décadas, gracias al avance en las tecnologías del hardware.
La proliferación de nuevos equipamientos con capacidad para realizar millones de operaciones por
segundo y su extensión a la vida cotidiana y a todo tipo de usuario, ha hecho posible que el análisis
y procesamiento de imágenes digitales se constituya en un gran campo de estudio. En la actualidad,
esta tecnología se encuentra incorporada incluso en todo tipo de equipamiento doméstico, como
cámaras digitales, scaners y teléfonos celulares, entre otros.
En la actualidad, las imágenes constituyen un lenguaje en sí mismas. Dependiendo de diferentes
factores culturales, las imágenes son utilizadas para transmitir mensajes, símbolos y distintos tipos
de información. Por esto, es necesario contar con un soporte para la representación digital de las
imágenes que permita luego modificar el mismo a fin de o bien modificar el contenido visual y
simbólico u obtener información necesaria.
OBJETIVOS.
Aplicar la ecualización del histograma en imágenes a color con el formato RGB y en los modelos
de color HSV y HLS. Realice una comparación del cambio de iluminación cuando la ecualización
es aplicada a: a) los 3 canales y b) solo al canal de la iluminación (canal V en el modelo HSV y
canal L en el modelo HLS). Añadir histogramas para apreciar el proceso de expansión del
histograma.
MARCO TEÓRICO.
A continuación se definirán algunos conceptos importantes para poder comprender de mejor
manera el ejercicio:
Ecualización de un histograma.
Es una técnica muy sencilla que se usa para mejorar el contraste general de una imagen.
Estos son los pasos básicos que sigue el algoritmo:
1. Se calcula el histograma de color de la imagen.
2. Se distribuyen de forma equitativa los valores de píxeles más comunes (es decir, aquellos
Visión por computadora
pertenecientes a los bins más altos en el histograma).
3. Se le da una tendencia lineal a la función de distribución acumulativa (en inglés, CDF,
cumulative distribution function).
3
METODOLOGÍA.
Pseudocódigo.
INICIO
Declarar las una sola imagen fuente y varias para los parámetros del rgb, hsv, hls, de los
histogramas y de la imagen ecualizada, asi como matrices auxiliares.
Mostramos la imagen original.
Calculamos el histograma de la imagen original separando por vectores los colores y trabajándolos
de forma individual,
Generamos la ecualización de cada canal junto con su histograma correspondiente
Mandamos a mostrar las imágenes resultantes.
Esperar una tecla cualquiera.
FIN
Diagrama de flujo
Código.
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("C:/Users/ale_r/Documents/8vo semestre/Visión por
computadora/Tareas/Tarea 5/src.jpg", IMREAD_COLOR );
vector<Mat> bgr_planes;
split( src, bgr_planes );
int histSize = 256;
float range[] = { 0, 256 }; //the upper boundary is exclusive
const float* histRange[] = { range };
bool uniform = true, accumulate = false;
Visión por computadora
Mat b_hist, g_hist, r_hist;
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRange,
uniform, accumulate );
calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, histRange,
uniform, accumulate );
4
calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, histRange,
uniform, accumulate );
int hist_w = 512, hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );
Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h -
cvRound(b_hist.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h -
cvRound(g_hist.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
Scalar( 0, 255, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h -
cvRound(r_hist.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
}
vector<Mat> canal;
split( img, canal);
namedWindow("Blue Channel", CV_WINDOW_NORMAL );
imshow("Blue Channel", canal[0]);
namedWindow("Green Channel", CV_WINDOW_NORMAL );
imshow("Green Channel", canal[1]);
namedWindow("Red Channel", CV_WINDOW_NORMAL );
imshow("Red Channel", canal[2]);
Mat original;
merge(canal, original);
namedWindow("ORIGINAL", CV_WINDOW_NORMAL );
imshow("ORIGINAL", original);
Visión por computadora
Mat zero = Mat::zeros(img.size(), CV_8UC1);
Mat B[] = {canal[0],zero,zero};
Mat G[] = { zero, canal[1], zero };
Mat R[] = { zero, zero, canal[2] };
Mat blue, green, red;
merge(B, 3, blue);
5
merge(G, 3, green);
merge(R, 3, red);
namedWindow("Blue Channel color", CV_WINDOW_NORMAL );
imshow("Blue Channel color", blue);
namedWindow("Green Channel color", CV_WINDOW_NORMAL );
imshow("Green Channel color", green);
namedWindow("Red Channel color", CV_WINDOW_NORMAL );
imshow("Red Channel color", red);
cvtColor( src, src, COLOR_BGR2GRAY );
Mat dst;
equalizeHist( src, dst );
split( dst, bgr_planes );
Mat b_hist2, g_hist2, r_hist2;
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist2, 1, &histSize, histRange,
uniform, accumulate );
calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist2, 1, &histSize, histRange,
uniform, accumulate );
calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist2, 1, &histSize, histRange,
uniform, accumulate );
Mat histImage2( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );
normalize(b_hist2, b_hist2, 0, histImage2.rows, NORM_MINMAX, -1, Mat() );
normalize(g_hist2, g_hist2, 0, histImage2.rows, NORM_MINMAX, -1, Mat() );
normalize(r_hist2, r_hist2, 0, histImage2.rows, NORM_MINMAX, -1, Mat() );
for( int i = 1; i < histSize; i++ )
{
line( histImage2, Point( bin_w*(i-1), hist_h -
cvRound(b_hist2.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(b_hist2.at<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
line( histImage2, Point( bin_w*(i-1), hist_h -
cvRound(g_hist2.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(g_hist2.at<float>(i)) ),
Scalar( 0, 255, 0), 2, 8, 0 );
line( histImage2, Point( bin_w*(i-1), hist_h -
cvRound(r_hist2.at<float>(i-1)) ),
Point( bin_w*(i), hist_h - cvRound(r_hist2.at<float>(i)) ),
Visión por computadora
Scalar( 0, 0, 255), 2, 8, 0 );
}
namedWindow("Equalized Image",CV_WINDOW_NORMAL);
imshow( "Equalized Image", dst );
namedWindow("Source image",CV_WINDOW_NORMAL);
imshow( "Source image", src );
6
imshow("Histograma original", histImage );
imshow("Histograma ecualizado", histImage2);
waitKey();
return EXIT_SUCCESS;
}
RESULTADOS.
Visión por computadora
7
Visión por computadora
8
Visión por computadora
9
Visión por computadora
10
CONCLUSIONES.
En el histograma se observa que la mayoría de los píxeles tienen valores cercanos a cero
(consistente con una imagen oscura). Para aumentar el contraste de esta imagen necesitamos
ecualizar el histograma, o sea expandirlo en todo el rango de valores de 0 a 255.
El contraste de fondo ha mejorado después de la ecualización del histograma. Sin embargo, si
comparamos la cara de la estatua en ambas imágenes, notamos que hemos perdido la mayor parte
de la información debido al exceso de brillo. Esto es debido a que su histograma no está confinado
a una región en particular como vimos en casos anteriores (Trate de trazar el histograma de la
imagen de entrada, obtendrá más intuición).
REFERENCIAS BIBLIOGRÁFICAS Y ANEXOS.
• DOXYGEN, (2021), Open CV Open Source Computer Vision. obtenido de:
https://docs.opencv.org/3.4/d0/d90/group__highgui__window__flags.html#gga927593befdd
dc7e7013602bca9b079b0a8f2ec5fd35fe3f4b696518b146dcf675
Visión por computadora
11