Update to 2.0.0 tree from current Fremantle build
[opencv] / samples / swig_python / demhist.py
diff --git a/samples/swig_python/demhist.py b/samples/swig_python/demhist.py
new file mode 100755 (executable)
index 0000000..12cc168
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/python
+from opencv.cv import *
+from opencv.highgui import *
+import sys
+
+file_name = "../c/baboon.jpg";
+
+_brightness = 100
+_contrast = 100
+Gbrightness = 100
+Gcontrast = 100
+
+hist_size = 64
+range_0=[0,256]
+ranges = [ range_0 ]
+src_image=None
+dst_image=None
+hist_image=None
+hist=None
+lut=cvCreateMat(256,1,CV_8U)
+
+# brightness/contrast callback function
+def update_brightness( val ):
+    global Gbrightness    # global tag is required, or we get UnboundLocalError
+    Gbrightness = val
+    update_brightcont( )
+
+def update_contrast( val ):
+    global Gcontrast     # global tag is required, or we get UnboundLocalError
+    Gcontrast = val
+    update_brightcont( )
+
+def update_brightcont():
+    # no global tag required for images ???
+
+    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;
+
+    for i in range(256):
+        v = cvRound(a*i + b);
+        if( v < 0 ):
+            v = 0;
+        if( v > 255 ):
+            v = 255;
+        lut[i] = v;
+    
+    cvLUT( src_image, dst_image, lut );
+    cvShowImage( "image", dst_image );
+
+    cvCalcHist( dst_image, hist, 0, None );
+    cvZero( dst_image );
+    min_value, max_value = cvGetMinMaxHistValue( hist );
+    cvScale( hist.bins, hist.bins, float(hist_image.height)/max_value, 0 );
+    #cvNormalizeHist( hist, 1000 );
+
+    cvSet( hist_image, cvScalarAll(255));
+    bin_w = cvRound(float(hist_image.width)/hist_size);
+
+    for i in range(hist_size):
+        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 );
+
+
+if __name__ == "__main__":
+    # Load the source image. HighGUI use.
+    if len(sys.argv)>1:
+        file_name = sys.argv[1]
+
+    src_image = cvLoadImage( file_name, 0 );
+
+    if not src_image:
+        print "Image was not loaded.";
+        sys.exit(-1)
+
+
+    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);