谁知道边缘提取的算法(100分)

W

winsun

Unregistered / Unconfirmed
GUEST, unregistred user!
我想知道如何对一幅BMP的图象进行边缘提取,比如说,
有一幅人脸的图象,想要得到脸的轮廓线,该怎么办?
 
如果想要得到矢量化结果,参加本论坛的huizhang大虾是专家,
他回答过类似问题,您可以检索一下。

如果想要得到仍然是栅格型的BMP,提醒一下,可以用个矩阵算子,
移动计算出来,具体请看数字图象处理方面的参考资料,这是基本内容。
我已经忘记,全还给老师了:(
 
你可以在 DELPHI SUPER PAGE 找到一个叫 PI 的程序,源程序内含了算法。
http://sunsite.icm.edu.pl/delphi/
 
Sorry Sorry , 我写错了文件名 应该是 TransImg.ZIP 它自动寻找图象的边界;
希望你有用。
 
常用的算法有导数运算, 梯度运算和拉普拉斯算子法
比较简单的算法是求导数, 但是有方向性
梯度和拉普拉斯方法稍微复杂一些, 而且都对噪声比
较敏感

呵呵, 今天来不及输入计算公式了, 明天在来吧!
 
再 不来输,我可要输了,//哈哈。-------抢你的分。
 
轮廓跟踪算法可是一个大工程, 不是一两句话就能够说清楚的问题, 手头没有现成的
程序, 只好给出一个思路. 不过可以告诉你, 别让 pegasus 把你吓坏了, 简单的轮
廓跟踪不需要数学运算, 只需要对像素的 八个方位 的相互关系进行操作即可.

最基本思路如下:

1. 在一块色块内任取一点, 取其像素的色彩值作为追踪色彩
2. 在该点的扫描线上找到相同色最边上的点作为起始点
3. 沿着一个顺序(如顺时针)查找相邻的边界点, 存放到一个数组中, 直到回到起始点

这只是对于单色色块求其外边界, 经常是一个色块内有多个不同的色块, 那就需要逐个的将他们的边界球出来. 对于真彩色还需要用一个色彩区域去判断相邻关系.
 
>别让 pegasus 把你吓坏了, 简单的轮廓跟踪不需要数学运算, 只
>需要对像素的 八个方位 的相互关系进行操作即可.
呵呵, 我可不是吓人. 八个方向的相互关系进行操作的原理就是
那些数学计算. 而且, 按照我说的那些办法, 实际是进行所谓的
边缘增强, 比您这里给出的轮廓跟踪可要简单多了, :)
话又说回来, 那些数学计算其实很简单, 并不是想象的那样会把
人吓坏, :)

嗨, 又没来得及输入这些简单的计算公式!
 
pegasus 抱歉, 不过你列出了几个数学名词实在吓人, 赶快将公式贴到这吧
 
>pegasus 抱歉, 不过你列出了几个数学名词实在吓人, 赶快将公式贴到这吧
不好意思, 这些名词是有些吓人, :) 而且他们的功能只是进行边缘增强

1. 导数法:
导数就是原函数相对于若干变元的变化率, 在图像领域往往用相邻像素的差分来代替导数:
delta-x(f(i,j)) = f(i,j) - f(i-1,i) (X方向的差分)
delta-y(f(i,j)) = f(i,j) - f(i,i-1) (Y方向的差分)
导数计算简单易行, 但是有方向性, 实际图像一般不用

2. 梯度法
图像函数f(x,y)的梯度函数是一个矢量函数, 其大小为:
sqrt((df/dx)^2 + (df/dy)^2), 这里df/dx, df/dy均为偏导数,
其方向为:
arctan((df/dy)/(df/dx)), 这里df/dx, df/dy均为偏导数,
梯度运算对边界很敏感, 而且能够克服导数运算的方
向性, 但是计算比较复杂, 实际图像处理中往往用近似
计算法:
Grade(f(i,j)) = |delta-x(f(i,j))| + (delta-y(f(i,j))|
= |f(i,j)-f(i-1,j)| + |f(i,j)-f(i,j-1)|
(简单吧! :)

3. 拉普拉斯算子
此为导数算法的高阶形式, 也具有旋转不变性
计算公式为:
d^2(f(x,y))/d-x^2 + d^2(f(x,y))/d-y^2, 这里d^2f/dx^2, d^2f/dy^2均为二阶偏导数
近似计算公式为:
|f(i+1,j) + f(i-1,j) + f(i,j+1) + f(i,j-1) - 4f(i,j)|
(简单吧! :)

经过梯度运算或者拉普拉斯算子计算后, 图像的边缘部分就会得到增强
根据某个阈值, 就可以粗略地给出原始图像中的轮廓.

HuiZhang大侠介绍的边界跟踪方法效果比简单地边缘增强要好,
但是实现起来比较麻烦, 我就不再详细介绍了

 
找个图象处理的博士问一问是最简单的方法:)
或者找一份MATLAB的软件看一看,里边有一个图象处理的工具箱里有一个
edge.m的源程序,老外已经替您做好了。效果巨好,几乎是单象素的轮廓。
 
沉默者,

你不沉默了, 再多使点劲把那个MatLab的源程序贴到这, 不管是什么程序只要有算法
就是好东西
 
事实上,在对256阶灰度图像进行边缘检测的算子很多,就目前来说,沈俊算子和
Canny-Deriche算子分别是一阶二阶的最佳算子,在很多图像处理的书上都有介绍.
但我想你是想对彩色图像进行边缘检测,当然你可以先将原始图像转换为灰度图像
再做处理,但这些算子通常只对某一类型的图像有效,而对彩色图像的边缘检测,现在
还有许多人在研究,由于对人眼的视觉摸型现在还没有完全了解,因此并没有很好的
通用方法,但要提醒一句的是利用RGB色标体系来进行边缘检测,效果是不好的,通常
都要转换为Lab或HSI色标体系来综合处理,就象photoshop做的那样.
我说的那么多,无非是想说如果你是搞图像处理的不防可以研究一下,如果不是
干脆放弃.我的老师搞图像处理搞了一辈子,还没搞出个大名堂,唉.
如有不对之处,请大家指正.
 
>沈俊算子和Canny-Deriche算子分别是一阶二阶的最佳算子
请问一下你的最佳是什么意义下的最佳?
我的师兄搞了个形态学的算子,直观效果也不错.
 
首先抱歉我说的话不严谨.
这个最佳边缘检测的准则是浙大的顾老师和周老师对Canny提出的准则的改进,
详细可以见<模式识别和人工智能>1998,3月刊的介绍,我只是个小虾米,无法说
该准则是否是正确的或是最完善的,事实上这也很难判断,按该文中所叙述的,这二
个算子也只是他们提出的最佳算子在一阶,二阶上定常系数线性特例.
另:如果不保密的话,你是否可以将你师兄的算子给我介绍一下,我现在也在做
这方面的课题,分数我会再给你.

 
关于形态学算子.可以看
B.Chanda,et.al,A Multi-Scale Morphological Edge Detector,Pattern Recongnition
Vol.31,No.10,1998
 
在IMAGE UNDERSTANDING 98.1 中有人用心理学统计的方法对四种边缘检测算子
(SOBEL ,CANNY,还有两种不太常用的)
进行了比较,得出了几个结论(当然也是废话.)
1.边缘检测算子是有区别的,效果不同.
2.边缘检测算子的效果与图像内容有关,实验的四种边缘检测算子中,没有一种
对所有八种检测的图像都能得到最好的效果.
 
我试了不少的算法, 都没能达到最佳效果,现在快过年了, 我明天就要回家了。
等过完新年,我再考虑分数该怎么分配。
祝各位新年好!
可怜的我,回家就没有机会上网了。
 
winsun:

这个问题已经很长时间没有人参加讨论,为保持版面
整洁,节约网友时间,请提问者采取必要处理措施。
关于图形图象版管理细则,请参见<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=111927">这个</a>问题。如两天
内提问者没有响应,我将采取强制措施。

如有管理建议,请到<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=111927">这里</a>提出。谢谢!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
569
import
I
顶部