l'image de fond

fr       en

Gray Level Image Processing

histogramme

Method

To make the histogram of an image, it's count how many pixels exist for each possible value that a pixel can take. If we have a gray level image where the values ??are represented to 8 bits, we will have a histogram of 255 values. 8 bits gives 28 possible values .
To make this processing, we create a vector hist whose size is defined by the number of possible different value of pixel (ie size = 2k where k is the number of bits for gray level ) and we put all of them to zero, then we must scan the entire picture, line by line and column by column. For each value of a pixel, we increase the value of the histogram associated with that value. for example, if we find the pixel value 200 then hist (200) = hist (200) + 1.

Here is the program that performs the histogram.

clear all; close all;

[filename, pathname] = uigetfile({'*.jpg;*.tif;*.PNG;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg') % récupération du chemin du fichier

x = imread(filename); % récupération des données


if (length(size(x))>2)% si l'image en niveau de gris est sur 3 composantes couleurs
    x=x(:,:,1);% on prend un seul plan
end

% nombre de bit de la valeur des pixels
k = whos('x');
if k.class == 'uint8'
    k=8;
elseif k.class == 'int16'
    k=16;
elseif k.class == 'int32'
    k=32;
elseif k.class == 'int64'
    k=64
end
 
%taille de la matrice
[ligne colonne]=size(x);
hist = zeros(2^k,1);% création du vecteur de résultat
 for i=1:ligne %on parcourt toutes les lignes
     for j=1:colonne %on parcourt toutes les colonnes
         hist(x(i,j)+1) = hist(x(i,j)+1)+1;% on compte les valeurs
     end
 end
 % affichage de l'image et de l'histogramme
 figure(1)
 subplot(222)
 imshow(x)
 subplot(221)
 plot([0:(2^k)-1],hist)

The program have been applyed on left image, the result is shown to the right.
pre histogramme

The histogram gives us information on the distribution of pixel values ??in the image. An histogram with many values ??near zero mean a picture under exposed (dark image) while an histogram which have high values lead an over exposed image (image very bright). The average of this histogram shows the value which separates the histogram into two identical parts. It shows where is the majority of pixels. With the previous example we obtain a mean value of 116.9947, it is called Average Optical Density (AOD). It is calculated as .

aod=sum(hist.*[0:(2^k)-1]')/(ligne*colonne)

Linear correction

On certain image, the histogram is used to apply a correction. Imagine an image where the large majority (see all) of pixels are located on a small part of possible values. Example only from 30 to 100 for an image of 8 bits (255 values at all). In this case the color (gray level) are distributed over a very short range. It difficult to differentiate them with the eye. The correction will help to spread the colors over the entire range. With the above example the pixels with ??30 values will be put to a zero value and the others will be spread over all the 255 values possible.

for i=1:ligne
       for j=1:colonne
         img(i,j) = round((img(i,j)-bas)*(255/haut));
       end
     end

Where bas is the value which will go to zero and haut the value which will go to 255 (or the maximal)

let'see the result on an under exposed image.
histogramme d'une image

Logarithmic Correction

This type of correction is applied to the image with a high concentration of point either in the dark (close to zero) in the light (close to 255). The goal is to spread the pixels in a nonlinear way. If it's a dark image, we will space the pixel which are low values and close in them when they are high. the same methodology applies if the picture is bright but the reasoning in reverse ( inverse the logaritm fonction ).
How do it? We will make the correction as linear but instead of applying a proportional transformation, it is logarithmic. for example an image or k = 8, the logarithm is 0 to 255, as the next equation:

for i= 1:255
    hist(i)=round(log(i)*((2^k)/log(2^k)));
end
plot(hist)

We find the following curve:
histogrammelog1
We will again go through all pixels and each pixel value found (abscyss) we associate the value log (ordinate). In this way dark pixels are spaced in the color space and the eye see them better. When the pixel are white, which are less many, they are condensed on very little range value (they are less important because fewer many).
The result:
histogramme logarithme

Correction by cumulative sum of histogram

This time, we will use the histogram of the original image to construct a nonlinear function. For this function we will follow several steps.


histogramme cumulé
Then, as for Previous corrections, we apply the function for each pixel.
Matlab program:

clear all; close all;

[filename, pathname] = uigetfile({'*.jpg;*.tif;*.PNG;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg') % récuperation du chemin du fichier

x = imread(filename); % récuperation des données


if (length(size(x))>2)% si l'image en niveau de gris est sur 3 composantes couleurs
    x=x(:,:,1);% on prend un seul plan
end

% nombre de bit de la valeur des pixel
info = whos('x');
if strcmp(info.class,'uint8')
    k=8;
elseif strcmp(info.class,'uint16')
    k=16;
elseif strcmp(info.class,'uint32')
    k=32;
elseif strcmp(info.class,'uint64')
    k=64;
end
 
%taille de la matrice
[ligne colonne]=size(x);
hist = zeros(2^k,1);% création du vecteur de résultat
 for i=1:ligne %on parcourt toutes les lignes
     for j=1:colonne %on parcourt toutes les colonnes
         hist(x(i,j)+1) = hist(x(i,j)+1)+1;% on compte les valeurs
     end
 end
 %normalisation d'histogramme
 hist=hist/(ligne*colonne);
 %somme cumulative de l'histogramme normalisé
 histsum = cumsum(hist);
  % dénormalisation
 histsum=round(histsum*2^k);

 % affichage de l'image et de l'histogramme
 figure(1)
 subplot(222)
 imshow(x)
 subplot(221)
 plot([0:(2^k)-1],hist)

 
 
  for i=1:ligne
     for j=1:colonne
         x(i,j) = histsum(x(i,j)+1);
     end
  end
 
 
  hist = zeros(2^k,1);
 for i=1:ligne
     for j=1:colonne
         hist(x(i,j)+1) = hist(x(i,j)+1)+1;
     end
 end

 subplot(224)
 imshow(x)
 subplot(223)
 plot([0:(2^k)-1],hist)
         

And the result

histogramme d'une image

Copyright © 2010-2014, all rights reserved, contact: operationpixel@free.fr