1. 程式人生 > >基於matlab邊緣提取的幾種方法的比較

基於matlab邊緣提取的幾種方法的比較

1、Matlab簡述

Matlab是國際上最流行的科學與工程計算的軟體工具,它起源於矩陣運算,已經發展成一種高度整合的計算機語言。有人稱它為“第四代”計算機語言,它提供了強大的科學運算、靈活的程式設計流程、高質量的圖形視覺化介面設計、便捷的與其它程式和語言介面的功能。隨著Matlab語言功能越來越強大,不斷適應新的要求並提出新的解決方法,可以預見,在科學運算,自動控制與科學繪圖領域,Matlab語言將長期保持其獨一無二的地位。

2、幾種常用的邊緣檢測運算元

邊緣是影象的最重要的特徵,。邊緣是指周圍畫素灰度有階躍變化或屋頂變化的那些畫素的集合。邊緣檢測主要是灰度變化的度量、檢測和定位。有很多種不同的邊緣檢測方法,同一種方法使用的濾波器也不盡相同。影象邊緣檢測就是研究更好的邊緣檢測方法和檢測運算元。

邊緣檢測的基本思想首先是(1)利用邊緣增強運算元,突出影象中的區域性邊緣,(2)然後定義象素的“邊緣強度”,通過設定閾值的方法提取邊緣點集。由於噪聲和模糊的存在,監測到的邊界可能會變寬或在某點處發生間斷。因此,邊界檢測包括兩個基本內容:

i.         用邊緣運算元提取出反映灰度變化的邊緣點集

ii.        在邊緣點集合中剔除某些邊界點或填補邊界間斷點,並將這些邊緣連線成完整的線

常用的檢測運算元有微分運算元、拉普拉斯高斯運算元和canny運算元。

在Matlab影象處理工具箱中,提供了edge函式利用以上運算元來檢測灰度影象的邊緣。

2.1微分運算元法

   經典的邊緣提取方法是考察影象的每個畫素的某個鄰域內灰度的變化,利用邊緣鄰近一階或二階方向導數變化規律,用簡單的方法檢測邊緣,稱為微分運算元法

導數運算元具有突出灰度變化的作用,對影象運用導數運算元,灰度變化較大的點處算得的值較高,因此我們將影象的導數運算元運算值作為相應的邊界強度,所以可以通過對這些導數值設定閾值,提取邊界的點集。

一階導數是最簡單的導數運算元。已知在點f(x,y)處,梯度grad(F(x,y))的幅度為:



它們分別求出了灰度在x和y方向上的變化率,但是要對每一個畫素進行以上的運算,運算量較大,所以在實際應用中常用小區域模板卷積運算來進行近似計算。模板運算的想法是將賦予某一個畫素的值作為它本身灰度值和相鄰象素灰度值的函式。運用中,對x,y方向各用一個模板。

2.1.1 Sobel運算元

Sobel運算元是濾波運算元的形式來提取邊緣。X,Y方向各用一個模板,兩個模板組合起來構成1個梯度運算元。X方向模板對垂直邊緣影響最大,Y方向模板對水平邊緣影響最大。


圖1 Sobel運算元模板

2.1.2 robert運算元

   Robert運算元是一種梯度運算元,它用交叉的差分表示梯度,是一種利用區域性差分運算元尋找邊緣的運算元,對具有陡峭的低噪聲的影象效果最好:

模板如圖:

                  

圖2 Robert運算元模板


2.1.3 prewitt運算元 

   prewitt運算元是加權平均運算元,對噪聲有抑制作用,但是畫素平均相當於對影象進行地同濾波,所以prewitt運算元對邊緣的定位不如robert運算元。模板如圖;

     

圖3 prewitt運算元模板

程式碼如下:

原始影象為三位編織複合材料二維截面圖,對原始影象進行前期處理

i=imread('d1.jpg');

i2=im2double(i);

ihd=rgb2gray(i2);

[thr,sorh,keepapp]=ddencmp('den','wv',ihd);

ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);

figure,imshow(ixc),title('消噪後圖像 ');

k2=medfilt2(ixc,[7 7]);

figure,imshow(k2),title('中值濾波');

isuo=imresize(k2,0.25,'bicubic');

%sobert、robert和prewitt運算元檢測影象邊緣

esobel=edge(isuo,'sobel');

erob=edge(isuo,'roberts');

eprew=edge(isuo,'prewitt');

subplot(2,2,1);

imshow(isuo);title('前期處理影象');

subplot(2,2,2);

imshow(esobel);title('sobel運算元提取');

subplot(2,2,3);

imshow(erob);title('roberts運算元提取');

subplot(2,2,4);

imshow(eprew);title('prewitt運算元提取');


 圖4 微分運算元邊緣檢測結果

2.2 Laplacian運算元
   拉普拉斯高斯運算元是一種二階導數運算元,將在邊緣處產生一個陡峭的零交叉。前面介紹的幾種梯度法具有方向性,不能對各種走向的邊緣都具有相同的增強效果。但是Laplacian運算元是各向同性的,能對任何走向的界線和線條進行銳化,無方向性。這是拉普拉斯運算元區別於其他演算法的最大優點。

對一個連續函式,它在位置的拉普拉斯運算元定義如下:


在影象邊緣檢測中,為了運算方便,函式的拉普拉斯高斯運算元也是藉助模板來實現的。其模板有一個基本要求:模板中心的係數為正,其餘相鄰係數為負,所有係數的和應該為零。


      5 Laplacian運算元模板

2.3  Canny邊緣檢測法

     Canny邊緣檢測是一種比較新的邊緣檢測運算元,具有很好的邊緣監測效能,在影象處理中得到了越來越廣泛的應用。它依據影象邊緣檢測最優準則設計canny邊緣檢測演算法:

(1)       首先用2D高斯濾波模板進行卷積以消除噪聲

(2)       利用導數運算元找到影象灰度地沿著兩個方向的偏導數,並求出梯度的大小:  

(3)       利用(2)的結果計算出梯度的方向

(4)       一旦知道了邊緣的方向,就可以把邊緣的梯度方向大致分為四種:水平、豎直、45度方向、135度方向。通過梯度的方向,就可以找到這個畫素梯度方向的鄰接畫素。

(5)       遍歷影象,若某個畫素的灰度值與其梯度方向上前後兩個畫素的灰度值相比不是最大的,那麼這個畫素值置為0,即不是邊緣。

(6)       使用累計直方圖計算兩個閾值,大於高閾值的一定是邊緣,小於低閾值的一定不是邊緣,介於之間的,看這個畫素的鄰接畫素中有沒有超過高閾值的邊緣畫素,如果有的話那麼它

就是邊緣了,否則它就不是邊緣。

呼叫Laplacian運算元、canny運算元檢測法檢測影象邊緣的程式如下:

elog=edge(isuo,'log');

ecanny=edge(isuo,'canny');

subplot(1,2,1);

imshow(elog);title('log運算元提取');

subplot(1,2,2);

imshow(ecanny);title('canny運算元提取');

圖6 canny運算元、Laplacian運算元檢測結果

3.邊緣檢測結果比較

Roberts運算元檢測方法對具有陡峭的低噪聲的影象處理效果較好,但是利用roberts運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。

Sobel運算元檢測方法對灰度漸變和噪聲較多的影象處理效果較好,sobel運算元對邊緣定位不是很準確,影象的邊緣不止一個畫素。

Prewitt運算元檢測方法對灰度漸變和噪聲較多的影象處理效果較好。但邊緣較寬,而且間斷點多。

Laplacian運算元法對噪聲比較敏感,所以很少用該運算元檢測邊緣,而是用來判斷邊緣畫素視為與影象的明區還是暗區。

Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優點在於,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,並且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出影象中。

參考文獻

[1] 趙春暉.現代影象處理技術及Matlab實現[M].北京:人民郵電出版社,2001.

[2] 阮秋琦.數字影象處理學[M].北京:電子工業出版社,2001.

[3] 何斌.數字影象處理[M].北京:人民郵電出版社,2001

I=imread('lena.bmp');%  提取影象

BW1=edge(I,'sobel'); %SOBEL運算元進行邊緣檢測

BW2=edge(I,'roberts');%Roberts運算元進行邊緣檢測

BW3=edge(I,'prewitt'); %prewitt運算元進行邊緣檢測

BW4=edge(I,'log'); %log運算元進行邊緣檢測

BW5=edge(I,'canny'); %canny運算元進行邊緣檢測

h=fspecial('gaussian’,5);

BW6=edge(I,’canny’);

subplot(2,3,1), imshow(BW1);

title(‘sobel edge check’);

subplot(2,3,2), imshow(BW2);

title(‘sobel edge check’);

subplot(2,3,3), imshow(BW3);

title(‘prewitt edge check’);

subplot(2,3,4), imshow(BW4);

title(‘log edge check’);

subplot(2,3,5), imshow(BW5);

title(‘canny edge check’);

subplot(2,3,6), imshow(BW6);

title(‘gasussian&canny edge check’);%此為用高斯濾波後Canny運算元邊緣檢測結果

(注意:程式碼中有一些標點是中文模式,若輸入程式碼後標點顯示紅色,則為中文標點,改回來就行了)




相關推薦

基於matlab邊緣提取方法比較

1、Matlab簡述 Matlab是國際上最流行的科學與工程計算的軟體工具,它起源於矩陣運算,已經發展成一種高度整合的計算機語言。有人稱它為“第四代”計算機語言,它提供了強大的科學運算、靈活的程式設計流程、高質量的圖形視覺化介面設計、便捷的與其它程式和語言介面的功能。隨著M

MySQL根據生日計算年齡的方法比較

方法一SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age 方法一,作者也說出了缺陷,就是當日期為未來日期時結果為0,而不是負數;這裡使用了5個函式和兩個運算子。方法二SELECT DATE_FORMAT(

陣列比較大小的方法及math是方法

  call  apply  bind 的區別?   解決函式內this的指向:     1.可以在函式外提前宣告變數 一般情況下我們用   var _this/that=this       2.通過apply和call來修改函式this指向     appl

Matlab中讀取txt檔案的方法

fidin=fopen('test.txt');                               % 開啟test2.txt檔案              fidout=fopen('mkmatlab.txt','w');                       % 建立MKMATLAB.tx

解決CSS垂直居中的方法基於絕對定位,基於視口單位,Flexbox方法

       在CSS中對元素進行水平居中是非常簡單的:如果它是一個行內元素,就對它的父元素應用 text-align: center ;如果它是一個塊級元素,就對它自身應用 margin: aut

java中求素數的方法彙總及比較

首先來看兩道題目: 1. 請實現一個函式,對於給定的整型引數 N,該函式能夠把自然數中,小於 N 的質數,從小到大打印出來。比如,當 N = 10,則打印出:2 3 5 7**重點內容** 2. 請

Java從控制檯讀取資料,輸入流System.in的方法效率比較

這是一道PTA上關於複雜度演算法的題目——最大子列和問題,程式簡單。 我分別用 1)構造Scanner物件:Scanner in = new Scanner(System.in); 2)構造BufferedReader物件:BufferedReader br = new B

【九天教您南方cass 9.1】 09 提取座標的方法

同學們大家好,歡迎收看由老王測量上班記出品的cass9.1視訊課程 我是本節課主講老師九天。 我們講課的教程附件也是共享的,請注意索取測量空間中。 【點選索取cass教程】5元立得 (給客服說暗號:“老王測量上班記”) 即可5元獲得教程全系列,不帶軟體安裝 這節課我們學習Cass9.1提取座標

Python合併兩個字典成一個新字典的方法分析比較

兩個字典如下:>>> d1 = {'name' : 'revotu', 'age' : 99} >>> d2 = {'age' : 24, 'sex' : 'male'} 合併後的結果如下(即,key相同時後面字典值覆蓋前面字典):>>> d {'sex'

JS:支援任意數量的分組checkbox全選功能(方法比較

用JQ寫的支援任意數量的分組checkbox全選功能的超短程式碼,特點有兩個,一是短,二是擴充套件容易,不需要改動JS,只需要複製一組之後按照命名規則改下編號.   (為書寫簡便,以下都省略了checkbox的value,實際應用中,這當然是必須的,請自行注意新增) <

Java遍歷List的方法及其效能比較

參考: StackOverflow 上有人給出了上面幾種遍歷方式。【yasi】個人覺得方法2,即 for (E element : list) 方式最優雅簡潔,其餘幾種方法不夠“現代化”。 StackOverflow 上指出,方法2在效能上和方法3(顯式地對迭代器

matlab讀取cvs檔案的方法

csvread()函式有三種使用方法: 1、M = csvread('filename') 2、M = csvread('filename', row, col) 3、M = csvread('filename', row, col, range) 第一種方法中,直接輸入檔名,將資料讀到矩陣M中。這裡

方法用來提取影象輪廓的例子

參考了許多部落格,自己整理了一下幾種方法用來提取影象輪廓的方法,記錄一下 #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> #include<openc

python獲取字母在字母表對應位置的方法及效能對比較

    某些情況下要求我們查出字母在字母表中的順序,A = 1,B = 2 , C = 3, 以此類推,比如這道題目 https://projecteuler.net/problem=42 其中一步解題步驟就是需要把字母換算成字母表中對應的順序。 獲取字母在字母表對應位置的

比較日期的大小的方法

總結了幾種比較日期大小的方法,但其實都是轉換成時間戳之後進行比較,然後做了二次封裝給我們使用。同學們可以直接點進去看原始碼。 package Chasen.utils; import java.te

利用matlab求影象均值和方差的方法

% 求一副灰度影象的均值 close all; clear; clc; i=imread('d:/lena.jpg'); %載入真彩色影象 i=rgb2gray(i); %轉換為灰度圖 i=double(i); %將uint8型轉換為double型,否則不能計算統計量 % avg1=mean(i,1);

Matlab中計算程式顯示執行時間的方法

tic和toc組合 tic %程式碼塊 toc %disp(['執行時間: ',num2str(toc)]); etime()與clock組合 t1=clock; %程式碼塊 t2=clock; etime(t2,t1) cputim

LaTeX中插入matlab程式碼(可新增中文註釋)的方法

最近在用LaTeX寫檔案時,需要插入matlab程式碼,但是matlab程式碼編寫時沒有注意到註釋為中文所帶來的不便,導致在編寫LaTeX檔案時總是報錯。經查閱網上有關這方面的資料和自己不斷地嘗試之後,總結其中的方法如下:使用matlab的mcode包和僅僅使用

檢視基於Android 系統單個程序記憶體和CPU使用情況的方法

Total PSS by OOM adjustment:     16839 kB: System                16839 kB: system (pid 791)      9279 kB: Persistent                 9279 kB: com.android.s

使用Matlab繪製三維圖的方法

以下六個函式都可以實現繪製三維影象: surf(xx,yy,zz); surfc(xx,yy,zz); mesh(xx,yy,zz); meshc(xx,yy,zz); meshz(xx,yy,zz