边缘检测是图像分析中使用到的最常见的操作之一,而且相比其他任何主题来说,文献中提到的与边缘增强(edge enhancement)[1]与边缘检测(edge detection)[2]相关算法可能最多的。从广义来说,其原因在于边缘形成一个在图象分析与视觉系统重要的处理主体的轮廓。边缘是对象与背景之间的边界,还是表示重叠对象之间的边界。这需要根据现在实际情况来定位。
边缘检测是被称作图像分割的过程的一部分,而图像分割的目的是识别出图像中的区域。从技术上说,边缘检测是定位边缘像素的过程,而边缘增强是增加边缘和背景之间对比度以便能够更清楚地看测边缘的过程。此外边缘跟踪(edge tracing)是沿着边缘进行跟踪的过程,这个过程通常会把边缘像素采集到一个列表中。
很自然,边缘有多种可能的定义,每一种定义都适用于某些特定的情况。其中一种最常用也是具有一般性的定义的理想阶梯型边缘(ideal step edge)。如图1所示:
图1 阶梯型边缘 (a)恰好在像素10的位置发生在灰阶变化。(b)灰阶发生了同样的变化,但是跨越了像素10周围的4个像素。这是一个斜坡边缘。(c)灰阶发生了同样的变化,但是跨越了像素10周围的10个像素。(d)跨越了10个像素的较小变化。
在这个一维的示例中,边缘只不过是在某个位置发生的灰阶变化。灰阶变化越大,边缘的检测也容易。但第一个难点是来自于数码化。图像的采样不可能使得整个边缘刚好落在像素边界上。第二个难点是来自于无处不在的噪声问题。图1(a)中阶梯型边缘是理想型边缘,因为很容易检测出来。
噪声的特征通常可以用带有特定平均值(mean)和标准偏差(stand deviation)的概率分布来表示。在图像分析中,我们特别关注的是以下两种的噪声:
信号无关的噪声是一组随机的灰阶值,在统计意义上和图像数据无关,这些数据加入图像的像素中产生了带噪声的图像。
// Measure the Normally distributed noise in a small region. // Assume that the mean is zero. #include "stdio.h" #include "cv.h" #include "highgui.h" #include "IPVACV.h" // Biggest possible filter mask #define MAX_MASK_SIZE 20 int main (int argc char* argv[ ]) { IMAGE im; int i,j,k = 0; float x =0.0, y = 0.0, z; double mean, sd; im =Iput_PBM(argv[1]); for(i = 0; i< im->info->nr; i++){ for(j = 0; j< im->info->nc; j++){ x +=(float)(im->data[i][j]); y +=(float)(im->data[i][j])*(float)(im->data[i][j]); k +=1; } } // Comput estimate - mean noise is 0 sd =(double)(y- x*x/(float)k)/(float)(k-1); mean = (double)(x/(float)k); printf("Image mean is %10.5f Standard deviatio is %10.5f\n",mean, sqrt(sd)); }
[1]. "Edge enhancement"From Wikipedia, the free encyclopediahttp://en.wikipedia.org/wiki/Edge_enhancement.
[2]. "Edge detection" From Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Edge_detection.
关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.