边界获得!300分! (50分)

  • 主题发起人 主题发起人 delphiIlove
  • 开始时间 开始时间
D

delphiIlove

Unregistered / Unconfirmed
GUEST, unregistred user!
300分求获取图象边界的算法,要可以连续边界点的表示,只需要对二值图象处理就行了,
也就是说只需要从黑色背景图中找到白色的边界就行了。只要可以,立即给分。
 
先要定义边界象素的宽度
根据宽度 在360度 范围内寻找走向

根据颜色取值 来区分 很多时候只是一个范围

///|///
// - - //
( @ @ )
+---------------------oOOoo-(?)ooOOo---------------------+
| |
| 来拿分来了 |
| E-MAIL: you@xu.com.cn |
| OICQ : 4529818 |
| URL : http://www.yousoft.net/ |
| Ooooo 徐长友 2000.04.01 |
+-----------------------ooooO--( )---------------------+
( ) )|/
/|( (_/
/_)
 
写了一个过程,在D6下通过.
希望不是50分,而且300分.

var
Bmp, Bound: TBitmap;
p1, p2, p3, pr: PByteArray;
i, j, b: Integer;
begin
Bmp := TBitmap.Create;
Bound := TBitmap.Create;
try
//载入二值图
Bmp.LoadFromFile(InFileName);
Bmp.PixelFormat := pf8Bit;

//初始化边界图
Bound.Assign(Bmp);
with Bound.Canvas do begin
Brush.Color := clBlack;
FillRect(Rect(0, 0, Bound.Width, Bound.Height));
end;

//边界查找
p2 := Bmp.ScanLine[0];
p3 := Bmp.ScanLine[1];
for i := 1 to Bmp.Height - 2 do begin
p1 := p2;
p2 := p3;
p3 := Bmp.ScanLine[i + 1];
pr := Bound.ScanLine;

for j := 1 to Bmp.Width - 2 do begin
b := p2[j] * 20
- (p1[j - 1] + p1[j + 1] + p3[j - 1] + p3[j + 1])
- (p1[j] + p2[j - 1] + p2[j + 1] + p3[j]) * 4;

if b > 255 then pr[j] := 255;
end;
end;

//保存边界结果
Bound.SaveToFile(OutFileName);
finally
Bound.Free;
Bmp.Free;
end;
end;
 
参考:

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1457649
 
to JohnsonGuo:谢谢,我看过你以前回的帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1460271
里面的程序比上面更详细,但是我目前需要达到的目标是把边界描述成连续的点(有顺序要求),
在查过一些资料后,我决定用数学形态学中的一些方法,不过我还是希望能有其他一些好的算法
能够实现。你以前的帖子给过我一些启示,下面的50用来感谢你,如果你还有好的方案或是算法我是不会
吝惜分数的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1471594
 
接受答案了.
 
后退
顶部