The bins of the color or intensities histograms are common features that are used in many kinds of applications. In my case, I am interested on them because I want them as the input of a classifier of images (Adaboost that I explained in my previous post). For that reason I have a couple extra requirements that I will explain later on this post.

There are different ways of representing the colors of an image. A very common and natural one is the combination of the three primary colors: Red, Green and Blue. Each pixel in an image is basically a combination of values of these three colors. The higher the value, the higher the intensity. These values are always in the range of 0 to 255. Then it is possible to think in a histogram of, for example, red for a particular image. We could have at most 256 bins (potentially less if we want to join several bins into one). Each bin would have the total number of pixels that have a particular intensity of red. Then, we repeat the process for green and blue.

I found this code that is able to build three histograms, one for each color by simple call:

% 1. Read the image im = imread('/path/to/image'); % 2. Calculate the histogram with 256 bins hist = imHistogram(im,256);

Moreover, you also can calculate intensities histograms by just transforming the color image into a gray scale image. The main difference is that instead of three histograms for three colors the method is going to return just one histogram of 256 values with the intensities.

% 1. Read the image im = imread('/path/to/image'); % 2. verify that it is a color image if isrgb(im) % 3. transform it im = rgb2gray(im); endif % 4. calculate the histogram with 256 bins hist = imHistogram(im,256);

This worked perfect on Octave (a free open source alternative to Matlab) but I had two small issues related with my particular problem:

1. I needed a linear representation of the histograms because I wanted to use the values as the input of a classifier (Adaboost that I explained in my previous post). Instead of three separated histograms represented in different vectors of 256 bin each, I needed just one big vector of 768 with the three histograms next to the other. That was not difficult to solve.

% 1. read the image im = imread('path/to/image'); % 2. calculate the histogram with 256 bins hist = imHistogram(im,256); % 3. make the vector of the right size (768) linear = zeros(1,numel(hist)); % 4. copy the values to the new vector linear(:) = hist(:);

2. My second problem was a bit more particular. I needed to process a big collection of images and I found out some of them were in gray scale. This cause an inconsistency in the size of the vectors. As I said before, the gray scale just have one value that defines the intensity instead of three values of the three colors. I solved it by copying the vector three times when I found that a image was gray (i.e. the imHistogram returns a vector of 256).

% 1. read the image im = imread('/path/to/image'); % 2. check if it is gray if !isrgb(im) % 3. calculate the histogram with 256 bins hist = imHistogram(im, 256); % 4. create a new vector of the right size linear = zeros(1,numel(hist)); % 5. copy the values to the new vector linear(:) = hist(:); endif

My final method looks like this:

%linearHistogram.m function linear = linearHistogram(im, bins) % check if it is a color image if isrgb(im) % calculate the histogram with 256 bins per color hist = imHistogram(im, bins); % create a new vector of the right size linear = zeros(1,numel(hist)); % copy the values to the new vector linear(:) = hist(:); else % calculate the histogram hist = imHistogram(im, bins); % create a new vector of three times the size linear = zeros(1,length(hist)*3); % set the same histogram to the three sections linear(1:256) = linear(257:512) = linear(513:768) = hist(:); endif

You can see that it receives the image as a parameter, so you need 2 instructions to call it.

% 1. Read the image im = imread('/path/to/image'); % 2. Calculate the linear histogram with 256 bins hist = linearHistogram(im,256);