/samples/c/demhist.c
C | 125 lines | 95 code | 23 blank | 7 comment | 10 complexity | a8c3aba9ad0ffcb906fe2356d92b4fe1 MD5 | raw file
Possible License(s): LGPL-2.0, BSD-3-Clause
- #ifdef _CH_
- #pragma package <opencv>
- #endif
- #ifndef _EiC
- #include "cv.h"
- #include "highgui.h"
- #include <stdio.h>
- #endif
- char file_name[] = "baboon.jpg";
- int _brightness = 100;
- int _contrast = 100;
- int hist_size = 64;
- float range_0[]={0,256};
- float* ranges[] = { range_0 };
- IplImage *src_image = 0, *dst_image = 0, *hist_image = 0;
- CvHistogram *hist;
- uchar lut[256];
- CvMat* lut_mat;
- /* brightness/contrast callback function */
- void update_brightcont( int arg )
- {
- int brightness = _brightness - 100;
- int contrast = _contrast - 100;
- int i, bin_w;
- float max_value = 0;
- /*
- * The algorithm is by Werner D. Streidt
- * (http://visca.com/ffactory/archives/5-99/msg00021.html)
- */
- if( contrast > 0 )
- {
- double delta = 127.*contrast/100;
- double a = 255./(255. - delta*2);
- double b = a*(brightness - delta);
- for( i = 0; i < 256; i++ )
- {
- int v = cvRound(a*i + b);
- if( v < 0 )
- v = 0;
- if( v > 255 )
- v = 255;
- lut[i] = (uchar)v;
- }
- }
- else
- {
- double delta = -128.*contrast/100;
- double a = (256.-delta*2)/255.;
- double b = a*brightness + delta;
- for( i = 0; i < 256; i++ )
- {
- int v = cvRound(a*i + b);
- if( v < 0 )
- v = 0;
- if( v > 255 )
- v = 255;
- lut[i] = (uchar)v;
- }
- }
- cvLUT( src_image, dst_image, lut_mat );
- cvShowImage( "image", dst_image );
- cvCalcHist( &dst_image, hist, 0, NULL );
- cvZero( dst_image );
- cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
- cvScale( hist->bins, hist->bins, ((double)hist_image->height)/max_value, 0 );
- /*cvNormalizeHist( hist, 1000 );*/
- cvSet( hist_image, cvScalarAll(255), 0 );
- bin_w = cvRound((double)hist_image->width/hist_size);
- for( i = 0; i < hist_size; i++ )
- cvRectangle( hist_image, cvPoint(i*bin_w, hist_image->height),
- cvPoint((i+1)*bin_w, hist_image->height - cvRound(cvGetReal1D(hist->bins,i))),
- cvScalarAll(0), -1, 8, 0 );
-
- cvShowImage( "histogram", hist_image );
- }
- int main( int argc, char** argv )
- {
- // Load the source image. HighGUI use.
- src_image = cvLoadImage( argc == 2 ? argv[1] : file_name, 0 );
- if( !src_image )
- {
- printf("Image was not loaded.\n");
- return -1;
- }
- dst_image = cvCloneImage(src_image);
- hist_image = cvCreateImage(cvSize(320,200), 8, 1);
- hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
- lut_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );
- cvSetData( lut_mat, lut, 0 );
- cvNamedWindow("image", 0);
- cvNamedWindow("histogram", 0);
- cvCreateTrackbar("brightness", "image", &_brightness, 200, update_brightcont);
- cvCreateTrackbar("contrast", "image", &_contrast, 200, update_brightcont);
- update_brightcont(0);
- cvWaitKey(0);
-
- cvReleaseImage(&src_image);
- cvReleaseImage(&dst_image);
- cvReleaseHist(&hist);
- return 0;
- }
- #ifdef _EiC
- main(1,"demhist.c");
- #endif