在边沿检测中,常用的一种模板是sobel 算子。sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。与 和 相比,sobel算子对于象素的位置的影响做了加权,因此效果更好。
sobel算子另一种形式是各向同性sobel(isotropic sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。各向同性sobel算子和普通sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性sobel算子的处理方法。
由于sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是sobel算子没有基于图像灰度进行处理,由于sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。 在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
.net代码如下
for(times=0;times<128&&ithreshold!=inewthreshold;times++)
{
ithreshold=inewthreshold;
lp1=0;
lp2=0;
ls1=0;
ls2=0;
for(i=imingray;i<ithreshold;i++)
{
lp1+=histogram*i;
ls1+=histogram<i>;
}
imean1gray=lp1/ls1;
for(i=ithreshold;i<imaxgray;i++)
{
lp2+=histogram<i>*i;
ls2+=histogram<i>;
}
imean2gray=lp2/ls2;
inewthreshold=(imean1gray+imean2gray)/2;
}