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
En plaçant le seuil au milieu de l'échelle des valeurs ( k=8 -> seuil=2k/2) nous obtenons le résultat suivant :
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
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 :
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