Sobel边缘检测算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.Sobel边缘检测算法:

procedure TImageProcessForm.SobelClick(Sender: TObject);

var

p1, p3, p2, p4: pByteArray;

I,J: integer;

R,G,B: Byte;

begin

self.DoubleBuffered := true; //采用双缓冲模式

TestBMP.Assign(WillbeChangedBmp);

ProcessedBmp.Assign(WillbeChangedBmp);

for J := 1 to TestBMP.Height - 2 do

begin

p1 := TestBMP.ScanLine[j];

p2 := ProcessedBmp.ScanLine[j - 1];

p3 := ProcessedBmp.ScanLine[j];

p4 := ProcessedBmp.ScanLine[j + 1];

for I := 1 to TestBMP.Width - 2 do

begin

R := min(255, max(0, ((-p2[3 * (i - 1) + 2] - 2 * p2[3 * i +

2] - p2[3 * (i + 1) + 2] - 0 * p3[3 * (i - 1) + 2]

+ 0 * p3[3 * i + 2] - 0 * p3[3 * (i + 1)

+ 2] + p4[3 * (i - 1) + 2] + 2 * p4[3 * i + 2] +

p4[3 * (i + 1) + 2]))));

G := min(255, max(0, ((-p2[3 * (i - 1) + 1] - 2 * p2[3 * i +

1] - p2[3 * (i + 1) + 1] - 0 * p3[3 * (i - 1) + 1]

+ 0 * p3[3 * i + 1]- 0 * p3[3 * (i + 1) + 1]

+ p4[3 * (i - 1) + 1] + 2 * p4[3 * i + 1]

+ p4[3 * (i + 1) + 1]))));

B := min(255, max(0, ((-p2[3 * (i - 1)] - 2 * p2[3 * i]

- p2[3* (i + 1)]- 0 * p3[3 * (i - 1)]

+ 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]

+ p4[3 * (i - 1)] + 2 * p4[3 * i + 2] + p4[3 * (i + 1)]))));

// 采用检测水平边缘的sobel算子[-1,-2,1,0,0,0,1,2,1]

p1[3 * i + 2] := min(255, max(0, ((-p2[3 * (i - 1) + 2] + 0 *

p2[3* i + 2] + P2[3 * (i + 1) + 2] - 2 * p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 2] + 2 * p3[3 * (i+ 1) + 2] - p4[3 * (i - 1) + 2]

- 0 * p4[3 * i + 2] + p4[3* (i + 1) + 2]))));

p1[3 * i + 1] := min(255, max(0, ((-p2[3 * (i - 1) + 1] + 0 *

p2[3* i + 1]+ p2[3 * (i + 1) + 1] - 2 * p3[3 * (i - 1) + 1]

+ 0 * p3[3* i + 1] + 2 * p3[3 * (i+ 1) + 1] -

p4[3 * (i - 1) + 1] - 0 * p4[3 * i + 1] +

p4[3* (i + 1) + 1]))));

p1[3 * i] := min(255, max(0, ((-p2[3 * (i - 1)] + 0 * p2[3 *

i] + p2[3 * (i + 1)] - 2 * p3[3 * (i - 1)] + 0 * p3[3 * i] + 2

* p3[3 * (i + 1)] - p4[3 * (i - 1)] - 0 * p4[3 * i]

+ p4[3 * (i +1)]))));

//采用检测水平边缘的sobel算子[-1,0,1,-2,0,2,-1,0,1] p1[3 * i + 2] := (Max(R, p1[3 * i + 2]));

p1[3 * i + 1] := (Max(G, p1[3 * i + 1]));

p1[3 * i] := (Max(B, p1[3 * i]));

end;

end;

ChangedBmp.Assign(TestBMP);

ShowChangedBmp;

end;

相关文档
最新文档