Nadesłany przez Tomasz Lubiński, 15 sierpnia 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Filtracja - Delphi/Unit1.pas:
//Filtracja obrazów
//(c) 2006 Tomasz Lubinski
//www.algorytm.org
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, Grids, Filters;
type
TForm1 = class(TForm)
Button1: TButton;
ObrazKolorowy: TImage;
ObrazMono: TImage;
WynikKolorowy: TImage;
WynikMono: TImage;
ComboBox1: TComboBox;
StringGrid1: TStringGrid;
Label1: TLabel;
procedure LinearFiltr(Sender: TObject);
procedure MinFiltr(Sender: TObject);
procedure MedFiltr(Sender: TObject);
procedure MaxFiltr(Sender: TObject);
procedure KuwaharaFiltr(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Filtr: array of array of Integer;
red: array of array of Byte;
green: array of array of Byte;
blue: array of array of Byte;
gray: array of array of Byte;
Norm: Integer;
Size: Integer;
procedure UpdateFilter(NewFiltr: Array of Integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.LinearFiltr(Sender: TObject);
var
i, j, k, l, margin: Integer;
rsume, gsume, bsume, graysume: Integer;
begin
margin := Round((size-1)/2);
//filtr dla obrazu kolorowego
for i := margin to ObrazKolorowy.Width-margin-1 do
for j := margin to ObrazKolorowy.Height-margin-1 do
begin
rsume := 0;
gsume := 0;
bsume := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
rsume := rsume + Filtr[k,l]*red[i+k-margin,j+l-margin];
gsume := gsume + Filtr[k,l]*green[i+k-margin,j+l-margin];
bsume := bsume + Filtr[k,l]*blue[i+k-margin,j+l-margin];
end;
rsume := rsume div norm;
gsume := gsume div norm;
bsume := bsume div norm;
if (rsume > 255) then rsume := 255
else if (rsume < 0) then rsume := 0;
if (gsume > 255) then gsume := 255
else if (gsume < 0) then gsume := 0;
if (bsume > 255) then bsume := 255
else if (bsume < 0) then bsume := 0;
WynikKolorowy.Canvas.Pixels[i,j] := rsume + (gsume shl 8) + (bsume shl 16);
end;
//filtr dla obrazu monochromatycznego
for i := margin to ObrazMono.Width-margin-1 do
for j := margin to ObrazMono.Height-margin-1 do
begin
graysume := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
graysume := graysume + Filtr[k,l]*gray[i+k-margin,j+l-margin];
end;
graysume := graysume div norm;
if (graysume > 255) then graysume := 255
else if (graysume < 0) then graysume := 0;
WynikMono.Canvas.Pixels[i,j] := graysume + (graysume shl 8) + (graysume shl 16);
end;
end;
procedure TForm1.MinFiltr(Sender: TObject);
var
i, j, k, l, margin: Integer;
rmin, gmin, bmin, graymin: Integer;
begin
size := 3;
margin := Round((size-1)/2);
//filtr dla obrazu kolorowego
for i := margin to ObrazKolorowy.Width-margin-1 do
for j := margin to ObrazKolorowy.Height-margin-1 do
begin
rmin := 255;
gmin := 255;
bmin := 255;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
if rmin > (red[i+k-margin,j+l-margin]) then rmin := red[i+k-margin,j+l-margin];
if gmin > (green[i+k-margin,j+l-margin]) then gmin := green[i+k-margin,j+l-margin];
if bmin > (blue[i+k-margin,j+l-margin]) then bmin := blue[i+k-margin,j+l-margin];
end;
WynikKolorowy.Canvas.Pixels[i,j] := rmin + (gmin shl 8) + (bmin shl 16);
end;
//filtr dla obrazu monochromatycznego
for i := margin to ObrazMono.Width-margin-1 do
for j := margin to ObrazMono.Height-margin-1 do
begin
graymin := 255;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
if graymin > (gray[i+k-margin,j+l-margin]) then graymin := (gray[i+k-margin,j+l-margin]);
end;
WynikMono.Canvas.Pixels[i,j] := graymin + (graymin shl 8) + (graymin shl 16);
end;
end;
//dla algorytmu Hoar'e - obliczanie mediany
function partition(var c: Array of Integer; a,b: Integer): Integer;
var
e,tmp: Integer;
begin
a:=a;
b:=b;
e:=c[a]; //elemennt dzielacy
while a<b do
begin
while ((a<b) and (c[b]>=e)) do b:=b-1;
while ((a<b) and (c[a]<e)) do a:=a+1;
if (a<b) then
begin
tmp:=c[a];
c[a]:=c[b];
c[b]:=tmp;
end;
end;
partition:=a;
end;
//algorytmu Hoar'e - obliczanie mediany
function med(var c: Array of Integer): Integer;
var
i, j, k, w : Integer;
begin
//algorytm Hoare'a
i:=0;
j:=length(c) - 1;
w:=j div 2;
while (i<>j) do
begin
k:=partition(c,i,j);
k:=k-i+1;
if k>=w then
j:=i+k-1;
if k<w then
begin
w:=w-k;
i:=i+k
end;
end;
med := c[i];
end;
procedure TForm1.MedFiltr(Sender: TObject);
var
i, j, k, l, m, margin: Integer;
rval, gval, bval, grayval: Array [1..9] of Integer;
begin
size := 3;
margin := Round((size-1)/2);
//filtr dla obrazu kolorowego
for i := margin to ObrazKolorowy.Width-margin-1 do
for j := margin to ObrazKolorowy.Height-margin-1 do
begin
m := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
m := m + 1;
rval[m] := red[i+k-margin,j+l-margin];
gval[m] := green[i+k-margin,j+l-margin];
bval[m] := blue[i+k-margin,j+l-margin];
end;
WynikKolorowy.Canvas.Pixels[i,j] := med(rval) + (med(gval) shl 8) + (med(bval) shl 16);
end;
//filtr dla obrazu monochromatycznego
for i := margin to ObrazMono.Width-margin-1 do
for j := margin to ObrazMono.Height-margin-1 do
begin
m := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
m := m + 1;
grayval[m] := gray[i+k-margin,j+l-margin]
end;
WynikMono.Canvas.Pixels[i,j] := med(grayval) + (med(grayval) shl 8) + (med(grayval) shl 16);
end;
end;
procedure TForm1.MaxFiltr(Sender: TObject);
var
i, j, k, l, margin: Integer;
rmax, gmax, bmax, graymax: Integer;
begin
size := 3;
margin := Round((size-1)/2);
//filtr dla obrazu kolorowego
for i := margin to ObrazKolorowy.Width-margin-1 do
for j := margin to ObrazKolorowy.Height-margin-1 do
begin
rmax := 0;
gmax := 0;
bmax := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
if rmax < (red[i+k-margin,j+l-margin]) then rmax := red[i+k-margin,j+l-margin];
if gmax < (green[i+k-margin,j+l-margin]) then gmax := green[i+k-margin,j+l-margin];
if bmax < (blue[i+k-margin,j+l-margin]) then bmax := blue[i+k-margin,j+l-margin];
end;
WynikKolorowy.Canvas.Pixels[i,j] := rmax + (gmax shl 8) + (bmax shl 16);
end;
//filtr dla obrazu monochromatycznego
for i := margin to ObrazMono.Width-margin-1 do
for j := margin to ObrazMono.Height-margin-1 do
begin
graymax := 0;
for k := 0 to size-1 do
for l := 0 to size-1 do
begin
if graymax < (gray[i+k-margin,j+l-margin]) then graymax := gray[i+k-margin,j+l-margin];
end;
WynikMono.Canvas.Pixels[i,j] := graymax + (graymax shl 8) + (graymax shl 16);
end;
end;
procedure TForm1.KuwaharaFiltr(Sender: TObject);
var
i, j, k, l, margin, m, mr, mg, mb: Integer;
rm, gm, bm, graym: Array [1..4] of Real; //wartosci srednie
rs, gs, bs, grays: Array [1..4] of Real; //wariancje
begin
size := 5;
margin := Round((size-1)/2);
//filtr dla obrazu kolorowego
for i := margin to ObrazKolorowy.Width-margin-1 do
for j := margin to ObrazKolorowy.Height-margin-1 do
begin
//oblicz wartosci srednie
for k := 1 to 4 do
begin
rm[k] := 0;
gm[k] := 0;
bm[k] := 0;
end;
for k := 0 to 2 do
for l := 0 to 2 do
begin
rm[1] := rm[1] + red[i+k-margin][j+l-margin] / 9.0;
rm[2] := rm[2] + red[i+k][j+l-margin] / 9.0;
rm[3] := rm[3] + red[i+k-margin][j+l] / 9.0;
rm[4] := rm[4] + red[i+k][j+l] / 9.0;
gm[1] := gm[1] + green[i+k-margin][j+l-margin] / 9.0;
gm[2] := gm[2] + green[i+k][j+l-margin] / 9.0;
gm[3] := gm[3] + green[i+k-margin][j+l] / 9.0;
gm[4] := gm[4] + green[i+k][j+l] / 9.0;
bm[1] := bm[1] + blue[i+k-margin][j+l-margin] / 9.0;
bm[2] := bm[2] + blue[i+k][j+l-margin] / 9.0;
bm[3] := bm[3] + blue[i+k-margin][j+l] / 9.0;
bm[4] := bm[4] + blue[i+k][j+l] / 9.0;
end;
//oblicz wariancje
for k := 1 to 4 do
begin
rs[k] := 0;
gs[k] := 0;
bs[k] := 0;
end;
for k := 0 to 2 do
for l := 0 to 2 do
begin
rs[1] := rs[1] + (red[i+k-margin][j+l-margin] - rm[1]) * (red[i+k-margin][j+l-margin] - rm[2]);
rs[2] := rs[2] + (red[i+k][j+l-margin] - rm[2]) * (red[i+k][j+l-margin] - rm[2]);
rs[3] := rs[3] + (red[i+k-margin][j+l] - rm[3]) * (red[i+k-margin][j+l] - rm[3]);
rs[4] := rs[4] + (red[i+k][j+l] - rm[4]) * (red[i+k][j+l] - rm[4]);
gs[1] := gs[1] + (green[i+k-margin][j+l-margin] - gm[1]) * (green[i+k-margin][j+l-margin] - gm[2]);
gs[2] := gs[2] + (green[i+k][j+l-margin] - gm[2]) * (green[i+k][j+l-margin] - gm[2]);
gs[3] := gs[3] + (green[i+k-margin][j+l] - gm[3]) * (green[i+k-margin][j+l] - gm[3]);
gs[4] := gs[4] + (green[i+k][j+l] - gm[4]) * (green[i+k][j+l] - gm[4]);
bs[1] := bs[1] + (blue[i+k-margin][j+l-margin] - bm[1]) * (blue[i+k-margin][j+l-margin] - bm[2]);
bs[2] := bs[2] + (blue[i+k][j+l-margin] - bm[2]) * (blue[i+k][j+l-margin] - bm[2]);
bs[3] := bs[3] + (blue[i+k-margin][j+l] - bm[3]) * (blue[i+k-margin][j+l] - bm[3]);
bs[4] := bs[4] + (blue[i+k][j+l] - bm[4]) * (blue[i+k][j+l] - bm[4]);
end;
//znajdz najmniejsza wariancje
mr:=1;
for k:=2 to 4 do
if (rs[k] < rs[mr]) then
mr := k;
mg:=1;
for k:=2 to 4 do
if (gs[k] < gs[mg]) then
mg := k;
mb:=1;
for k:=2 to 4 do
if (bs[k] < bs[mb]) then
mb := k;
WynikKolorowy.Canvas.Pixels[i,j] := Round(rm[mr]) + (Round(gm[mg]) shl 8) + (Round(bm[mb]) shl 16);
end;
//filtr dla obrazu monochromatycznego
for i := margin to ObrazMono.Width-margin-1 do
for j := margin to ObrazMono.Height-margin-1 do
begin
//oblicz wartosci srednie
for k := 1 to 4 do
graym[k] := 0;
for k := 0 to 2 do
for l := 0 to 2 do
begin
graym[1] := graym[1] + gray[i+k-margin][j+l-margin] / 9.0;
graym[2] := graym[2] + gray[i+k][j+l-margin] / 9.0;
graym[3] := graym[3] + gray[i+k-margin][j+l] / 9.0;
graym[4] := graym[4] + gray[i+k][j+l] / 9.0;
end;
//oblicz wariancje
for k := 1 to 4 do
grays[k] := 0;
for k := 0 to 2 do
for l := 0 to 2 do
begin
grays[1] := grays[1] + (gray[i+k-margin][j+l-margin] - graym[1]) * (gray[i+k-margin][j+l-margin] - graym[2]);
grays[2] := grays[2] + (gray[i+k][j+l-margin] - graym[2]) * (gray[i+k][j+l-margin] - graym[2]);
grays[3] := grays[3] + (gray[i+k-margin][j+l] - graym[3]) * (gray[i+k-margin][j+l] - graym[3]);
grays[4] := grays[4] + (gray[i+k][j+l] - graym[4]) * (gray[i+k][j+l] - graym[4]);
end;
//znajdz najmniejsza wariancje
m:=1;
for k:=2 to 4 do
if (grays[k] < grays[m]) then
m := k;
WynikMono.Canvas.Pixels[i,j] := Round(graym[m]) + (Round(graym[m]) shl 8) + (Round(graym[m]) shl 16);
end;
end;
//wybór filtru
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
case ComboBox1.ItemIndex of
0: UpdateFilter(USREDNIAJACY);
1: UpdateFilter(KWADRATOWY);
2: UpdateFilter(KOLOWY);
3: UpdateFilter(LP1);
4: UpdateFilter(LP2);
5: UpdateFilter(LP3);
6: UpdateFilter(PIRAMIDALNY);
7: UpdateFilter(STOZKOWY);
8: UpdateFilter(GAUSS1);
9: UpdateFilter(GAUSS2);
10: UpdateFilter(GAUSS3);
11: UpdateFilter(GAUSS4);
12: UpdateFilter(GAUSS5);
13: UpdateFilter(USUN_SREDNIA);
14: UpdateFilter(HP1);
15: UpdateFilter(HP2);
16: UpdateFilter(HP3);
17: UpdateFilter(POZIOMY);
18: UpdateFilter(PIONOWY);
19: UpdateFilter(UKOSNY1);
20: UpdateFilter(UKOSNY2);
21: UpdateFilter(GRADIENT_E);
22: UpdateFilter(GRADIENT_SE);
23: UpdateFilter(GRADIENT_S);
24: UpdateFilter(GRADIENT_SW);
25: UpdateFilter(GRADIENT_W);
26: UpdateFilter(GRADIENT_NW);
27: UpdateFilter(GRADIENT_N);
28: UpdateFilter(GRADIENT_NE);
29: UpdateFilter(UWYPUKLAJACY_E);
30: UpdateFilter(UWYPUKLAJACY_SE);
31: UpdateFilter(UWYPUKLAJACY_S);
32: UpdateFilter(UWYPUKLAJACY_SW);
33: UpdateFilter(UWYPUKLAJACY_W);
34: UpdateFilter(UWYPUKLAJACY_NW);
35: UpdateFilter(UWYPUKLAJACY_N);
36: UpdateFilter(UWYPUKLAJACY_NE);
37: UpdateFilter(LAPL1);
38: UpdateFilter(LAPL2);
39: UpdateFilter(LAPL3);
40: UpdateFilter(LAPL_SKOSNY);
41: UpdateFilter(LAPL_POZIOMY);
42: UpdateFilter(LAPL_PIONOWY);
43: UpdateFilter(SOBEL_POZIOMY);
44: UpdateFilter(SOBEL_PIONOWY);
45: UpdateFilter(PREWITT_POZIOMY);
46: UpdateFilter(PREWITT_PIONOWY);
47: begin
Button1.OnClick := MedFiltr;
Label1.Visible := False;
StringGrid1.Visible := False;
end;
48: begin
Button1.OnClick := MinFiltr;
Label1.Visible := False;
StringGrid1.Visible := False;
end;
49: begin
Button1.OnClick := MaxFiltr;
Label1.Visible := False;
StringGrid1.Visible := False;
end;
50: begin
Button1.OnClick := KuwaharaFiltr;
Label1.Visible := False;
StringGrid1.Visible := False;
end;
end;
end;
//zaladowanie wybranego filtru
procedure TForm1.UpdateFilter(NewFiltr: Array of Integer);
var
length, i, j: Integer;
begin
length := High(NewFiltr) + 1;
size := Round(Sqrt(length));
StringGrid1.RowCount := size;
StringGrid1.ColCount := size;
SetLength(Filtr, size);
for i := 0 to size-1 do
SetLength(Filtr[i], size);
for i := 0 to size-1 do
for j := 0 to size-1 do
begin
Filtr[i,j] := NewFiltr[i*size + j];
StringGrid1.Cells[i,j] := FloatToStr(Filtr[i,j]);
end;
Norm := 0;
for i := 0 to size-1 do
for j := 0 to size-1 do
Norm := Norm + Filtr[i,j];
if Norm = 0 then Norm := 1;
Label1.Caption := '1/' + FloatToStr(Norm) + ' *';
Label1.Visible := True;
StringGrid1.Visible := True;
Button1.OnClick := LinearFiltr;
end;
//wczytaj kolory piksli z obrazow do tablic
procedure TForm1.FormCreate(Sender: TObject);
var
i, j: Integer;
color: TColor;
begin
SetLength(red, ObrazKolorowy.Width);
SetLength(green, ObrazKolorowy.Width);
SetLength(blue, ObrazKolorowy.Width);
for i := 0 to ObrazKolorowy.Width-1 do
begin
SetLength(red[i], ObrazKolorowy.Height);
SetLength(green[i], ObrazKolorowy.Height);
SetLength(blue[i], ObrazKolorowy.Height);
for j := 0 to ObrazKolorowy.Height-1 do
begin
color := ObrazKolorowy.Canvas.Pixels[i,j];
red[i,j] := (color and $FF);
green[i,j] := ((color shr 8) and $FF);
blue[i,j] := ((color shr 16) and $FF);
end
end;
SetLength(gray, ObrazMono.Width);
for i := 0 to ObrazMono.Width-1 do
begin
SetLength(gray[i], ObrazMono.Height);
for j := 0 to ObrazMono.Height-1 do
begin
color := ObrazMono.Canvas.Pixels[i,j];
gray[i,j] := (color and $FF);
end
end;
end;
end.
Filtracja - Delphi/Filters.pas:
unit Filters;
interface
const
USREDNIAJACY: array [0..8] of Integer = (1, 1, 1,
1, 1, 1,
1, 1, 1);
KWADRATOWY: array [0..24] of Integer = (1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1);
KOLOWY: array [0..24] of Integer = (0, 1, 1, 1, 0,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
0, 1, 1, 1, 0);
LP1: array [0..8] of Integer = (1, 1, 1,
1, 2, 1,
1, 1, 1);
LP2: array [0..8] of Integer = (1, 1, 1,
1, 4, 1,
1, 1, 1);
LP3: array [0..8] of Integer = (1, 1, 1,
1, 12,1,
1, 1, 1);
PIRAMIDALNY: array [0..24] of Integer = (1, 2, 3, 2, 1,
2, 4, 6, 4, 2,
3, 6, 9, 6, 3,
2, 4, 6, 4, 2,
1, 2, 3, 2, 1);
STOZKOWY: array [0..24] of Integer = (0, 0, 1, 0, 0,
0, 2, 2, 2, 0,
1, 2, 5, 2, 1,
0, 2, 2, 2, 0,
0, 0, 1, 0, 0);
GAUSS1: array [0..8] of Integer = (1, 2, 1,
2, 4, 2,
1, 2, 1);
GAUSS2: array [0..24] of Integer = (1, 1, 2, 1, 1,
1, 2, 4, 2, 1,
2, 4, 8, 4, 2,
1, 2, 4, 2, 1,
1, 1, 2, 1, 1);
GAUSS3: array [0..24] of Integer = (0, 1, 2, 1, 0,
1, 4, 8, 4, 1,
2, 8, 16,8, 2,
1, 4, 8, 4, 1,
0, 1, 2, 1, 0);
GAUSS4: array [0..24] of Integer = (1, 4, 7, 4, 1,
4,16,26,16, 4,
7,26,41,26, 7,
4,26,16,26, 4,
1, 4, 7, 4, 1);
GAUSS5: array [0..48] of Integer = (1, 1, 2, 2, 2, 1, 1,
1, 2, 2, 4, 2, 2, 1,
2, 2, 4, 8, 4, 2, 2,
2, 4, 8,16, 8, 4, 2,
2, 2, 4, 8, 4, 2, 2,
1, 2, 2, 4, 2, 2, 1,
1, 1, 2, 2, 2, 1, 1);
USUN_SREDNIA: array [0..8] of Integer = (-1, -1, -1,
-1, 9, -1,
-1, -1, -1);
HP1: array [0..8] of Integer = ( 0, -1, 0,
-1, 5, -1,
0, -1, 0);
HP2: array [0..8] of Integer = ( 1, -2, 1,
-2, 5, -2,
1, -2, 1);
HP3: array [0..8] of Integer = ( 0, -1, 0,
-1, 20, -1,
0, -1, 0);
POZIOMY: array [0..8] of Integer = ( 0, 0, 0,
-1, 1, 0,
0, 0, 0);
PIONOWY: array [0..8] of Integer = ( 0, -1, 0,
0, 1, 0,
0, 0, 0);
UKOSNY1: array [0..8] of Integer = (-1, 0, 0,
0, 1, 0,
0, 0, 0);
UKOSNY2: array [0..8] of Integer = ( 0, 0, -1,
0, 1, 0,
0, 0, 0);
GRADIENT_E: array [0..8] of Integer = (-1, 1, 1,
-1, -2, 1,
-1, 1, 1);
GRADIENT_SE: array [0..8] of Integer = (-1, -1, 1,
-1, -2, 1,
1, 1, 1);
GRADIENT_S: array [0..8] of Integer = (-1, -1, -1,
1, -2, 1,
1, 1, 1);
GRADIENT_SW: array [0..8] of Integer = ( 1, -1, -1,
1, -2, -1,
1, 1, 1);
GRADIENT_W: array [0..8] of Integer = ( 1, 1, -1,
1, -2, -1,
1, 1, -1);
GRADIENT_NW: array [0..8] of Integer = ( 1, 1, 1,
1, -2, -1,
1, -1, -1);
GRADIENT_N: array [0..8] of Integer = ( 1, 1, 1,
1, -2, 1,
-1, -1, -1);
GRADIENT_NE: array [0..8] of Integer = ( 1, 1, 1,
-1, -2, 1,
-1, -1, 1);
UWYPUKLAJACY_E: array [0..8] of Integer = (-1, 0, 1,
-1, 1, 1,
-1, 0, 1);
UWYPUKLAJACY_SE: array [0..8] of Integer = (-1, -1, 0,
-1, 1, 1,
0, 1, 1);
UWYPUKLAJACY_S: array [0..8] of Integer = (-1, -1, -1,
0, 1, 0,
1, 1, 1);
UWYPUKLAJACY_SW: array [0..8] of Integer = ( 0, -1, -1,
1, 1, -1,
1, 1, 0);
UWYPUKLAJACY_W: array [0..8] of Integer = ( 1, 0, -1,
1, 1, -1,
1, 0, -1);
UWYPUKLAJACY_NW: array [0..8] of Integer = ( 1, 1, 0,
1, 1, -1,
0, -1, -1);
UWYPUKLAJACY_N: array [0..8] of Integer = ( 1, 1, 1,
0, 1, 0,
-1, -1, -1);
UWYPUKLAJACY_NE: array [0..8] of Integer = ( 0, 1, 1,
-1, 1, 1,
-1, -1, 0);
LAPL1: array [0..8] of Integer = ( 0, -1, 0,
-1, 4, -1,
0, -1, 0);
LAPL2: array [0..8] of Integer = (-1, -1, -1,
-1, 8, -1,
-1, -1, -1);
LAPL3: array [0..8] of Integer = ( 1, -2, 1,
-2, 4, -2,
1, -2, 1);
LAPL_SKOSNY: array [0..8] of Integer = (-1, 0, -1,
0, 4, 0,
-1, 0, -1);
LAPL_PIONOWY: array [0..8] of Integer = ( 0, -1, 0,
0, 2, 0,
0, -1, 0);
LAPL_POZIOMY: array [0..8] of Integer = ( 0, 0, 0,
-1, 2, -1,
0, 0, 0);
SOBEL_POZIOMY: array [0..8] of Integer = ( 1, 2, 1,
0, 0, 0,
-1, -2, -1);
SOBEL_PIONOWY: array [0..8] of Integer = ( 1, 0, -1,
2, 0, -2,
1, 0, -1);
PREWITT_POZIOMY: array [0..8] of Integer = (-1, -1, -1,
0, 0, 0,
1, 1, 1);
PREWITT_PIONOWY: array [0..8] of Integer = ( 1, 0, -1,
1, 0, -1,
1, 0, -1);
implementation
end.

