l'image de fond

fr       en

Traitements d'Images Binaires

La Binarisation

Transformation d'une image couleur ou en niveaux de gris en image binaire

Afin de pouvoir effectuer des traitements sur des images binaires, il faut d'abord en posséder. Nous allons donc apprendre à transformer des images en binaire. La binarisation consiste à transformer un pixel sur plusieurs bits (2, 4 , 8 ou plus) en une image sur 1 bit. Pour ça, nous allons faire un seuillage. Si la valeur du pixel est en dessous du seuil, nous lui associons la valeur 0. Si la valeur du pixel est égale ou supérieure au seuil nous lui donnons la valeur 1. Si l'image est en niveau de gris il n'y a pas de problème car il n'y a qu'une seule composante de couleur. C'est à dire que un pixel est codé avec un nombre. En ce qui concerne les images couleur, c'est différent. En effet nous avons 3 composantes de couleur (rouge bleu vert par exemple). La première étape consiste donc à transformer une image en couleurs en niveaux de gris puis en image binaire. La moyenne des composantes d'un pixel revient à le transformer en niveau de gris.

if (length(size(x))>2)
        x=mean(x,3);% on prend une seul plan image noir et blanc chaque plan sont egaux
    end

La binarisation simple

En plaçant le seuil au milieu de l'échelle des valeurs ( k=8 -> seuil=2k/2) nous obtenons le résultat suivant :
binarisation d'une image seuil
Grâce au slider, nous pouvons régler le seuil et donc voir les différences des résultats. Exemple avec seuil = 5, 82, 156, 235
binarisation d'une image seuil

La binarisation avec AOD

Mais comment choisir une bon seuil afin d'éviter d'avoir une image trop ou trop peu blanche ou noir. Une simple méthode consiste à prendre un seuil qui sépare l'histogramme en deux parties égales. Nous allons donc prendre l' AOD (Average Optical Density). De cette manière, L'image binaire contiendra autant de points noirs que de points blancs. Exemple avec une image :
binarisation d'une image seuil automatique

Programme

function guibinarisation

%translationfunction guihistogramme
clear all;
close all;
figure(  'name','binarisation',...
            'NumberTitle','off',...
            'MenuBar','none',...
            'color',[0.3137 0.3137 0.5098]);
       
a(1)=axes('units','normalized',...
    'position',[0.05 0.65 0.3 0.3]);
a(2)=axes('units','normalized',...
    'position',[0.05 0.3 0.3 0.3]);
a(3)=axes('units','normalized',...
    'position',[0.55 0.65 0.3 0.3]);
a(4)=axes('units','normalized',...
    'position',[0.55 0.3 0.3 0.3]);

uicontrol(  'style','pushbutton',...
            'string','load',...
            'Position', [10 10 50 20],...
            'callback',@loadimage);

uicontrol(  'style','slider',...
            'string','seuil',...
            'Min' ,0,'Max',255, ...
            'Position', [70 10 100 20],...
            'Value', 0,...
            'SliderStep',[1/255 10/255], ...
            'callback',{@histogramme,'seuil'});
text(1)=uicontrol(  'style','text',...
            'string','rectification bas ',...
            'Position', [70 30 100 20]);
text(3)=uicontrol(  'style','text',...
            'string','aod =',...
            'Position', [300 30 100 20]);
%parametre initial
setappdata(gcf,'k',8);
setappdata(gcf,'x',1);
setappdata(gcf,'seuil',0);
setappdata(gcf,'hist',0);
 
function loadimage(~,~)
    % appeler quand appui check box
    [filename, pathname] = uigetfile({'*.jpg;*.tif;*.PNG;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg')

    x = imread(filename);
    axes(a(1))
    imshow(x)
    if (length(size(x))>2)
        x=mean(x,3);% on prend une seul plan image noir et blanc chaque plan sont egaux
    end
    x=uint8(x);
    k = whos('x');
    if k.class == 'uint8'
        k=8;
    end
    setappdata(1,'k',k);
    setappdata(1,'x',x);
    axes(a(3))
    imshow(x)
   
    [ligne colonne]=size(x);
    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
    setappdata(1,'hist',hist);
    seuil = round(2^k/2);
    axes(a(2))
    plot([0:(2^k)-1],hist)
    hold on
    plot(seuil,[0:max(hist)/100:max(hist)],'r')
    hold off
    aod=sum(hist.*[0:(2^k)-1]')/(ligne*colonne);
    set( text(3), 'String', strcat('aod =',num2str(aod)));
   
    seuil = round(2^k/2);
    for i=1:ligne
        for j=1:colonne
            if x(i,j)<seuil
              img(i,j) = 0;
            else
              img(i,j) = 1;
            end
        end
    end
    axes(a(4))
    imshow(img)
end
function histogramme(hObj,~,name)
     val = round(get(hObj,'Value'));
     setappdata(1,name,val);
     seuil = getappdata(1,'seuil');
     img = getappdata(1,'x');
     k = getappdata(1,'k');
     hist = getappdata(1,'hist');
     axes(a(2))
     plot([0:(2^k)-1],hist)
     hold on
     plot(seuil,[0:max(hist)/100:max(hist)],'r')
     hold off
     [ligne colonne]=size(img);
     
     for i=1:ligne
        for j=1:colonne
            if img(i,j)<seuil
              img2(i,j) = 0;
            else
              img2(i,j) = 1;
            end
        end
     end
     %img=bool(img);
     axes(a(4))
     imshow(img2)

     aod=sum(hist.*[0:(2^k)-1]')/(ligne*colonne)
     set( text(1), 'String', seuil );
     set( text(3), 'String', strcat('aod =',num2str(aod)));
         
end
end


         

Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr