130 lines
2.9 KiB
Mathematica
130 lines
2.9 KiB
Mathematica
|
#! /usr/bin/env octave
|
||
|
cv;
|
||
|
highgui;
|
||
|
|
||
|
file_name = "../c/baboon.jpg";
|
||
|
|
||
|
global Gbrightness;
|
||
|
global Gcontrast;
|
||
|
global hist_size;
|
||
|
global ranges;
|
||
|
global src_image;
|
||
|
global dst_image;
|
||
|
global hist_image;
|
||
|
global hist;
|
||
|
global lut;
|
||
|
|
||
|
_brightness = 100;
|
||
|
_contrast = 100;
|
||
|
Gbrightness = 100;
|
||
|
Gcontrast = 100;
|
||
|
|
||
|
hist_size = 64;
|
||
|
range_0={0,256};
|
||
|
ranges = { range_0 };
|
||
|
src_image=[];
|
||
|
dst_image=[];
|
||
|
hist_image=[];
|
||
|
hist=[];
|
||
|
lut=cvCreateMat(256,1,CV_8U);
|
||
|
|
||
|
## brightness/contrast callback function
|
||
|
function update_brightness( val )
|
||
|
global Gbrightness # global tag is required, or we get UnboundLocalError
|
||
|
Gbrightness = val;
|
||
|
update_brightcont( );
|
||
|
endfunction
|
||
|
|
||
|
function update_contrast( val )
|
||
|
global Gcontrast; # global tag is required, or we get UnboundLocalError
|
||
|
Gcontrast = val;
|
||
|
update_brightcont( );
|
||
|
endfunction
|
||
|
|
||
|
function update_brightcont()
|
||
|
global Gbrightness;
|
||
|
global Gcontrast;
|
||
|
global hist_size;
|
||
|
global ranges;
|
||
|
global src_image;
|
||
|
global dst_image;
|
||
|
global hist_image;
|
||
|
global hist;
|
||
|
global lut;
|
||
|
global cvCalcHist; # use cv namespace for these instead
|
||
|
global cvZero;
|
||
|
global cvScale;
|
||
|
|
||
|
brightness = Gbrightness - 100;
|
||
|
contrast = Gcontrast - 100;
|
||
|
max_value = 0;
|
||
|
|
||
|
## The algorithm is by Werner D. Streidt
|
||
|
## (http://visca.com/ffactory/archives/5-99/msg00021.html)
|
||
|
if( contrast > 0 )
|
||
|
delta = 127.*contrast/100;
|
||
|
a = 255./(255. - delta*2);
|
||
|
b = a*(brightness - delta);
|
||
|
else
|
||
|
delta = -128.*contrast/100;
|
||
|
a = (256.-delta*2)/255.;
|
||
|
b = a*brightness + delta;
|
||
|
endif
|
||
|
|
||
|
for i=0:256-1,
|
||
|
v = cvRound(a*i + b);
|
||
|
if( v < 0 )
|
||
|
v = 0;
|
||
|
endif
|
||
|
if( v > 255 )
|
||
|
v = 255;
|
||
|
endif
|
||
|
lut(i) = v;
|
||
|
endfor
|
||
|
|
||
|
cvLUT( src_image, dst_image, lut );
|
||
|
cvShowImage( "image", dst_image );
|
||
|
|
||
|
cvCalcHist( dst_image, hist, 0, [] );
|
||
|
cvZero( dst_image );
|
||
|
[min_value, max_value] = cvGetMinMaxHistValue( hist );
|
||
|
cvScale( hist.bins, hist.bins, double(hist_image.height)/max_value, 0 );
|
||
|
##cvNormalizeHist( hist, 1000 );
|
||
|
|
||
|
cvSet( hist_image, cvScalarAll(255));
|
||
|
bin_w = cvRound(double(hist_image.width)/hist_size);
|
||
|
|
||
|
for i=0:hist_size-1,
|
||
|
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 );
|
||
|
endfor
|
||
|
|
||
|
cvShowImage( "histogram", hist_image );
|
||
|
endfunction
|
||
|
|
||
|
|
||
|
## Load the source image. HighGUI use.
|
||
|
if size(argv, 1)>1
|
||
|
file_name = argv(){1}
|
||
|
endif
|
||
|
|
||
|
src_image = cvLoadImage( file_name, 0 );
|
||
|
|
||
|
if (!swig_this(src_image))
|
||
|
printf("Image was not loaded.\n");
|
||
|
exit(-1);
|
||
|
endif
|
||
|
|
||
|
|
||
|
dst_image = cvCloneImage(src_image);
|
||
|
hist_image = cvCreateImage(cvSize(320,200), 8, 1);
|
||
|
hist = cvCreateHist({hist_size}, CV_HIST_ARRAY, ranges, 1);
|
||
|
|
||
|
cvNamedWindow("image", 0);
|
||
|
cvNamedWindow("histogram", 0);
|
||
|
|
||
|
cvCreateTrackbar("brightness", "image", _brightness, 200, @update_brightness);
|
||
|
cvCreateTrackbar("contrast", "image", _contrast, 200, @update_contrast);
|
||
|
|
||
|
update_brightcont();
|
||
|
cvWaitKey(0);
|