# Binary processing

## edge detection

### Methode

The edge detection is to detect the change of neighbor pixel from 1 to 0 or vise versa. This detection is performed with the logical operator XOR. This operator returns 1 if its two inputs are different. In this way, if there was a change between the two input pixels then the output pixel will be white, otherwise it will be black.

 e1 e2 s 0 0 0 0 1 1 1 0 1 1 1 0

Now you must choose the correct input pixels of the XOR gate. Look at the diagram below.

To see the edges in several directions, it is important to make many operations. For a square mask of order 1, we can detect edges in four directions. The direction is defined by the line between the two input pixels of XOR gates.

• n1 et n1': diagonal downward
• n2 et n2': vertical
• n3 et n3': diagonal rising
• n4 et n4': horisontal

If the mask does not provide every direction, the edge risks to be mis identify. The image must be very few parasites to not detect edge due to noise.
If one or more front is detected in a mask then the output must be equal to 1, so we must use an OR between all the outputs of XOR. output = 1 if (n1 XOR n1')=1 OU (n2 XOR n2')=1 OU (n3 XOR n3')=1 OU (n4 XOR n4')=1, otherwise output = 0

### Program

```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        ```

### Example

Edge detection for a binary image with majority, the picture is much more noisy.

Same detection with other parameters which leaves less noise.