def createHist(img): #cv.CvtColor(img,img,cv.CV_BGR2HSV) b_plane = cv.CreateImage((img.width,img.height), 8, 1) g_plane = cv.CreateImage((img.width,img.height), 8, 1) r_plane = cv.CreateImage((img.width,img.height), 8, 1) cv.Split(img,b_plane,g_plane,r_plane,None) planes = [b_plane, g_plane, r_plane] bins = 4 b_bins = bins g_bins = bins r_bins = bins hist_size = [b_bins,g_bins,r_bins] b_range = [0,255] g_range = [0,255] r_range = [0,255] ranges = [b_range,g_range,r_range] hist = cv.CreateHist(hist_size, cv.CV_HIST_ARRAY, ranges, 1) cv.CalcHist([cv.GetImage(i) for i in planes], hist) cv.NormalizeHist(hist,1) return hist
def hs_histogram(src, mask=None): '''Takes a cvMat and computes a hue-saturation histogram (value is dropped)''' # Convert to HSV # Allocate the 3 HSV 8 bit channels hsv = cv.CreateImage(cv.GetSize(src), 8, 3) # Convert from the default BGR representation to HSV cv.CvtColor(src, hsv, cv.CV_BGR2HSV) # Extract the H and S planes h_plane = cv.CreateMat(src.rows, src.cols, cv.CV_8UC1) s_plane = cv.CreateMat(src.rows, src.cols, cv.CV_8UC1) v_plane = cv.CreateMat(src.rows, src.cols, cv.CV_8UC1) # Copy out omitting the values we don't want cv.Split(hsv, h_plane, s_plane, v_plane, None) planes = [h_plane, s_plane] if 0: pplane('H plane', h_plane, prefix=' ') pplane('S plane', s_plane, prefix=' ') h_bins = 8 s_bins = 8 #hist_size = [h_bins, s_bins] # hue varies from 0 (~0 deg red) to 180 (~360 deg red again # ??? My values give a hue of 0-255 h_ranges = [0, 255] # saturation varies from 0 (black-gray-white) to # 255 (pure spectrum color) s_ranges = [0, 255] ranges = [h_ranges, s_ranges] # Allocate bins # note that we haven't put any data in yet #1: uniform hist = cv.CreateHist([h_bins, s_bins], cv.CV_HIST_ARRAY, ranges, 1) # Convert the array planes back into images since thats what CalcHist needs? # Doc seems to indcate that cvMat will work as well # Doesn't this cross the hue and saturate values together? That doesn't seem to make sense, like comparing red to blue # Guess its a 2D histogram so it deals with where they overlap cv.CalcHist([cv.GetImage(i) for i in planes], hist, 0, mask) cv.NormalizeHist(hist, 1.0) return hist
def compute_histogram(src, bins=255): hist = cv.CreateHist([255], cv.CV_HIST_ARRAY, ranges=[(0, 256)]) cv.CalcHist([src], hist) #compute histogram cv.NormalizeHist(hist, 1.0) #normalize hist return hist
import cv2.cv as cv im = cv.LoadImage("meinv.jpg", cv.CV_8U) cv.SetImageROI(im, (1, 1, 30, 30)) histsize = 256 #Because we are working on grayscale pictures hist = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0, histsize]], 1) cv.CalcHist([im], hist) cv.NormalizeHist( hist, 1) # The factor rescale values by multiplying values by the factor _, max_value, _, _ = cv.GetMinMaxHistValue(hist) if max_value == 0: max_value = 1.0 cv.NormalizeHist(hist, 256 / max_value) cv.ResetImageROI(im) res = cv.CreateMat(im.height, im.width, cv.CV_8U) cv.CalcBackProject([im], res, hist) cv.Rectangle(im, (1, 1), (30, 30), (0, 0, 255), 2, cv.CV_FILLED) cv.ShowImage("Original Image", im) cv.ShowImage("BackProjected", res) cv.WaitKey(0)