sobel算子原理_sobel算子計算梯度_邊緣檢測之Sobel檢測算子
本文關鍵詞:sobel算子,由筆耕文化傳播整理發(fā)布。
標簽:des 算法 class style src 使用 方法 com
在討論邊緣算子之前,首先給出一些術語的定義:
(1)邊緣:灰度或結構等信息的突變處,邊緣是一個區(qū)域的結束,也是另一個區(qū)域的開始,利用該特征可以分割圖像。
(2)邊緣點:圖像中具有坐標[x,y],且處在強度顯著變化的位置上的點。
(3)邊緣段:對應于邊緣點坐標[x,y]及其方位 ,邊緣的方位可能是梯度角。
二、sobel算子的基本原理
sobel算子是一階導數(shù)的邊緣檢測算子,在算法實現(xiàn)過程中,通過3×3模板作為核與圖像中的每個像素點做卷積和運算,然后選取合適的閾值以提取邊緣。
一個特殊卷積所實現(xiàn)的功能是由卷積核的形式決定的。這個核本質上是一個大小固定、由數(shù)值參數(shù)構成的數(shù)組,數(shù)組的參考點(anchor point)通常位于數(shù)組的中心。數(shù)組的大小成為核支撐。單就技術而言,核支撐實際上僅僅由核數(shù)組的非0部分組成。對圖像的卷積,首先將核的參考點定位到圖像的第一個像素點,核的其余元素覆蓋圖像中其相對應的局部像素點。對于每一個核點,我們可以得到這個點的核值以及圖像中相應圖像點的值,將這些值相乘并求和,并將這個結果放在與輸入圖像參考點所相對應的位置。通過在整個圖像上掃描卷積核,對圖像的每個點重復此操作。
索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術上,它是一階離散性差分算子,用來運算圖像亮度函數(shù)的灰度值近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量。
Sobel卷積因子為:
該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,,Gx及Gy分別代表經橫向及縱向邊緣檢測的圖像灰度值,其公式如下:
具體計算如下:
Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)
+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)
+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)
= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]
Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)
+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)
+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)
= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]
其中f(a,b), 表示圖像(a,b)點的灰度值;
圖像的每一個像素的橫向及縱向灰度值通過以下公式結合,來計算該點灰度的大小:
通常,為了提高效率 使用不開平方的近似值:
如果梯度G大于某一閥值 則認為該點(x,y)為邊緣點。
然后可用以下公式計算梯度方向:
sobel算子根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現(xiàn)象檢測邊緣。對噪聲具有平滑作用,提供較為精確的邊緣方向信息,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
sobel算子算法的優(yōu)點是計算簡單,速度快。但是由于只采用了2個方向的模板,只能檢測水平和垂直方向的邊緣,因此這種算法對于紋理較為復雜的圖像,其邊緣檢測效果就不是很理想。該算法認為:凡灰度新值大于或等于閾值的像素點時都是邊緣點。這種判斷欠合理,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大。
1 #include <opencv2/opencv.hpp> main(int argc, char **argv) 4 { *ptrSrcImageWindowTitle = ; *ptrGrayImageWindowTitle = ; *ptrDesImageWindowTitle = ; IplImage *pSrcImage = cvLoadImage(, CV_LOAD_IMAGE_ANYCOLOR); 11 IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); 12 IplImage *pSobelImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); 15 //進行Sobel邊緣檢測,注意xorder和yorder的不同,邊緣檢測的方向不同 cvSobel(pGrayImage, pSobelImage, 1, 0, 3); 18 19 cvNamedWindow(ptrSrcImageWindowTitle, CV_WINDOW_AUTOSIZE); 20 cvNamedWindow(ptrGrayImageWindowTitle, CV_WINDOW_AUTOSIZE); 21 cvNamedWindow(ptrDesImageWindowTitle, CV_WINDOW_AUTOSIZE); 22 23 cvShowImage(ptrSrcImageWindowTitle, pSrcImage); 24 cvShowImage(ptrGrayImageWindowTitle, pGrayImage); 25 cvShowImage(ptrDesImageWindowTitle, pSobelImage); 26 27 cvWaitKey(0); 28 cvReleaseImage(&pSrcImage); 29 cvReleaseImage(&pGrayImage); 30 cvReleaseImage(&pSobelImage); 31 32 cvDestroyWindow(ptrSrcImageWindowTitle); 33 cvDestroyWindow(ptrGrayImageWindowTitle); 34 cvDestroyWindow(ptrDesImageWindowTitle); 35 36 }
附帶知識:
普利維特算子(Prewitt operate):
除sobel邊緣檢測外 還有Prewitt算子, 它的卷積因子如下:
其他計算 和sobel差不多;
Prewitt算子利用像素點上下、左右鄰點灰度差,在邊緣處達到極值檢測邊緣。對噪聲具有平滑作用,定位精度不夠高。
羅伯茨交叉邊緣檢測(Roberts Cross operator)
卷積因子如下:
灰度公式為:
近似公式為:
具體計算如下:
G(x,y)=abs(f(x,y)-f(x+1,y+1))+abs(f(x,y+1)-f(x+1,y))
灰度方向 計算公式為:
Roberts算子采用對角線方向相鄰兩像素之差近似梯度幅值檢測邊緣。檢測水平和垂直邊緣的效果好于斜向邊緣,定位精度高,對噪聲敏感。
邊緣檢測之Sobel檢測算子,布布扣,bubuko.com
邊緣檢測之Sobel檢測算子
標簽:des 算法 class style src 使用 方法 com
原文:
本文關鍵詞:sobel算子,由筆耕文化傳播整理發(fā)布。
本文編號:64864
本文鏈接:http://sikaile.net/wenshubaike/shangbiaozhuanli/64864.html