導航:首頁 > 源碼編譯 > 邊緣檢測計演算法

邊緣檢測計演算法

發布時間:2022-10-06 02:18:11

❶ Matlab邊緣檢測問題

用mesh語句似乎可以,具體也不了解你的情況,感覺怪怪的,發一段我以前些的程序,用羅伯特運算元寫的,把運算元一改就是sobel了。兩種邊緣檢測近似演算法奉上:
clc
close all
clear all
%%%生成高斯平滑濾波模板%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
hg=zeros(3,3); %設定高斯平滑濾波模板的大小為3*3
delta=0.5;
for x=1:1:3
for y=1:1:3
u=x-2;
v=y-2;
hg(x,y)=exp(-(u^2+v^2)/(2*pi*delta^2));
end
end
h=hg/sum(hg(:));
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%讀入圖像%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%

f = imread('1111.tif'); % 讀入圖像文件
f=rgb2gray(im2double(f));
imshow(f)
title('原始圖像');
[m,n]=size(f);
ftemp=zeros(m,n);
rowhigh=m-1;
colhigh=n-1;
%%%高斯濾波%%%
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
A=h.*mod;
ftemp(x,y)=sum(A(:));
end
end
f=ftemp
figure,imshow(f)
title('通過高斯濾波器後的圖像');

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%利用roberts運算元進行邊緣檢測%%%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);
end
end
fr=im2uint8(ftemp);
figure,imshow(fr)
title('用roberts運算元邊緣檢測的原始圖像');

%%%域值分割%%%
TH1=60; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fr(x,y)>=TH1)&((fr(x,y-1) <= fr(x,y)) & (fr(x,y) > fr(x,y+1)) )
fr(x,y)=200;
elseif(fr(x,y)>=TH1)&( (fr(x-1,y) <=fr(x,y)) & (fr(x,y) >fr(x+1,y)))
fr(x,y)=200;
else fr(x,y)=50;
end
end
end
figure,imshow(fr)
title('用roberts運算元邊緣檢測並細化後的圖像');
%%%%%%%%%%%%%%%%%%%%%%%%%%
利用第一種近似演算法進行邊緣檢測%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=abs(sum(fsx(:)))+abs(sum(fsy(:)));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第一種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第一種近似演算法進行邊緣檢測後的圖像');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%利用第二種近似演算法進行邊緣檢測%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=max(abs(sum(fsx(:))),abs(sum(fsy(:))));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第二種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第二種近似演算法進行邊緣檢測後的圖像');

❷ sobel邊緣檢測優缺點與canny運算元的優缺點

一、sobel邊緣檢測:

1、sobel邊緣檢測優點:輸出圖像(數組)的元素通常具有更大的絕對數值。

2、sobel邊緣檢測缺點:由於邊緣是位置的標志,對灰度的變化不敏感。

二、canny運算元:

1、canny運算元優點:法能夠盡可能多地標識出圖像中的實際邊緣;標識出的邊緣要與實際圖像中的實際邊緣盡可能接近。

2、canny運算元缺點:圖像中的邊緣只能標識一次,並且可能存在的圖像雜訊不應標識為邊緣。

(2)邊緣檢測計演算法擴展閱讀:

Sobel邊緣檢測的核心在於像素矩陣的卷積,卷積對於數字圖像處理非常重要,很多圖像處理演算法都是做卷積來實現的。

卷積運算的本質就是對制定的圖像區域的像素值進行加權求和的過程,其計算過程為圖像區域中的每個像素值分別與卷積模板的每個元素對應相乘,將卷積的結果作求和運算,運算到的和就是卷積運算的結果。

❸ 如何計算邊緣檢測運算元的邊緣像素、邊緣段以及連續性指標如下圖

close all
clear all
I=imread('tig.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.2,'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); %繪圖
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運算元');
在讀圖片的時候自己改下片名。

❹ 邊緣檢測的閾值確定

一旦我們計算出導數之後,下一步要做的就是給出一個閾值來確定哪裡是邊緣位置。閾值越低,能夠檢測出的邊線越多,結果也就越容易受到圖片雜訊的影響,並且越容易從圖像中挑出不相關的特性。與此相反,一個高的閾值將會遺失細的或者短的線段。一個常用的這種方法是帶有滯後作用的閾值選擇。這個方法使用不同的閾值去尋找邊緣。首先使用一個閾值上限去尋找邊線開始的地方。一旦找到了一個開始點,我們在圖像上逐點跟蹤邊緣路徑,當大於門檻下限時一直紀錄邊緣位置,直到數值小於下限之後才停止紀錄。這種方法假設邊緣是連續的界線,並且我們能夠跟蹤前面所看到的邊緣的模糊部分,而不會將圖像中的雜訊點標記為邊緣。

❺ 基於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;
}

❻ 邊緣檢測運算元中抗噪性能最好的是

邊緣檢測演算法是一個傳統的CV問題,傳統的CV方法有canny演算法。引入機器學習,深度學習的方法後,又有了structure forests,以及HED演算法。

canny 運算元

canny演算法是一種multi-stage 的演算法,其處理圖片的過程分為如下五個步驟:

1. Noise Rection

圖片中的高頻信息指顏色快速變化,低頻信息指顏色平緩的變化。邊緣檢測過程中需要檢測的圖片邊緣屬於高頻信息。而圖片中雜訊部分也屬於高頻信息,因此我們需要對圖像進行去噪處理。常用的是使用5*5的高斯濾波核來平滑圖像,濾波核的數量呈高斯分布。

2. Finding Intensity Gradient of the Image

計算像素梯度的幅值以及方向,常用的運算元有Rober,sobel,計算水平及垂直方向的差分。找出梯度較大的區域,這部分區域屬於圖像增強的區域,此時得到的邊緣信息比較粗大。

3.Non-Maximun Suppression

非極大值抑制屬於一種邊緣細化的方法,梯度大的位置有可能為邊緣,在這些位置沿著梯度方向,找到像素點的局部最大值,並將非最大值抑制。

4.Double Threhold

雙閥值方法,設置一個maxval,以及minval,梯度大於maxval則為強邊緣,梯度值介於maxval與minval則為弱邊緣點,小於minval為抑制點。

5.Edge tracking by hysteresis

滯後邊緣追蹤,主要處理梯度值位於maxval,minval中的一些像素點。由於邊緣是連續的,因此可以認為弱邊緣如果為真實邊緣則和強邊緣是聯通的,可由此判斷其是否為真實邊緣。

❼ 邊緣檢測運算元有哪些它們各有什麼優缺點

邊緣檢測運算元一階的有Roberts Cross運算元,Prewitt運算元,Sobel運算元,Canny運算元, Krisch運算元,羅盤運算元;而二階的還有Marr-Hildreth,在梯度方向的二階導數過零點。

Roberts運算元
一種利用局部差分運算元尋找邊緣的運算元,分別為4領域的坐標,且是具有整數像素坐標的輸人圖像;其中的平方根運算使得該處理類似於人類視覺系統中發生的過程。

Sobel運算元
一種一階微分運算元,它利用像素鄰近區域的梯度值來計算1個像素的梯度,然後根據一定的絕對值來取捨。

Prewitt運算元
Prewitt運算元是3*3運算元模板。2個卷積核dx ,不要形成了Prewitt運算元。與Sobel運算元的方法一樣,圖像中的每個點都用這2個核進行卷積,取最大值作為輸出值。

各個運算元的優缺點:

Robert運算元定位比較精確,但由於不包括平滑,所以對於雜訊比較敏感。
Prewitt運算元和Sobel運算元都是一階的微分運算元,而前者是平均濾波,後者是加權平均濾波且檢測的圖像邊緣可能大於2個像素。這兩者對灰度漸變低雜訊的圖像有較好的檢測效果,但是對於混合多復雜雜訊的圖像,處理效果就不理想了。
LOG濾波器方法通過檢測二階導數過零點來判斷邊緣點。LOG濾波器中的a正比於低通濾波器的寬度,a越大,平滑作用越顯著,去除雜訊越好,但圖像的細節也損失越大,邊緣精度也就越低。所以在邊緣定位精度和消除雜訊級間存在著矛盾,應該根據具體問題對雜訊水平和邊緣點定位精度要求適當選取。

❽ 邊緣檢測的邊緣檢測運算元

一階::Roberts Cross運算元,Prewitt運算元,Sobel運算元, Kirsch運算元,羅盤運算元;
二階: Marr-Hildreth,在梯度方向的二階導數過零點,Canny運算元,Laplacian運算元。
Canny運算元(或者這個運算元的變體)是最常用的邊緣檢測方法。 在 Canny 創造性的工作中,他研究了設計一個用於邊緣檢測最優預平滑濾波器中的問題,後來他說明這個濾波器能夠很好地被一階高斯導數核優化。另外 Canny 引入了非最大抑制概念,它是說邊緣定義為在梯度方向具有最大梯度值的點。
在一個離散矩陣中,非最大抑制階梯能夠通過一種方法來實現,首先預測一階導數方向、然後把它近似到45度的倍數、最後在預測的梯度方向比較梯度幅度。
一個獲得亞點精度邊緣的改進實現是通過檢測梯度方向上二階方向梯度的過零點來實現的:
它在梯度方向的三階方向梯度滿足符號條件
其中 Lx, Ly ... Lyyy 表示從使用高斯核平滑原始圖像得到的尺度空間表示 L 計算出的偏微分。
按照這種方法,能夠自動得到亞點精度的連續曲線邊緣。滯後門檻也可以用在這些差分邊緣片斷。
羅盤運算元是斯坦福大學的Ruzon在1999年提出的一個新的運算元,據實驗以及報道,性能超過Canny運算元。

❾ 邊緣檢測的檢測邊緣

如果將邊緣認為是一定數量點亮度發生變化的地方,那麼邊緣檢測大體上就是計算這個亮度變化的導數。為簡化起見,我們可以先在一維空間分析邊緣檢測。在這個例子中,我們的數據是一行不同點亮度的數據。例如,在下面的1維數據中我們可以直觀地說在第4與第5個點之間有一個邊界:
除非場景中的物體非常簡單並且照明條件得到了很好的控制,否則確定一個用來判斷兩個相鄰點之間有多大的亮度變化才算是有邊界的閾值,並不是一件容易的事。實際上,這也是為什麼邊緣檢測不是一個微不足道問題的原因之一。
檢測方法
有許多用於邊緣檢測的方法, 他們大致可分為兩類:基於搜索和基於零交叉。
基於搜索的邊緣檢測方法首先計算邊緣強度, 通常用一階導數表示, 例如梯度模,然後,用計算估計邊緣的局部方向, 通常採用梯度的方向,並利用此方向找到局部梯度模的最大值。
基於零交叉的方法找到由圖像得到的二階導數的零交叉點來定位邊緣。 通常用拉普拉斯運算元或非線性微分方程的零交叉點。
濾波做為邊緣檢測的預處理通常是必要的,通常採用高斯濾波。
已發表的邊緣檢測方法應用計算邊界強度的度量,這與平滑濾波有本質的不同。 正如許多邊緣檢測方法依賴於圖像梯度的計算,他們用不同種類的濾波器來估計x-方向和y-方向的梯度。
計算一階導數
許多邊緣檢測操作都是基於亮度的一階導數——這樣就得到了原始數據亮度的梯度。使用這個信息我們能夠在圖像的亮度梯度中搜尋峰值。如果 I(x) 表示點 x 的亮度,I′(x) 表示點 x 的一階導數(亮度梯度),這樣我們就會發現:
對於更高性能的圖像處理來說,一階導數能夠通過帶有掩碼的原始數據(1維)卷積計算得到。

計算二階導數
其它一些邊緣檢測操作是基於亮度的二階導數。這實質上是亮度梯度的變化率。在理想的連續變化情況下,在二階導數中檢測過零點將得到梯度中的局部最大值。另一方面,二階導數中的峰值檢測是邊線檢測,只要圖像操作使用一個合適的尺度表示。如上所述,邊線是雙重邊緣,這樣我們就可以在邊線的一邊看到一個亮度梯度,而在另一邊看到相反的梯度。這樣如果圖像中有邊線出現的話我們就能在亮度梯度上看到非常大的變化。為了找到這些邊線,我們可以在圖像亮度的二階導數中尋找過零點。如果 I(x) 表示點 x 的亮度,I′′(x) 表示點 x 亮度的二階導數,那麼:
同樣許多演算法也使用卷積掩碼快速處理圖像數據:

步驟:
①濾波:邊緣檢測演算法主要是基於圖像強度的一階和二階導數,但導數的計算對雜訊很敏感,因此必須使用濾波器來改善與雜訊有關的邊緣檢測器的性能。需要指出,大多數濾波器在降低雜訊的同時也導致了邊緣強度的損失,因此,增強邊緣和降低雜訊之間需要折中。
②增強:增強邊緣的基礎是確定圖像各點鄰域強度的變化值。增強演算法可以將鄰域(或局部)強度值有顯著變化的點突顯出來。邊緣增強一般是通過計算梯度幅值來完成的。
③檢測:在圖像中有許多點的梯度幅值比較大,而這些點在特定的應用領域中並不都是邊緣,所以應該用某種方法來確定哪些點是邊緣點。最簡單的邊緣檢測判據是梯度幅值閾值判據。
④定位:如果某一應用場合要求確定邊緣位置,則邊緣的位置可在子像素解析度上來估計,邊緣的方位也可以被估計出來。在邊緣檢測演算法中,前三個步驟用得十分普遍。這是因為大多數場合下,僅僅需要邊緣檢測器指出邊緣出現在圖像某一像素點的附近,而沒有必要指出邊緣的精確位置或方向。
邊緣檢測的實質是採用某種演算法來提取出圖像中對象與背景間的交界線。我們將邊緣定義為圖像中灰度發生急劇變化的區域邊界。圖像灰度的變化情況可以用圖像灰度分布的梯度來反映,因此我們可以用局部圖像微分技術來獲得邊緣檢測運算元。經典的邊緣檢測方法,是通過對原始圖像中像素的某小鄰域構造邊緣檢測運算元來達到檢測邊緣這一目的的。

❿ Canny邊緣檢測器的工作原理

Canny邊緣檢測器是使用函數edge的最有效邊緣檢測器。該方法總結如下:1、圖像使用帶有指定標准偏差σ的高斯濾波器來平滑,從而可以減少雜訊。2、在每一點處計算局部梯度g(x,y)=[G2x+G2y]1/2 和邊緣方向α(x,y)=arctan(Gy/Gx)。邊緣點定義為梯度方向上其強度局部最大的點。3、第2條中確定的邊緣點會導致梯度幅度圖像中出現脊。然後,演算法追蹤所有脊的頂部,並將所有不在脊的頂部的像素設為零,以便在輸出中給出一條細線,這就是眾所周知的非最大值抑制處理。脊像素使用兩個閾值T1和T2做閾值處理,其中T1<T2。值大於T2的脊像素稱為強邊緣像素,T1和T2之間的脊像素稱為弱邊緣像素。4、最後,演算法通過將8連接的弱像素集成到強像素,執行邊緣鏈接。

閱讀全文

與邊緣檢測計演算法相關的資料

熱點內容
程序員用得到數字區嗎 瀏覽:172
python求商 瀏覽:475
ipad能用c語言編譯器嗎 瀏覽:559
軟泥解壓球最新版 瀏覽:996
4萬程序員辭職創業 瀏覽:757
thinkingphp 瀏覽:595
安卓相冊移動文件夾 瀏覽:4
耳朵清潔解壓聲控99的人都睡得著 瀏覽:203
叉車出租網站源碼 瀏覽:872
共享單車的app是什麼 瀏覽:406
不帶gui的伺服器什麼意思 瀏覽:371
金剛經及PDF 瀏覽:100
php中冒號 瀏覽:356
php5432 瀏覽:350
命令在哪使用 瀏覽:170
php獲取網頁元素 瀏覽:706
為什麼需要硬體驅動編譯 瀏覽:883
pm編程怎樣看導柱孔對不對稱 瀏覽:136
農業大學選課找不到伺服器怎麼辦 瀏覽:649
路由配置網關命令 瀏覽:933