From: Gary Bradski Date: Wed, 14 Mar 2012 23:33:16 +0000 (+0000) Subject: Examples of using histograms in python X-Git-Tag: accepted/2.0/20130307.220821~1158 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=41d2a3c8326846a3e7840b81d9cec1c901d90a28;p=profile%2Fivi%2Fopencv.git Examples of using histograms in python --- diff --git a/samples/python2/hist.py b/samples/python2/hist.py new file mode 100755 index 0000000..4b03467 --- /dev/null +++ b/samples/python2/hist.py @@ -0,0 +1,109 @@ +''' This is a sample for histogram plotting for RGB images and grayscale images for better understanding of colour distribution + +Benefit : Learn how to draw histogram of images + Get familier with cv2.calcHist, cv2.equalizeHist,cv2.normalize and some drawing functions + +Level : Beginner or Intermediate + +Functions : 1) hist_curve : returns histogram of an image drawn as curves + 2) hist_lines : return histogram of an image drawn as bins ( only for grayscale images ) + +Usage : python hist.py + +Abid Rahman 3/14/12 debug Gary Bradski +''' + +import cv2,sys +import numpy as np + +bins = np.arange(256).reshape(256,1) + +def hist_curve(im): + h = np.zeros((300,256,3)) + if len(im.shape) == 2: + color = [(255,255,255)] + elif im.shape[2] == 3: + color = [ (255,0,0),(0,255,0),(0,0,255) ] + for ch, col in enumerate(color): + hist_item = cv2.calcHist([im],[ch],None,[256],[0,255]) + cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) + hist=np.int32(np.around(hist_item)) + pts = np.int32(np.column_stack((bins,hist))) + cv2.polylines(h,[pts],False,col) + y=np.flipud(h) + return y + +def hist_lines(im): + h = np.zeros((300,256,3)) + if len(im.shape)!=2: + print "hist_lines applicable only for grayscale images" + #print "so converting image to grayscale for representation" + im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) + hist_item = cv2.calcHist([im],[0],None,[256],[0,255]) + cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) + hist=np.int32(np.around(hist_item)) + for x,y in enumerate(hist): + cv2.line(h,(x,0),(x,y),(255,255,255)) + y = np.flipud(h) + return y + + +if __name__ == '__main__': + + import urllib2 + + if len(sys.argv)>1: + im = cv2.imread(sys.argv[1]) + else : + im = cv2.imread('../cpp/lena.jpg') + print "usage : python hist.py " + + + gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) + + + print ''' Histogram plotting \n + Keymap :\n + a - show histogram for color image in curve mode \n + b - show histogram in bin mode \n + c - show equalized histogram (always in bin mode) \n + d - show histogram for color image in curve mode \n + e - show histogram for a normalized image in curve mode \n + Esc - exit \n + ''' + + cv2.imshow('image',im) + while True: + k = cv2.waitKey(0)&0xFF + if k == ord('a'): + curve = hist_curve(im) + cv2.imshow('histogram',curve) + cv2.imshow('image',im) + print 'a' + elif k == ord('b'): + print 'b' + lines = hist_lines(im) + cv2.imshow('histogram',lines) + cv2.imshow('image',gray) + elif k == ord('c'): + print 'c' + equ = cv2.equalizeHist(gray) + lines = hist_lines(equ) + cv2.imshow('histogram',lines) + cv2.imshow('image',equ) + elif k == ord('d'): + print 'd' + curve = hist_curve(gray) + cv2.imshow('histogram',curve) + cv2.imshow('image',gray) + elif k == ord('e'): + print 'e' + norm = cv2.normalize(gray,alpha = 0,beta = 255,norm_type = cv2.NORM_MINMAX) + lines = hist_lines(norm) + cv2.imshow('histogram',lines) + cv2.imshow('image',norm) + elif k == 27: + print 'ESC' + cv2.destroyAllWindows() + break +