Binary Open Close ile degil Gri scalada Open Close ile yapacaksın.
Mantık aynı Binary deki gibi anca bu sefer piksellerin Open icin Min
Close icin Max değerine bakacaksın.
Benim kodlarım Assembly(MMX) bu yuzden pseudo-code yazmaya çalışayım;
ERODE işlemi:
d= kernel radius.
c,m= 32 Bit Color.
dd:= d*d;
for y := Top to Bottom - 1 do
begin
y0 := Max(Top, y - d); ; Ust ve Alt Kenarlarda
taşmaya bakıyoruz.
y1 := Min(Bottom-1, y + d);
for x := Left to Right - 1 do
begin
x0 := Max(Left, x - d); ; Sağ ve Sol kenarlarda
taşmaya bakıyoruz.
x1 := Min(Right-1, x + d);
c.a := alpha;
c.r := 255;
c.g := 255;
c.b := 255;
for j := y0 to y1 do
begin
for i := x0 to x1 do
begin
chk:= ((x-i)*(x-i) + (y-j)*(y-j)); ; Disc kernel
yapmaya çalışıyoruz. kernelin 0 olan bitleri için atlıyoruz.
if chk <= dd then
begin
m := Src.PixelPtr[i, j]^; ; Source Image den
pikseli okuyoruz.
c.r := Min(c.r, m.r); ; c de kernelin
Minimum değerlerini tutuyoruz.
c.g := Min(c.g, m.g);
c.b := Min(c.b, m.b);
end;
end;
end;
Dst.Pixels[x,y]:= c; ; Bulduğumuz min
değeri Destination Image e yazıyoruz.
end;
end;
DILATE işlemi için Min yerine Max yazacaksın.
Eğer yukarıdaki gibi hesapla kernel bulmak istemiyorsan Kerneli şu
şekilde alabilirsin;
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
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 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0
MMX kodunu yazabilmek için hangi derleyiciyi kullanıyorsun bilmem
lazım.
Kolay gelsin.
On 22 Ağustos, 01:00, "
huseyinku...@googlemail.com"