Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / octave / demhist.m
diff --git a/samples/octave/demhist.m b/samples/octave/demhist.m
new file mode 100644 (file)
index 0000000..4bb1047
--- /dev/null
@@ -0,0 +1,129 @@
+#! /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);