请教如何提取canvas上的图象边界?(100分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的代码不能提取,不知哪位大侠能帮一下我!
我想把边界变成黑色,其余变白色.谢谢了!
simulate是form,pntbx为paintbox。
var
TempColor:Tcolor;
for I:=0 to simulate.pntbx.Width-1 do
begin
for J:=0 to simulate.pntbx.Height-1 do
begin
SBln:=false;
TempColor:=simulate.pntbx.Canvas.Pixels[I,J];
Templcolor:=simulate.pntbx.Canvas.Pixels[I-1,J];
Temprcolor:=simulate.pntbx.Canvas.Pixels[I+1,J];
Temptcolor:=simulate.pntbx.Canvas.Pixels[I,J-1];
Tempdcolor:=simulate.pntbx.Canvas.Pixels[I,J+1];
if (TempColor=Templcolor) or (TempColor=Temprcolor) or (TempColor=Temptcolor) or (TempColor=TempDcolor) then
SBln:=true;
if SBln=true then
simulate.pntbx.Canvas.Pixels[I,J]:=clblack
else
simulate.pntbx.Canvas.Pixels[I,J]:=clwhite;
end;
end;

 
你可以看看数字图像处理的轮廓提取部分。

按照你的思路有三个问题:
1. 原始图是什么图?二色?
2. 另外,你可能需要一个临时图用来保存原始图,
在原始图上取点,结果写到临时图中
3. 这种方法太慢,最好用 ScanLine
 
cqbaobao:谢谢关注!
1.原始图上是几块不规则的色区(颜色彼此不同),彼此有分界线.(我想只留下边界,其余变白色)
2.不需要保存原始图,所以用不着临时图.
3.ScanLine 我不大会用,我是对点操作,ScanLine 行吗?
我想这个不会太复杂的吧,我的思路有问题吗?
 
以下是sobal边缘检测的一个例子,或许有帮助,用scanline实现!速度很快的
我用的是sobal算子,算法如下,自己改动一下,
procedure TMainForm.sobalClick(Sender: TObject);
var
bmp1, bmp2: Tbitmap;
p1, p3, p2, p4: pbytearray;
i, j: integer;
r, g, b: Byte;
// r,g,b:integer;
begin
//self.DoubleBuffered := true; //²ÉÓÃ3x3µÄÄ£°å
bmp1 := Tbitmap.Create;
bmp2 := Tbitmap.Create;
bmp1.Assign(backbmp);
bmp1.PixelFormat := pf24bit;
bmp1.Width := ChildForm.image1.Picture.Graphic.Width;
bmp1.Height := ChildForm.image1.Picture.Graphic.Height;
bmp2.Assign(bmp1);
bmp2.PixelFormat := pf24bit;
starttime := GetTickCount;
for j := 1 to bmp1.Height - 2 do
begin
p1 := bmp1.ScanLine[j];
p2 := bmp2.ScanLine[j - 1];
p3 := bmp2.ScanLine[j];
p4 := bmp2.ScanLine[j + 1];
for i := 1 to bmp1.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)]))));

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)]))));
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;
ChildForm.image1.Picture.Bitmap.Assign(bmp1);
 
ok!各位不知还有好的方法吗?
procedure TForm1.Button1Click(Sender: TObject);
var
IA, IB, M: Integer;
begin
for IA := 1 to Form1.Image1.Picture.Width do
begin
for IB := 1 to Form1.Image1.Picture.Height do
begin
if Form1.Image1.Canvas.Pixels[IA + 1, IB] = $000000 then
Form1.Image1.Canvas.Pixels[IA, IB] := $808080;
if Form1.Image1.Canvas.Pixels[IA, IB + 1] = $000000 then
Form1.Image1.Canvas.Pixels[IA, IB] := $808080;
end;
end;

for IA := 1 to Form1.Image1.Picture.Width do
begin
for IB := 1 to Form1.Image1.Picture.Height do
begin
M := Form1.Image1.Canvas.Pixels[IA, IB];
if Form1.Image1.Canvas.Pixels[IA + 1, IB] <> M then
Form1.Image1.Canvas.Pixels[IA, IB] := $000000;
if Form1.Image1.Canvas.Pixels[IA, IB + 1] <> M then
Form1.Image1.Canvas.Pixels[IA, IB] := $000000;
end;
end;

repaint;

end;
 
多人接受答案了。
 
后退
顶部