So, I have spent the morning working on some histogram plotting routines in Julia – useful if you want to visualize an image histogram, or save it for later use in file format. Now Julia does not come with any native plotting libraries, but there are the likes of Gadfly, and PyPlot. For todays activity I chose PyPlot, which effectively uses the Julia PyCall package to call Python’s matplotlib directly from Julia (it’s not all a bed of roses though – you do have to make some syntax changes).
Firstly I wanted a function to derive a simple histogram, in the form of a curve. The function plotHist() takes an image (grayscale) histogram vector as input, and plots the visual histogram to file: histogram.png. This function also has the alternative of plotting to a console window.
function plotHist(hst, show=false) PyPlot.plot(hst) PyPlot.xlabel("Intensities") PyPlot.xlim([0, 256]) PyPlot.yticks() if (show) PyPlot.show() end PyPlot.savefig("histogram.png") end
Here is an example of the output produced:
Next, a function plotRGBhist() to plot all three components of a colour RGB image in one histogram. This function takes a colour image as input, splits off each of the components, and finds the individual histograms (using getIMGhist() ), and then plots them by means of overlaying them, saving the resulting picture of the histogram in histogramRGB.png.
function plotRGBhist(img) # Convert image to vector dx, dy, dz = size(img) imgR = img[:,:,1] imgG = img[:,:,2] imgB = img[:,:,3] hstR = getIMGhist(imgR) hstG = getIMGhist(imgG) hstB = getIMGhist(imgB) PyPlot.plot(hstR, color="red", linewidth=2.0, label="Red") PyPlot.plot(hstG, color="green", linewidth=2.0, label="Green") PyPlot.plot(hstB, color="blue", linewidth=2.0, label="Blue") PyPlot.xlabel("Intensities") PyPlot.xlim([0, 256]) PyPlot.yticks() PyPlot.legend(fontsize=10) PyPlot.savefig("histogramRGB.png") end
Here is a sample output:
Lastly, a function which takes an alternative approach to plotting the histogram of a grayscale image. In the function plotIMGhist(), a grayscale image is input, and the resulting histogram is in the form of a solid histogram, using vertical bars.
function plotIMGhist(img) # Convert image to vector dx, dy = size(img) imgV = vec(reshape(img,1,dx*dy)) common_params = Dict( :bins => 256, :range => (0, 255), :normed => false, :color => "black") PyPlot.yticks() PyPlot.xlabel("Intensities") PyPlot.plt[:hist](imgV; common_params... ); PyPlot.savefig("histogramIMG.png") end
The image is first converted to a vector, and then applied using the matplotlib function hist(). Note that due to conflicts with Julia’s built-in function hist(), in order to use matplotlib.pyplot.hist, one has to use PyPlot.plt[:hist]. Also notice the use of the Dict expression for the parameters to hist.
Here is a sample: