Last saved by: mmartin

A continuación se presentan los elementos utilizados para la incorporación de los filtros de bordes mediantes matrices y un método genérico para su aplicación.
En el main (unidad principal):
En las propiedades privadas o públicas de la clase principal declarar:
    // matrices para bordes
    matFB                  : array of matFilt;

Incluir el método de lectura de filtros en la clase principal:
// Carga Archivo de Bordes
procedure TForm1.cargaBordes();
var
  fid           : TextFile;
  nomF,nada     : string;
  kF,nF,nc,nr,
  xx,yy         : integer;
  menuit        : TMenuItem;

begin
  // abrir archivo con filtros: nombres
  AssignFile(fid,'Bordes.txt');
  // rewrite  NUEVO y ESCRITURA
  // reset    LECTURA
  // append   Apendizar

  reset(fid);
  // leer en arch.     texto:  read, readln
  // escribir en arch. texto:  write, writeln

  readln(fid,nada);
  readln(fid,nF);
  SetLength(matFB, nF);  // reservamos espacio para las matrices de bordes

  for kF := 0 to nF-1 do begin
    readln(fid, nomF);
    menuit := TMenuItem.Create(self);
    menuit.Caption := nomF;
    menuit.OnClick := Simple1Click;
    Bordes1.Add(menuit);

    // leer datos de la matriz de bordes (nc y nr deben impares)
    readln(fid,nc,nr);
    matFB[kF].nc := nc;
    matFB[kF].nr := nr;

    // def tamaño del Filtro Matricial
    SetLength(matFB[kF].dat,nc,nr);

    // leer matriz
    for yy := 0 to nr-1 do begin
      for xx := 0 to nc-1 do
        read(fid,matFB[kF].dat[xx][yy]);
      readln(fid);
    end;
  end;
  // cerrar el archivo de bordes
  CloseFile(fid);
end;

Llamar a este método en el FormCreate de la clase principal
Crear el archivo con los bordes en texto plano, llamarlo “bordes.txt”, ubicarlo en el punto de compilación:
#-archivo-con-matrices-de-bordes:27-02-2014
18
Sobel_X
3 3
-1 -1 -1
 0  0  0
 1  1  1
Sobel_Y
3 3
-1  0  1
-1  0  1
-1  0  1
Roberts_X
3 3
-1 -2 -1
 0  0  0
 1  2  1
Roberts_Y
3 3
-1 0 1
-2 0 2
-1 0 1
Laplaciano_4
3 3
 0 -1  0
-1  4 -1
 0 -1  0
Laplaciano_8
3 3
-1 -1 -1
-1  8 -1
-1 -1 -1

Incluir en la clase principal el método genérico de aplicación de Bordes mediante matrices:
// Simple de convolucion
procedure TForm1.Simple1Click(Sender: TObject);
var
  op  : byte;
begin
  preparaProceso();

  op :=  Bordes1.IndexOf(Sender as TMenuItem);

  FR_BordeSimpleConv (Im1,Im2,matFB[op]);
  if CheckBox4.Checked
    then Norma_Abs (Im2)
    else Norma_Gris(Im2);

  muestraImagen();
end;

En la Unidad “UMEtRegionales.pas” crear el prototipo del método “FR_BordeSimpleConv” y usar el siguiente código:

// Bordes convolución
procedure FR_BordeSimpleConv  (matriz  : matImg; var matrizSal: matImg;
                               filtro : matFilt );
var
 kx,ky,cc   : integer;
 ix,iy      : byte;

 function convB(xx,yy : integer): single;
 var
   sum   : single;
   xq,yq : integer;
 begin
   sum := 0.0;
   for yq := -iy to iy do
     for xq := -ix to ix do
       sum := sum  + filtro.dat[ix+xq][iy+yq]*matriz.dat[xx+xq][yy+yq][cc];

   result := sum;
 end;

begin
  ix := filtro.nc div 2;
  iy := filtro.nr div 2;

  for cc := 0 to 2 do if _Kanal[cc] then
    for ky := _y1+iy to _y2-1-iy do
      for kx := _x1+ix to _x2-1-ix do
        matrizSal.dat[kx][ky][cc] := ConvB(kx,ky);

end;

Compilar y probar el funcionamiento de los bordes, use primero imágenes simples y luego mas complejas.

Manuel Martin Ortiz
Prof. Asignatura 

Marzo-2014