mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.1 KiB
127 lines
3.1 KiB
#ifdef _CH_ |
|
#pragma package <opencv> |
|
#endif |
|
|
|
#define CV_NO_BACKWARD_COMPATIBILITY |
|
|
|
#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 |
|
|
|
|