彩色图像边缘检测
回顾灰度图像边缘检测,我们一般求出图像的梯度:
∇fx(x,y)=f(x+1,y)−f(x,y)∇fy(x,y)=f(x,y+1)−f(x,y)
或者求出图像的二阶差分:
Δfx(x,y)=f(x+1,y)+f(x−1,y)−2f(x,y)Δfy(x,y)=f(x,y+1)+f(x,y−1)−2f(x,y)
然后根据梯度和二阶差分的大小,以及最大变化率方向来寻找可能存在的图像边缘。
彩色图像的每个像素包含红绿蓝三个分量,这样每个像素可以由一个三维向量来表示。但是在进行图像边缘检测的时候,我们遇到一个问题,那就是向量并不存在梯度概念。单独对每个颜色分量进行边缘检测,其梯度不能反映图像整体彩色的差异变化。
一个广为使用的彩色图像梯度方法来自Zenzo[1986]的论文
u⃗ =∂R∂xr⃗ +∂G∂xg⃗ +∂B∂xb⃗
v⃗ =∂R∂yr⃗ +∂G∂yg⃗ +∂B∂yb⃗
其中R,G,B是图像分量, r⃗ ,g⃗ ,b⃗ 等是单位向量,表征颜色分量坐标。然后继续计算有:
gxx=u⃗ Tu⃗ =∣∣∣∂R∂x∣∣∣2+∣∣∣∂G∂x∣∣∣2+∣∣∣∂B∂x∣∣∣2
gyy=v⃗ Tv⃗ =∣∣∣∂R∂y∣∣∣2+∣∣∣∂G∂y∣∣∣2+∣∣∣∂B∂y∣∣∣2
gxy=u⃗ Tv⃗ =∂R∂x∂R∂y+∂G∂x∂G∂y+∂B∂x∂B∂y
注意这里执行的是向量乘法,而不是进一步求导。梯度方向为:
θ=12arctan[2gxy(gxx−gyy)]
由梯度方向才能计算梯度:
F(θ)={12[(gxx+gyy)+(gxx−gyy)cos2θ+2gxysin2θ]}12
matlab上自带的edge函数目前没发现可以对彩色图像直接进行边缘检测的方法,C++的openCV库也没有发现。上述工具一般会对彩色图像进行灰度化再执行边缘检测,效果也不算差。
Zenzo, A Note on the Gradient of a Multi-Image,º Computer[C]// Vision Graphics Image Processing. 1986.