La détection de fronts (de changements) consiste à détecter les passages de l'image de valeur nul à 1 et vice-versa. Cette détection est réalisée grâce à l'opérateur logique OU EXCLUSIF. Cette opérateur donne 1 si ses deux entrées sont différentes. De cette manière, si il y a eu un changement entre les deux pixels d'entrées alors le pixel de sortie sera blanc, sinon il sera noir.
e1 | e2 | s |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Maintenant il faut choisir correctement les pixels d'entrée de la porte XOR (OU EXCULIF). Regardez le schéma suivant.
Afin de voir les fronts dans plusieurs directions, il est important de faire plusieurs opérations. Pour un masque carré d'ordre 1, nous pouvons
détecter les fronts dans quatre directions. La direction est définie par la droite entre les deux pixels d'entrée des portes XOR
Si le masque ne permet pas toutes les directions, les contours risques d'être mals repérés. L'image doit avoir très peu de parasites
afin d'éviter de détecter les fronts dus aux bruits.
Si un front ou plus est détectés dans un masque alors la sortie doit être égale à 1, donc nous devons utiliser un OU entre toutes les sorties des XOR.
sortie = 1 si (n1 XOR n1')=1 OU (n2 XOR n2')=1 OU (n3 XOR n3')=1 OU (n4 XOR n4')=1, sinon sortie = 0
function guifront
%translationfunction guihistogramme
clear all;
close all;
figure( 'name','majorité',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
a(1)=axes('units','normalized',...
'position',[0.05 0.60 0.35 0.35]);
a(2)=axes('units','normalized',...
'position',[0.05 0.15 0.35 0.35]);
a(3)=axes('units','normalized',...
'position',[0.50 0.60 0.35 0.35]);
a(4)=axes('units','normalized',...
'position',[0.50 0.15 0.35 0.35]);
uicontrol( 'style','pushbutton',...
'string','load',...
'Position', [10 10 50 20],...
'callback',@loadimage);
uicontrol( 'style','pushbutton',...
'string','majorité',...
'Position', [100 10 50 20],...
'callback',@majorite);
uicontrol( 'style','pushbutton',...
'string','front',...
'Position', [400 10 50 20],...
'callback',@front);
uicontrol( 'style','popup',...
'string','ligne|colonne|croix|carre',...
'Min',0,'Max',4,...
'Position', [200 10 50 20],...
'callback',{@choix,'typemasque'});
uicontrol( 'style','popup',...
'string','1|2|3|4|5',...
'Min',0,'Max',4,...
'Position', [300 10 50 20],...
'callback',{@choix,'ordrefiltre'});
uicontrol( 'style','popup',...
'string','1|2|3|4|5',...
'Min',0,'Max',4,...
'Position', [500 10 50 20],...
'callback',{@choix,'ordrefront'});
text(1)=uicontrol( 'style','text',...
'string','ordre majorite ',...
'Position', [300 30 70 20]);
text(2)=uicontrol( 'style','text',...
'string','odre front ',...
'Position', [500 30 70 20]);
%parametre initial
setappdata(gcf,'k',8);
setappdata(gcf,'x',1);
setappdata(gcf,'img2',1);
setappdata(gcf,'typemasque',0);
setappdata(gcf,'ordrefiltre',0);
setappdata(gcf,'ordrefront',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
% on inverse l'image les objets sont noir
img2=uint8(x);
axes(a(2))
imshow(img2)
x=x/255;
img2=img2/255;
setappdata(1,'k',k);
setappdata(1,'x',x);
setappdata(1,'img2',img2);
end
function majorite(hObj,~)
typemasque = getappdata(1,'typemasque');
ordre = getappdata(1,'ordrefiltre');
if (ordre == 0 || ordre == 1)
ordre=1;
end
img = getappdata(1,'x');
k = getappdata(1,'k');
[ligne colonne]=size(img);
img2=zeros(ligne,colonne);
for i=ordre+1:ligne-ordre%attention aux debordement
for j =ordre+1:colonne-ordre%attention aux debordement
if (typemasque==0 || typemasque==1) %ligne
for o = -ordre : 1 : ordre
img2(i,j)=img2(i,j) + img(i+o,j);
end
elseif typemasque==2
for o = -ordre : 1 : ordre
img2(i,j)=img2(i,j) + img(i,j+o);
end
elseif typemasque==3
for o = -ordre : 1 : ordre
img2(i,j)=img2(i,j) + img(i+o,j) + img(i,j+o);
end
else
for o1 = -ordre : 1 : ordre
for o2 = -ordre : 1 : ordre
img2(i,j)=img2(i,j) + img(i+o1,j+o2);
end
end
end
end
end
if (typemasque==0 || typemasque==1)
taillemasque = 1 + 2*ordre;
elseif typemasque==2
taillemasque = 1 + 2*ordre;
elseif typemasque==3
taillemasque = 1 + 4*ordre;
else
taillemasque = ((ordre*2)+1)^2;
end
seuilmajorite=ceil(taillemasque/2);
for i = 1 : ligne
for j = 1 : colonne
if (img2(i,j)>seuilmajorite)
img2(i,j)=1;
else
img2(i,j)=0;
end
end
end
setappdata(1,'img2',img2);
axes(a(2))
imshow(img2)
end
function front(hObj,~)
typemasque = getappdata(1,'typemasque');
ordre = getappdata(1,'ordrefront');
if (ordre == 0 || ordre == 1)
ordre=1;
end
x = getappdata(1,'x');
img2 = getappdata(1,'img2');
k = getappdata(1,'k');
[ligne colonne]=size(img2);
x2=zeros(ligne,colonne);
for i=ordre+1:ligne-ordre%attention aux debordement
for j =ordre+1:colonne-ordre%attention aux debordement
if (typemasque==0 || typemasque==1) %ligne
x2(i,j)=xor(x(i-ordre,j) , x(i+ordre,j));% detection horisontal
elseif typemasque==2
x2(i,j)=xor(x(i,j-ordre) , x(i,j+ordre));% detection vertical
elseif typemasque==3
x2(i,j)=xor(x(i-ordre,j) , x(i+ordre,j)) |... % detection horisontal
xor(x(i,j-ordre) , x(i,j+ordre)); % detection vertical
else
x2(i,j)=xor(x(i-ordre,j) , x(i+ordre,j)) |... % detection horisontal
xor(x(i,j-ordre) , x(i,j+ordre)) |... % detection vertical
xor(x(i-ordre,j-ordre) , x(i+ordre,j+ordre)) |... % detection diagonal decendante
xor(x(i-ordre,j+ordre) , x(i+ordre,j-ordre)); % detection diagonal montante
end
end
end
img3=zeros(ligne,colonne);
for i=ordre+1:ligne-ordre%attention aux debordement
for j =ordre+1:colonne-ordre%attention aux debordement
if (typemasque==0 || typemasque==1) %ligne
img3(i,j)=xor(img2(i-ordre,j) , img2(i+ordre,j));% detection horisontal
elseif typemasque==2
img3(i,j)=xor(img2(i,j-ordre) , img2(i,j+ordre));% detection vertical
elseif typemasque==3
img3(i,j)=xor(img2(i-ordre,j) , img2(i+ordre,j)) |... % detection horisontal
xor(img2(i,j-ordre) , img2(i,j+ordre)); % detection vertical
else
img3(i,j)=xor(img2(i-ordre,j) , img2(i+ordre,j)) |... % detection horisontal
xor(img2(i,j-ordre) , img2(i,j+ordre)) |... % detection vertical
xor(img2(i-ordre,j-ordre) , img2(i+ordre,j+ordre)) |... % detection diagonal decendante
xor(img2(i-ordre,j+ordre) , img2(i+ordre,j-ordre)); % detection diagonal montante
end
end
end
axes(a(3))
imshow(x2)
axes(a(4))
imshow(img3)
end
function choix(hObj,~,name)
% Called when user activates popup menu
val = get(hObj,'Value'); %0|1=ligne, 2=colonne, 3=croix, 4=carre
setappdata(1,name,val);
end
end
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr