邊緣檢測演算法
Ⅰ 邊緣檢測與輪廓有什麼區別
邊緣檢測是檢測圖像的邊緣 也就是圖像差異比較大的地方
輪廓提取是提取出你想要得到的輪廓 輪廓可能是邊緣的一部分
Ⅱ 圖像邊緣檢測演算法的研究與實現 的開題報告
摘 要 針對基於PC實現的圖像邊緣檢測普遍存在的執行速度慢、不能滿足實時應用需求等缺點,本文藉助於TI公司的TMS320DM642圖像處理晶元作為數字圖像處理硬體平台,DSP/BIOS為實時操作系統,利用CCS開發環境來構建應用程序;並通過攝像頭提取視頻序列,實現對邊緣檢測Sobel運算元改進[1]。
關鍵詞 DM642;Sobel運算元;程序優化;圖像邊緣檢測
1 引言
邊緣是圖像中重要的特徵之一,是計算機視覺、模式識別等研究領域的重要基礎。圖像的大部分主要信息都存在於圖像的邊緣中,主要表現為圖像局部特徵的不連續性,是圖像中灰度變化比較強烈的地方,也即通常所說的信號發生奇異變化的地方。經典的邊緣檢測演算法是利用邊緣處的一階導數取極值、二階導數在階梯狀邊緣處呈零交叉或在屋頂狀邊緣處取極值的微分演算法。圖像邊緣檢測一直是圖像處理中的熱點和難點。
近年來,隨著數學和人工智慧技術的發展,各種類型的邊緣檢測演算法不斷涌現,如神經網路、遺傳演算法、數學形態學等理論運用到圖像的邊緣檢測中。但由於邊緣檢測存在著檢測精度、邊緣定位精度和抗雜訊等方面的矛盾及對於不同的演算法邊緣檢測結果的精度卻沒有統一的衡量標准,所以至今都還不能取得令人滿意的效果。另外隨著網路和多媒體技術的發展,圖像庫逐漸變得非常龐大;而又由於實時圖像的目標和背景間的變化都不盡相同,如何實現實時圖像邊緣的精確定位和提取成為人們必須面對的問題。隨著DSP晶元處理技術的發展,尤其是在圖像處理方面的提高如TMS320C6000系列,為實現高效的、實時的邊緣檢測提供了可能性[5]。在經典的邊緣檢測演算法中,Sobel邊緣檢測演算法因其計算量小、實現簡單、處理速度快,並且所得的邊緣光滑、連續等優點而得到廣泛的應用。本文針對Sobel演算法的性能,並藉助於TMS320DM642處理晶元[3],對該邊緣檢測演算法進行了改進和對程序的優化,滿足實時性需求。
2 Sobel邊緣檢測演算法的改進
經典的Sobel圖像邊緣檢測演算法,是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個是檢測垂直邊緣,一個是檢測水平邊緣。演算法的基本原理:由於圖像邊緣附近的亮度變化較大,所以可以把那些在鄰域內,灰度變化超過某個適當閾值TH的像素點當作邊緣點。Sobel演算法的優點是計算簡單,速度快。但由於只採用了兩個方向模板,只能檢測水平方向和垂直方向的邊緣,因此,這種演算法對於紋理較復雜的圖像,其邊緣檢測效果欠佳;同時,經典Sobel演算法認為,凡灰度新值大於或等於閾值的像素點都是邊緣點。這種判定依據是欠合理的,會造成邊緣點的誤判,因為多雜訊點的灰度新值也很大。
2.1 圖像加權中值濾波
由於圖像中的邊緣和雜訊在頻域中均表現為高頻成分,所以在邊緣檢測之前有必要先對圖像進行一次濾波處理,減少雜訊對邊緣檢測的影響。中值濾波是一種非線性信號的處理方法[2],在圖像處理中,常用來保護邊緣信息;保證濾波的效果。加權中值濾波,首先對每個窗口進行排序,取適當的比例,進行曲線擬合,擬合後的曲線斜率表徵了此窗口的圖像特徵,再根據圖像各部分特性適當的選擇權重進行加權。
2.2 增加方向模板
除了水平和垂直兩方向外,圖像的邊緣還有其它的方向,如135o和45o等,為了增加運算元在某一像素點檢測邊緣的精度,可將方向模板由2個增加為8個即再在經典的方向模板的基礎上增加6個方向模板,如圖1所示。
2.3 邊緣的定位及雜訊的去除
通常物體的邊緣是連續而光滑的,且邊緣具有方向和幅度兩個特徵,而雜訊是隨機的。沿任一邊緣點走向總能找到另一個邊緣點,且這兩個邊緣點之間的灰度差和方向差相近。而雜訊卻不同,在一般情況下,沿任一雜訊點很難找到與其灰度值和方差相似的雜訊點[4]。基於這一思想,可以將雜訊點和邊緣點區分開來。對於一幅數字圖像f(x,y),利用上述的8個方向模板Sobel運算元對圖像中的每個像素計算,取得其中的最大值作為該點的新值,而該最大值對應的模板所表示的方向為該像素點的方向。若|f(x,y)-f(x+i,y+j)|>TH2,對於任意i=0,1,-1;j=0,1,-1均成立,則可判斷點(x,y)為雜訊點。圖2給出了圖像邊緣檢測系統改進演算法的軟體流程圖。
圖1 邊緣檢測8個方向模板
圖2 系統結構圖
3 基於TMS320DM642的圖像處理的設計及演算法優化
3.1 TMS320DM642功能模塊及圖像處理系統的硬體結構
DSP以高速數字信號處理為目標進行晶元設計,採用改進的哈佛結構(程序匯流排和數據匯流排分開)、內部具有硬體乘法器、應用流水線技術、具有良好的並行性和專門用於數字信號處理的指令及超長指令字結構(VLIW)等特點;能完成運算量大的實時數字圖像處理工作。
TMS320DM642是TI公式最近推出的功能比較強大的TMS320C6x系列之一,是目前定點DSP領域里性能較高的一款[6]。其主頻是600MHz,8個並行運算單元、專用硬體邏輯、片內存儲器和片內外設電路等硬體,處理能力可達4800MIPS。DM642基於C64x內核,並在其基礎上增加了很多外圍設備和介面,因而在實際工程中的應用更為廣泛和簡便。本系統使用50 MHz晶體震盪器作為DSP的外部時鍾輸入,經過內部鎖相環12倍頻後產生600 MHz的工作頻率。DM642採用了2級緩存結構(L1和L2),大幅度提高了程序的運行性能。片內64位的EMIF(External Memory Interface)介面可以與SDRAM、Flash等存儲器件無縫連接,極大地方便了大量數據的搬移。更重要的是,作為一款專用視頻處理晶元,DM642包括了3個專用的視頻埠(VP0~VP2),用於接收和處理視頻,提高了整個系統的性能。此外,DM642自帶的EMAC口以及從EMIF 口擴展出來的ATA口,還為處理完成後產生的海量數據提供了存儲通道。
本系統是採用瑞泰公司開發的基於TI TMS320DM642 DSP晶元的評估開發板——ICETEK DM642 PCI。在ICETEK DM642 PCI評估板中將硬體平台分為五個部分,分別是視頻採集、數據存儲、圖像處理、結果顯示和電源管理。視頻採集部分採用模擬PAL制攝像頭,配合高精度視頻A/D轉換器得到數字圖像。基於DSP的視頻採集要求對視頻信號具備採集,實時顯示、對圖像的處理和分析能力。視頻A/D采樣電路—SAA7115與視頻埠0或1相連,實現視頻的實時採集功能。視頻D/A電路—SAA7105與視頻口2相連,視頻輸出信號支持RGB、HD合成視頻、PAL/NTSC復合視頻和S端子視頻信號。通過I2C匯流排對SAA7105的內部寄存器編程實現不同輸出。
整個系統過程由三個部分組成:圖像採集—邊緣處理—輸出顯示,如圖2所示。攝像頭採集的視頻信號經視頻編碼器SAA7115數字化,DM642通過I2C匯流排對SAA7115進行參數配置。在SAA7115內部進行一系列的處理和變換後形成的數字視頻數據流,輸入到核心處理單元DM642。經過DSP處理後的數字視頻再經過SAA7105視頻編碼器進行D/A轉換後在顯示器上顯示最終處理結果。
3.2 圖像處理的軟體設計和演算法優化的實現
由於在改進Sobel邊緣檢測運算元性能的同時,也相對增加了計算量,尤其是方向模板的增加,每個像素點均由原來的2次卷積運算增加為8次卷積運算,其實時性大大減弱。為了改進上述的不足,在深入研究處理系統和演算法後,針對TMS320DM642的硬體結構特點,研究適合在TMS320DM642中高效運行的Sobel改進演算法,滿足實時處理的要求。整個程序的編寫和調試按照C6000軟體開發流程進行,流程分為:產生C代碼、優化C代碼和編寫線性匯編程序3個階段。使用的工具是TI的集成開發環境CCS。在CCS下,可對軟體進行編輯、編譯、調試、代碼性能測試等工作。在使用C6000編譯器開發和優化C代碼時[7-8],對C代碼中低效率和需要反復調用的函數需用線性匯編重新編寫,再用匯編優化器優化。整個系統的控制以及數字圖像處理是用C程序實現,大部分軟體設計採用C程序實現,這無疑提高了程序的可讀性和可移植性,而匯編程序主要是實現DM642的各部分初始化。其邊緣檢測優化演算法在DM642中的實現步驟具體如下:
S1:根據DM642的硬體結構要求和控制寄存器設置,初始化系統並編寫實現邊緣檢測演算法的C程序。
S2:藉助CCS開發環境的優化工具如Profiler等產生.OUT文件。
S3:根據產生的附件文件如.MAP文件,分析優化結果及源程序結構,進一步改進源程序和優化方法。
S4:使用CCS中調試、鏈接、運行等工具,再生成.OUT可執行文件。
S5:運行程序,如果滿足要求則停止;否則重復步驟S2~S4直至滿足使用要求。
4 實驗結果
本文以Lena圖像為例根據上述的硬體環境和演算法實現的原理和方法,圖4~圖6分別給出了在該系統下採集的視頻Lena圖像及使用邊緣檢測運算元和改進後處理的結果。由實驗結果可以看出,在該系統下能實時完成視頻圖像的處理,並且給出的邊緣檢測運算元能較好的消除雜訊的影響,邊緣輪廓清晰。該演算法不僅能抑制圖像中大部分雜訊和虛假邊緣,還保證了較高的邊緣點位精度。
圖4 Lena原始圖像 圖5 傳統Sobel運算元 圖6 改進Sobel運算元
5 總結
本文實現了在TMS320DM642評估板上用改進的Sobel運算元對實時圖像進行邊緣檢測,無延遲地得到邊緣圖像。邊緣檢測效果較好,既提高了圖像檢測的精度又滿足了實時性的要求。從檢測結果看,利用該改進後的運算元在邊緣精確定位、邊緣提取都達到了很好的效果,且抗雜訊能力強,並為目標跟蹤、無接觸式檢測、自動駕駛、視頻監控等領域的應用提供了堅實的基礎。
參考文獻
[1] 王磊等. 基於Sobel理論的邊緣提取改善方法[J].中國圖像圖形學報,2005.10
[2] 陳宏席. 基於保持平滑濾波的Sobel運算元邊緣檢測.蘭州交通大學學報,2006,25(1):86—90
[3] 熊偉. 基於TMS320DM642的多路視頻採集處理板卡硬體設計與實現[ M]. 國外電子元器件,2006
[4] 朱立.一種具有抗雜訊干擾的圖像邊緣提取演算法的研究[J].電子技術應用.2004,25(1)
[5] 劉松濤,周曉東.基於TMS320C6201的實時圖像處理系統[J].計算機工程,2005(7):17—23
[6] TI TMS320DM642 video/imaging fixed-point digital signal processor data manual,2003
[7] TMS320C6x Optimizing C Compiler User』s Guide』 TEXAS INSTRUMENTS」,2002
[8] TMS320C32x Optimizing C/C++ Compiler User's Guide,Texas Instruments Incorporated,2001
Ⅲ 邊緣檢測是什麼意思
兩個具有不同灰度值的相鄰區域之間總存在邊緣,邊緣是灰度值不連續的表現。由於邊緣是圖像上灰度變化最劇烈的地方,傳統的邊緣檢測就是利用了這個特點,對圖像各個像素點進行微分或求二階微分來確定邊緣像素點。
以下是一段函數是關於邊緣檢測的一些演算法,希望對你有幫助。。
I=imread('D:\10.jpg'); %讀取圖像
I1=im2double(I); %將彩圖序列變成雙精度
I2=rgb2gray(I1); %將彩色圖變成灰色圖
[thr, sorh, keepapp]=ddencmp('den','wv',I2);
I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪
I4=medfilt2(I3,[9 9]); %中值濾波
I5=imresize(I4,0.8,'bicubic'); %圖像大小
BW1=edge(I5,'sobel'); %sobel 圖像邊緣提取
BW2=edge(I5,'roberts'); %roberts 圖像邊緣提取
BW3=edge(I5,'prewitt'); %prewitt 圖像邊緣提取
BW4=edge(I5,'log'); %log 圖像邊緣提取
BW5=edge(I5,'canny'); %canny 圖像邊緣提取
h=fspecial('gaussian',5); %高斯濾波
BW6=edge(I5,'zerocross',[ ],h); %zerocross 圖像邊緣提取
figure;
subplot(1,3,1); %圖劃分為一行三幅圖,第一幅圖
imshow(I2); %繪圖
title(' 原始圖像'); %標注
subplot(1,3,2); %第二幅圖
imshow(I3);
title(' 消噪後圖像');
subplot(1,3,3); %第三幅圖
imshow(I4);
title(' 中值濾波圖像');
figure;
subplot(1,3,1);
imshow(BW1);
title('Sobel 運算元');
subplot(1,3,2);
imshow(BW2);
title('Roberts 運算元');
subplot(1,3,3);
imshow(BW3);
title('Prewitt 運算元');
figure;
subplot(1,3,1);
imshow(BW4);
title('log 運算元');
subplot(1,3,2);
imshow(BW5);
title('Canny 運算元');
subplot(1,3,3);
imshow(BW6);
title('Zerocross');
Ⅳ 基於matlab的邊緣檢測的robert運算元的演算法怎麼寫
matlab本身有庫函數的。直接調用啊
VC代碼:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原圖數據區指針
int wide,height; //原圖長、寬
int i,j; //循環變數
int pixel[4]; //Robert運算元
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新圖像緩沖區
//設定新圖像初值為255
memset(temp,255, wide*height);
//由於使用2*2的模板,為防止越界,所以不處理最下邊和最右邊的兩列像素
for(j=0;j<height-1;j++)
for(i=0;i<wide-1;i++)
{
//生成Robert運算元
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//處理當前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//將緩沖區中的數據復制到原圖數據區
memcpy(p_data, temp,wide*height);
//刪除緩沖區
delete temp;
}
Ⅳ 需要一段用Canny運算元實現圖像邊緣檢測的MATLAB程序,拜託高手們幫幫忙,很急啊!
M=imread('');%讀入你的圖片
BW = edge(I,'canny');%邊緣檢測函數
imshow(BW) %顯示檢測後的圖象
Ⅵ 如何利用opencv實現彩色圖像邊緣檢測演算法
在opencv中顯示邊緣檢測很簡單,只需調用一個cvCanny函數,其使用的是Canny演算法來實現對圖像的邊緣檢測.
函數原型為:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
第一個參數為待檢測的圖像,注意一點,其必須是灰度圖.
第二個參數為輸出的邊緣圖,其也是一個灰度圖.
後三個參數與Canny演算法直接相關,threshold1和threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割,aperture_size運算元內核大小,可以去看看Canny演算法.
從彩色圖到灰度圖需要使用到cvCvtColor函數,其接受三個參數,第一為輸入,第二為輸出,第三個為轉換的標識,我們這邊是RGB到GRAY,使用的是CV_RGB2GRAY.
參考demo代碼如下:
#include <iostream>
#include <string>
#include <sstream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
using namespace std;
int String2int(const string& str_)
{
int _nre = 0;
stringstream _ss;
_ss << str_;
_ss >> _nre;
return _nre;
}
void DoCanny(const string& strFileName_)
{
//原彩色圖片
IplImage* _pIplImageIn = cvLoadImage(strFileName_.data());
if (_pIplImageIn == NULL)
{
return;
}
//彩色圖片轉換成灰度圖放置的圖片
IplImage* _pIplImageCanny = cvCreateImage(cvGetSize(_pIplImageIn), _pIplImageIn->depth, 1);
cvCvtColor(_pIplImageIn, _pIplImageCanny, CV_RGB2GRAY);//CV_RGB2GRAY將rgb圖轉成灰度圖
//只有邊緣路徑的圖片
IplImage* _pIplImageOut = cvCreateImage(cvGetSize(_pIplImageIn), IPL_DEPTH_8U, 1);
//邊緣檢測只能作用於灰度圖
if (_pIplImageCanny->nChannels != 1)
{
return;
}
//邊緣檢測操作
cvCanny(_pIplImageCanny, _pIplImageOut, 1, 110, 3);
cvNamedWindow("Src");
cvShowImage("Src", _pIplImageIn);
cvNamedWindow("Canny");
cvShowImage("Canny", _pIplImageOut);
cvWaitKey(0);
cvReleaseImage(&_pIplImageIn);
cvReleaseImage(&_pIplImageCanny);
cvReleaseImage(&_pIplImageOut);
cvDestroyWindow("Src");
cvDestroyWindow("Canny");
}
int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "You should give the filename of picture!" << endl;
return -1;
}
DoCanny(argv[1]);
return 0;
}
Ⅶ 邊緣檢測的檢測邊緣
如果將邊緣認為是一定數量點亮度發生變化的地方,那麼邊緣檢測大體上就是計算這個亮度變化的導數。為簡化起見,我們可以先在一維空間分析邊緣檢測。在這個例子中,我們的數據是一行不同點亮度的數據。例如,在下面的1維數據中我們可以直觀地說在第4與第5個點之間有一個邊界:
除非場景中的物體非常簡單並且照明條件得到了很好的控制,否則確定一個用來判斷兩個相鄰點之間有多大的亮度變化才算是有邊界的閾值,並不是一件容易的事。實際上,這也是為什麼邊緣檢測不是一個微不足道問題的原因之一。
檢測方法
有許多用於邊緣檢測的方法, 他們大致可分為兩類:基於搜索和基於零交叉。
基於搜索的邊緣檢測方法首先計算邊緣強度, 通常用一階導數表示, 例如梯度模,然後,用計算估計邊緣的局部方向, 通常採用梯度的方向,並利用此方向找到局部梯度模的最大值。
基於零交叉的方法找到由圖像得到的二階導數的零交叉點來定位邊緣。 通常用拉普拉斯運算元或非線性微分方程的零交叉點。
濾波做為邊緣檢測的預處理通常是必要的,通常採用高斯濾波。
已發表的邊緣檢測方法應用計算邊界強度的度量,這與平滑濾波有本質的不同。 正如許多邊緣檢測方法依賴於圖像梯度的計算,他們用不同種類的濾波器來估計x-方向和y-方向的梯度。
計算一階導數
許多邊緣檢測操作都是基於亮度的一階導數——這樣就得到了原始數據亮度的梯度。使用這個信息我們能夠在圖像的亮度梯度中搜尋峰值。如果 I(x) 表示點 x 的亮度,I′(x) 表示點 x 的一階導數(亮度梯度),這樣我們就會發現:
對於更高性能的圖像處理來說,一階導數能夠通過帶有掩碼的原始數據(1維)卷積計算得到。
計算二階導數
其它一些邊緣檢測操作是基於亮度的二階導數。這實質上是亮度梯度的變化率。在理想的連續變化情況下,在二階導數中檢測過零點將得到梯度中的局部最大值。另一方面,二階導數中的峰值檢測是邊線檢測,只要圖像操作使用一個合適的尺度表示。如上所述,邊線是雙重邊緣,這樣我們就可以在邊線的一邊看到一個亮度梯度,而在另一邊看到相反的梯度。這樣如果圖像中有邊線出現的話我們就能在亮度梯度上看到非常大的變化。為了找到這些邊線,我們可以在圖像亮度的二階導數中尋找過零點。如果 I(x) 表示點 x 的亮度,I′′(x) 表示點 x 亮度的二階導數,那麼:
同樣許多演算法也使用卷積掩碼快速處理圖像數據:
步驟:
①濾波:邊緣檢測演算法主要是基於圖像強度的一階和二階導數,但導數的計算對雜訊很敏感,因此必須使用濾波器來改善與雜訊有關的邊緣檢測器的性能。需要指出,大多數濾波器在降低雜訊的同時也導致了邊緣強度的損失,因此,增強邊緣和降低雜訊之間需要折中。
②增強:增強邊緣的基礎是確定圖像各點鄰域強度的變化值。增強演算法可以將鄰域(或局部)強度值有顯著變化的點突顯出來。邊緣增強一般是通過計算梯度幅值來完成的。
③檢測:在圖像中有許多點的梯度幅值比較大,而這些點在特定的應用領域中並不都是邊緣,所以應該用某種方法來確定哪些點是邊緣點。最簡單的邊緣檢測判據是梯度幅值閾值判據。
④定位:如果某一應用場合要求確定邊緣位置,則邊緣的位置可在子像素解析度上來估計,邊緣的方位也可以被估計出來。在邊緣檢測演算法中,前三個步驟用得十分普遍。這是因為大多數場合下,僅僅需要邊緣檢測器指出邊緣出現在圖像某一像素點的附近,而沒有必要指出邊緣的精確位置或方向。
邊緣檢測的實質是採用某種演算法來提取出圖像中對象與背景間的交界線。我們將邊緣定義為圖像中灰度發生急劇變化的區域邊界。圖像灰度的變化情況可以用圖像灰度分布的梯度來反映,因此我們可以用局部圖像微分技術來獲得邊緣檢測運算元。經典的邊緣檢測方法,是通過對原始圖像中像素的某小鄰域構造邊緣檢測運算元來達到檢測邊緣這一目的的。
Ⅷ 基於微分方法的邊緣檢測演算法的依據是什麼
一般來說不同區域的交界處構成邊緣,同一區域內像素的灰度差較小,而不同區域像素灰度差較大,因此用微分可以很好地檢測滿足這種假設的區域邊界
Ⅸ canny邊緣檢測演算法 濾波用什麼方法好
Canny 的目標是找到一個最優的邊緣檢測演算法,最優邊緣檢測的含義是:
(1)最優檢測:演算法能夠盡可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都盡可能小;
(2)最優定位準則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由於雜訊影響引起檢測出的邊緣偏離物體的真實邊緣的程度最小;
(3)檢測點與邊緣點一一對應:運算元檢測的邊緣點與實際邊緣點應該是一一對應。
為了滿足這些要求 Canny 使用了變分法,這是一種尋找滿足特定功能的函數的方法。最優檢測使用四個指數函數項表示,但是它非常近似於高斯函數的一階導數。