论文部分内容阅读
摘要:Sobel算子是图像边缘检测中常用的方法之一,利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。本文提供了利用Sobel算子实现灰度图像边缘检测的C 源程序。
关键词:边缘检测;Sobel算子;梯度;噪声
中图分类号:TP183文献标识码:A文章编号:1009-3044(2008)15-20ppp-0c
Image Fringe Detection and Realization Based on Sobel Operator
SUN Hong-lin,LIAO Ji-wang
(Hunan Information College, Changsha 410200,China)
Abstract: Sobel operator is one of common Image fringe detection techniques, using image element’s left and right, top and bottom neighborhood field’s ash degree weighting algorithm, basing on the principle of reaching extremum at the fringe dot, we carry through fringe detection. The technique not only produces preferable detection effect, but also has the flatness effect on yawp and can offer exact fringe direction imformation. This paper offers C source program which realizes ash degree image fringe detection using Sobel operator
Key words: fringe detection; Sobel operator; grads; yawp
1 引言
边缘是图像最基本的特征。所谓边缘是指图像周围像素灰度有阶跃变化或屋顶状变化的像素的集合,它存在于目标与背景、目标与目标、区域与区域、基元与基元之间。边缘具有方向和幅度两个特征,沿边缘走向,像素值变化比较平缓;垂直于边缘走向,像素值变化比较剧烈,可能呈现阶跃状,也可能呈现斜坡状因此,边缘可以分为两种:一种为阶跃性边缘,它两边的像素灰度值有着明显的不同;另一种为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。对于阶跃性边缘,二阶方向导数在边缘处呈零交叉;而对于屋顶状边缘,二阶方向导数在边缘处取极值。
边缘检测技术是图像处理和计算机视觉等领域最基本的技术,如何快速、精确的提取图像边缘信息一直是国内外研究的热点,然而边缘检测又是图像处理中的一个难题。经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。常用的边缘检测方法有Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、LOG算子等。
2 Sobel算子特点分析
Sobel算子在求梯度之前,首先进行邻域平均或加权平均,然后进行微分,就能抑制噪声。Sobel 边缘检测算子使用两个如下有向算子(一个水平的,一个是垂直的),每一个逼近一个偏导数:
△xf(x,y)
={f(x 1,y-1) 2f(x 1,y) f(x 1,y 1)}-{f(x-1,y-1) 2f(x-1,y) f(x-1,y 1)}
△yf(x,y)
={f(x-1,y 1) 2f(x,y 1) f(x 1,y 1)}-{f(x-1,y-1) 2f(x,y-1) f(x 1,y-1)}
如果用Sobel算子检测图像M的边缘的话,可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的图像M1,M2,他们分别表示图像M中相同位置处的两个偏导数。然后把M1,M2对应位置的两个数平方后相加得到一个新的矩阵G,G表示M中各个像素的灰度的梯度值(一个逼近)。这样就可以通过阈值处理得到边缘图像。
Sobel 算子利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。
3 Sobel算子实现灰度图像边缘检测的函数源程序
void CDibView::OnMENUSobel()
{ HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->m_hDIB;
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData= lpbi * (LPDWORD)lpbi 256*sizeof(RGBQUAD);
//得到指向位图像素值的指针
pDoc->SetModifiedFlag(TRUE);//设修改标志为"TRUE"
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
//申请存放处理后的像素值的缓冲区
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
AfxGetApp()->BeginWaitCursor();
int i,j,buf,buf1,buf2;
for( j=0; jbiHeight; j )//以下循环求(x,y)位置的灰度值
for( i=0; ibiWidth; i )
{
if(((i-1)>=0)
关键词:边缘检测;Sobel算子;梯度;噪声
中图分类号:TP183文献标识码:A文章编号:1009-3044(2008)15-20ppp-0c
Image Fringe Detection and Realization Based on Sobel Operator
SUN Hong-lin,LIAO Ji-wang
(Hunan Information College, Changsha 410200,China)
Abstract: Sobel operator is one of common Image fringe detection techniques, using image element’s left and right, top and bottom neighborhood field’s ash degree weighting algorithm, basing on the principle of reaching extremum at the fringe dot, we carry through fringe detection. The technique not only produces preferable detection effect, but also has the flatness effect on yawp and can offer exact fringe direction imformation. This paper offers C source program which realizes ash degree image fringe detection using Sobel operator
Key words: fringe detection; Sobel operator; grads; yawp
1 引言
边缘是图像最基本的特征。所谓边缘是指图像周围像素灰度有阶跃变化或屋顶状变化的像素的集合,它存在于目标与背景、目标与目标、区域与区域、基元与基元之间。边缘具有方向和幅度两个特征,沿边缘走向,像素值变化比较平缓;垂直于边缘走向,像素值变化比较剧烈,可能呈现阶跃状,也可能呈现斜坡状因此,边缘可以分为两种:一种为阶跃性边缘,它两边的像素灰度值有着明显的不同;另一种为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。对于阶跃性边缘,二阶方向导数在边缘处呈零交叉;而对于屋顶状边缘,二阶方向导数在边缘处取极值。
边缘检测技术是图像处理和计算机视觉等领域最基本的技术,如何快速、精确的提取图像边缘信息一直是国内外研究的热点,然而边缘检测又是图像处理中的一个难题。经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。常用的边缘检测方法有Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、LOG算子等。
2 Sobel算子特点分析
Sobel算子在求梯度之前,首先进行邻域平均或加权平均,然后进行微分,就能抑制噪声。Sobel 边缘检测算子使用两个如下有向算子(一个水平的,一个是垂直的),每一个逼近一个偏导数:
△xf(x,y)
={f(x 1,y-1) 2f(x 1,y) f(x 1,y 1)}-{f(x-1,y-1) 2f(x-1,y) f(x-1,y 1)}
△yf(x,y)
={f(x-1,y 1) 2f(x,y 1) f(x 1,y 1)}-{f(x-1,y-1) 2f(x,y-1) f(x 1,y-1)}
如果用Sobel算子检测图像M的边缘的话,可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的图像M1,M2,他们分别表示图像M中相同位置处的两个偏导数。然后把M1,M2对应位置的两个数平方后相加得到一个新的矩阵G,G表示M中各个像素的灰度的梯度值(一个逼近)。这样就可以通过阈值处理得到边缘图像。
Sobel 算子利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。
3 Sobel算子实现灰度图像边缘检测的函数源程序
void CDibView::OnMENUSobel()
{ HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->m_hDIB;
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData= lpbi * (LPDWORD)lpbi 256*sizeof(RGBQUAD);
//得到指向位图像素值的指针
pDoc->SetModifiedFlag(TRUE);//设修改标志为"TRUE"
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
//申请存放处理后的像素值的缓冲区
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
AfxGetApp()->BeginWaitCursor();
int i,j,buf,buf1,buf2;
for( j=0; jbiHeight; j )//以下循环求(x,y)位置的灰度值
for( i=0; ibiWidth; i )
{
if(((i-1)>=0)