130 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
#! /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);
 |