这是一篇基于视觉颜色机制的边缘检测论文,原文分中文和英文版
中文版链接:中文版PDF
英文版链接:英文版PDF
项目主页:http://www.neuro.uestc.edu.cn/vccl/projcvpr2013.html
以下是我个人学习该算法后的理解,希望各位看官批评指正!
整个算法可分为以下几步:
1、输入一张彩色图像
2、 分别提取R-G-B三种颜色信息,并计算Y颜色信息,进行高斯滤波得到
3、设置连接权重ω ,通过式(1)得到R+wG和wR+G两种连接权值的的结果
$$ Srg、Sgr $$
(II层中处理),B-Y两个通道类似,可得到四个中间结果
$$ Srg、Sgr、Sby、Syb $$
4、III层(Cortex layer)对II层中的结果
$$ Srg、Sgr、Sby、Syb $$
进行计算,公式如(6)所示:
其中:
$$ Sr-g+=-Sr+g- $$
$$ Nr+g-、Nr-g+ $$
分别表示V1层神经元R-on/G-off 和 R-off/G-on的RF(由公式(3)(4)(5)得到的RF)。
而
取分母为16,则θi取[0,2π]之间相隔π/8的16个角度,由(6)式会得到16个结果,对应于16(程序中只用到了8个角,0到π)个不同朝向θi的滤波器结果,这个D(x,y)是对四个拮抗通道其中之一进行计算的结果,所以,四个通道会得到四组相应的D(x,y)。
四组D(x,y)值,通过(8)式,每组取其中的最大值可得到对应于四个通道的四个D(x,y),并对其进行线性归一化,将四个通道的响应归一化到[0,1]
输出四个归一化后的D(x,y)。
5、最终的轮廓响应为r(x,y),如公式(9)所示,r(x,y)是对步骤4中的D(x,y)取最大值的结果。
以下是我个人对作者代码的理解
流程图如下所示
主要函数功能为
1、Gaus(sgm)sgm为sigma值,返回一个滤波矩阵
2、SingleOpponent( map,opponent,sigma,weights )
参数:opponent
为RG或BY两个值之一,分别代表两对拮抗通道
过程:对R、G、B、Y
四个通道进行滤波,再计算R’+w*G’、w*R’+G’、B’+w*Y’、w*B’+Y’
,分别对应
$$ Srg、Sgr、Sby、Syb$$
返回:
$$ Srg、Sgr、Sby、Syb $$
3、DivGauss2D( sigma,seta ),seta为不通滤波器的朝向,返回一个滤波矩阵
4、conByfft( img,tpl )
参数:img
为
$$ Srg、Sgr、Sby、Syb $$
四个其中之一, tpl 为 DivGauss2D( )返回的结果进行归一化
过程:对img进行填充、傅里叶及其逆变换等处理
返回:与img相同大小的矩阵,即为
$$ Drg(θi)、Dgr (θi )、Dby (θi)、Dyb (θi) $$
5、OrientedDoubleOpponent( map,opponent,sigma,angles,weights )
过程:调用SingleOpponent()、DivGauss2D()、conByfft()
返回:返回
$$ Drg、Dgr、Dby、Dyb $$
6、resDO( map,sigma,angles,weights )
过程:
$$ Drg、Dgr、Dby、Dyb$$
都是xy8(如果angles设为8)的矩阵,即八组
$$ Drg(θi)、Dgr(θi)、Dby(θi)、Dyb(θi) $$
取八组
$$ Drg(θi) $$
数据中每个 (x , y)点对应的最大值作为新的
$$ CBrg$$
其他三组数据相同,其中
$$ CBrg( : , : ) $$
是
$$ Drg$$
中的最大值,而Orients(:,:,1)是
$$ Drg$$
中最大值在矩阵中的位置
$$ CBrg、CBgr、CBby、CByb $$
分别代表四个通道得到的边缘矩阵,对每个像素点,取四个通道中的最大边缘值作为 Re ( : , : )
,取该值在原矩阵中对应的angles
值为theta( : , : )
。
返回:Re ( : , : )
和theta( : , : )
矩阵,Re
即为初步的边缘矩阵。
7、nonmax(im,theta)
参数:im
为resDO()
的返回值Re进行归一化,theta
为resDO()
的返回值theta进行角度变换
过程:A点在方向1上有最大边界值a,而在方向1上相邻的两个点B,C也有计算得到的边界值b,但是a小于等于b,这说明A点的边界比B、C点的边界强度低,那么真正的边界应该是在B或C处取得,所以应该令A点处的边界值为0,这样可以保留最合适的边界点。
返回:返回比输入im
小一个像素圈大小的边缘矩阵im
8、COBoundary(map,sigma,angles,weights)
参数:map
为处理的图像,sigma、angles、weights
为设置的参数(此算法需要设置的所有参数就是这三个)
过程:调用resDO()、nonmax(),对nonmax()
中得到的im
进行边缘填充0,得到最终的边界矩阵fb
返回:最终的轮廓矩阵fb
最后,我只想说,格式好难调,文中有些格式确实不好看,还请见谅!