Source code for spam.plotting.greyLevelHistogram

"""
Library of SPAM functions for plotting greyscale histogram
Copyright (C) 2020 SPAM Contributors

This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.
"""


import matplotlib.pyplot as plt
import numpy

[docs] def plotGreyLevelHistogram(im, greyRange=None, bins=256, density=False, series=False, showGraph=False): """ Computes a histogram and optionally shows it with matplotlib Parameters ----------- im : an n-d numpy array. If series = True, the first dimension is interpreted as the different times greyRange : 2-component list, optional Value of bottom and top of histogram, Default is guessed from data type, min and max for float bins : int, optional Number of bins to split the range into density : bool, optional Return a PDF or counts? Default = False series : bool, optional Is the input a series of images? Default = False showGraph : bool, optional Show graph? Default = False Returns -------- midBins : 1D numpy.array The middle value of the bins counts : 1D numpy.array Number of counts for each bin (possibly normalised, if requested) """ if greyRange is None: if im.dtype == 'u1': greyRange = [0,256] elif im.dtype == 'u2': greyRange = [0,65536] else: # Probably a float... greyRange = [ im.min(), im.max() ] if series == True: steps = im.shape[0] else: steps = 1 im = [ im.ravel() ] for step in range( steps ): # Define smoothly-varying colour from blue to red in series if series: d = step/float(steps-1) else: d = 0 colour = [ 1.0 - d, 0, d ] counts,binLimits = numpy.histogram( im[step].ravel(), range=greyRange, bins=bins, density=density) binWidth = ( greyRange[1]-greyRange[0] ) / float( bins ) midBins = [0.5*(a+b) for (a, b) in zip(binLimits[:-1], binLimits[1:])] if showGraph == True: if series: plt.plot( midBins, counts, color=colour, label="Step = {}".format(step+1) ) else: plt.plot( midBins, counts, color=colour ) if showGraph == True: #plt.bar( midBins, counts, binWidth, align='center' ) plt.xlabel( "Greylevel" ) plt.ylabel( "Frequency" ) #plt.ylim( [0, sorted( counts )[int(bins*99.5/100)]] ) if series: plt.legend() plt.show() return midBins, counts