/* Programa: Histograma.cpp Descripción: Calcula el histograma de una imagen usando la librería de OpenCV Autor: FJHL Fecha Inicio: 18/Agosto/2016 Fecha Actualización: 19/Agosto/2016 --> Calculamos la imagen con histograma ecualizado y mostramos su histograma correspondiente. Referencia: OpenCV Essentials, 2014 */ #include #include #include //cvRound int main(int argc, char *argv[]){ int histSize = 255; long int dim; cv::Mat hist, image_gray,image_eqh; //Leer la imagen original cv::Mat src = cv::imread("../../../images/flowers8.png"); //Convertir a escala de gris cv::cvtColor(src, image_gray, CV_RGB2GRAY); //Crear ventanas cv::namedWindow("Fuente",0); cv::namedWindow("Imagen en escala de Grises", 0); //cv::namedWindow("Imagen con histograma ecualizado", 0); cv::namedWindow("Histograma", CV_WINDOW_AUTOSIZE); //Procesar el histograma cv::calcHist(&image_gray, 1, 0, cv::Mat(), hist,1, &histSize, 0); //Calcular la imagen con histograma ecualizado //cv::equalizeHist(image_gray,image_eqh); //cv::calcHist(&image_eqh, 1, 0, cv::Mat(), hist, 1, &histSize, 0); //Visualizar el histograma dim = image_gray.rows*image_gray.cols; cv::Mat histImage = cv::Mat::ones(255, 255, CV_8UC(1)) * 255; cv::normalize(hist, hist, 0, histImage.rows, CV_MINMAX, CV_32FC(1)); histImage = cv::Scalar::all(255); int binW = cvRound((double)histImage.cols / histSize); for (int i = 0; i < histSize; i++){ //Dibujar un rectangulo (punto inferior izq, punto superior der) cv::rectangle(histImage,cv::Point(i*binW,histImage.rows),cv::Point((i+1)*binW,histImage.rows-cvRound(hist.at(i))),cv::Scalar::all(0),-1,8,0); } //Mostrar resultados cv::imshow("Fuente",src); cv::imshow("Imagen en escala de Grises", image_gray); //cv::imshow("Imagen con histograma ecualizado", image_eqh); cv::imshow("Histograma", histImage); cv::waitKey(0); return(0); }