Sobel边缘检测算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;