1. 程式人生 > >影象邊緣檢測與邊緣增強處理——(Roberts、prewitt、sobel)

影象邊緣檢測與邊緣增強處理——(Roberts、prewitt、sobel)

堅持寫下去,雖然簡單,但希望可以幫助到別人微笑,有不足之處還望指教吐舌頭

目的:對影象採用3種邊緣檢測運算元進行處理,比較處理後的結果,並用邊緣增強演算法對影象增強。

一、基本原理

1.1影象邊緣

   影象邊緣是影象最基本的特徵之一,往往攜帶著一幅影象的大部分資訊。而邊緣存在於影象的不規則結構和不平穩現象中,也即存在於訊號的突變點處,這些點給出了影象輪廓的位置,這些輪廓常常是我們在影象邊緣檢測時所需要的非常重要的一些特徵條件,這就需要我們對一幅影象檢測並提取出它的邊緣。而邊緣檢測演算法則是影象邊緣檢測問題中經典技術難題之一,它的解決對於我們進行高層次的特徵描述、識別和理解等有著重大的影響;又由於邊緣檢測在許多方面都有著非常重要的使用價值,所以人們一直在致力於研究和解決如何構造出具有良好性質及好的效果的邊緣檢測運算元的問題。

1.2邊緣檢測的定義

影象邊緣是影象最基本的特徵,邊緣在影象分析中起著重要的用。所謂邊緣是指影象區域性特徵的不連續性。灰度或結構資訊的突變稱為邊緣,例如:灰度級的突變、顏色的突變、紋理結的突變。邊緣是一個區域的結束,也是另一個區域的開始,利用該特徵可以分割影象。


    一條理想的邊緣應該具有如圖(a)所示模型的特性。每個畫素都處在灰度級躍變的一個垂直的臺階上(例如圖形中所示的水平線通過影象的灰度剖面圖)。而實際上,諸如影象採集系統的效能、取樣頻率和獲得影象的照明條件等因素的影響,得到的邊緣往往是模糊的,邊緣被模擬成具有“斜坡面”的剖面,如圖(b)所示,在這個模型中不再有細線(寬為一個畫素的線條),而是出現了邊緣的點包含斜坡中任意點的情況。由此可以看到:模糊的邊緣使邊緣的“寬度”較大,面清晰的邊緣使邊緣的寬度較小。影象的邊緣有方向的幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈。邊緣上的這種變化可以用微分運算元檢測出來,通常用一階導數或二階導數來檢測邊緣,不同的是一階導數認為最大值對應邊緣位置,而二階導數以過零點對應邊緣位置。實際上,對於影象中的任意方向上的邊緣都可以進行類似的分析。影象邊 緣檢測中對任意點的一階導數可以利用該點梯度的幅度來獲得,二階導數可以用拉普拉斯運算元得到。

1.3影象邊緣檢測演算法的研究內容

     影象邊緣檢測和分析可定義為應用一系列方法獲取、校正、增強、變換、檢測或壓縮可檢視像的技術。其目的是提高資訊的相對質量,以便提取有用資訊。影象邊緣檢測中的變換屬於影象輸入-影象輸出模式,影象邊緣檢測是一種超越具體應用的過程,任何為解決某一特殊問題而開發的影象邊緣檢測新技術或新方法,幾乎肯定都能找到其他完全不同的應用領域。影象邊緣檢測的主要研究內容包括:
(1)影象獲得和抽樣,其中通過人眼觀察的視野獲取影象的問題有:最常用的影象獲取裝置——電視(TV)攝像機問題,對所獲得訊號進行獨立的取樣和數字化就可用數字形式表達景物中全部彩色內容;電荷-耦合裝置,用作影象感測器,對景物每次掃描一行,或通過平行掃描獲得影象;選擇正確的分辨力或採樣密度,一幅影象實質上是二維空間中的訊號,所以適用於訊號處理的法則同樣適用於影象邊緣檢測,在放射學中常常需要高分辨力,要求影象至少達到2048畫素×2048畫素;灰度量化,影象強度也必須進行數字化,通常以256級(按1位元組編碼)覆蓋整個灰度,一般一幅灰度分辨力為8位,空間分辨力為512畫素×512畫素的影象需0.25兆位元組的存貯容量。
(2)影象分割,目的是把一個影象分解成它的構成成分,以便對每一目標進行測量。影象分割是一個十分困難的過程。但其測量結果的質量卻極大地依賴於影象分割的質量。有兩類不同的影象分割方法。一種方法是假設影象各成分的強度值是均勻的並利用這種均勻性;另一種方法尋找影象成分之間的邊界,因而是利用影象的不均勻性。主要有直方圖分割,區域生長,梯度法等
(3)邊界查索,用於檢測影象中線狀區域性結構,通常是作為影象分割的一個預處理步驟。大多數影象邊緣檢測技術應用某種形式的梯度運算元,可應用對水平方向、垂直方向或對角線方向的梯度敏感的梯度運算元,用它們的複合結果可檢測任意方向的邊界。
(4)影象增強和復原,用於改進影象的質量。不同的增強技術可以用於不同的目的,這取決於應用的型別。如果打算直接觀察影象,可以增強對比度。如果是為了進一步對影象作數字處理,可以選擇分割(一種突出各影象成分之間的邊界和線狀結構的運算)。該技術可以是整體的或區域性的,也可以在某個頻域或者空間域中進行。影象增強和復原的目的是為了提高影象的質量,如去除噪聲,提高影象的清晰度等。影象增強不考慮影象降質的原因,突出影象中所感興趣的部分。
(5)影象分類(識別),影象分類(識別)屬於模式識別的範疇,其主要內容是影象經過某些預處理(增強、復原、壓縮)後,進行影象分割和特徵提取,從而進行判決分類。影象分類常採用經典的模式識別方法,有統計模式分類和句法(結構)模式分類,近年來新發展起來的模糊模式識別和人工神經網路模式分類在影象識別中也越來越受到重視。
(6)影象變換:由於影象陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往採用各種影象變換的方法,如傅立葉變換、沃爾什變換、離散餘弦變換等間接處理技術,將空間域的處理轉換為變換域處理,不僅可減少計算量,而且可獲得更有效的處理(如傅立葉變換可在頻域中進行數字濾波處理)。目前新興研究的小波變換在時域和頻域中都具有良好的區域性化特性,它在影象邊緣檢測中也有著廣泛而有效的應用。

1.4執行邊緣檢測的基本步驟

1.為降噪對影象進行平滑處理;
2.邊緣點的檢測。這是一個區域性操作,從一幅影象中提取所有的點,這些點變為邊緣點的潛在候選者;
3.邊緣定位。這一步的目的是從候選邊緣點中選擇組合成邊緣點集合中的真實成員。

1.5影象梯度及性質

1.6梯度運算元

1.6.1Roberts運算元

    當對對角線方向的邊緣感興趣時,我們需要一個二維模板。Roberts運算元是最早嘗試使用具有對角優勢的二維模板之一。Roberts運算元是一種最簡單的運算元,是一種利用區域性差分運算元尋找邊緣的運算元,他採用對角線方向相鄰兩象素之差近似梯度幅值檢測邊緣。檢測垂直邊緣的效果好於斜向邊緣,定位精度高,對噪聲敏感,無法抑制噪聲的影響。Roberts邊緣運算元是一個2x2的模板,採用的是對角方向相鄰的兩個畫素之差。從影象處理的實際效果來看,邊緣定位較準,對噪聲敏感。
Roberts運算元檢測方法對具有陡峭的低噪聲的影象處理效果較好,但是利用roberts運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。

1.6.2Prewitt運算元

     Prewitt運算元是一種一階微分運算元的邊緣檢測,利用畫素點上下、左右鄰點的灰度差,在邊緣處達到極值檢測邊緣,去掉部分偽邊緣,對噪聲具有平滑作用。其原理是在影象空間利用兩個方向模板與影象進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。對數字影象f(x,y),Prewitt運算元的定義如下:
G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|
G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|

P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)
經典Prewitt運算元認為:凡灰度新值大於或等於閾值的畫素點都是邊緣點。即選擇適當的閾值T,若P(i,j)≥T,則(i,j)為邊緣點,P(i,j)為邊緣影象。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對於幅值較小的邊緣點,其邊緣反而丟失了。

1.6.3 Sobel運算元

     Sobel 運算元有兩個,一個是檢測水平邊沿的;另一個是檢測垂直平邊沿的。 Sobel運算元另一種形式是各向同性Sobel運算元,也有兩個,一個是檢測水平邊沿的,另一個是檢測垂直平邊沿的。各向同性Sobel運算元比普通Sobel運算元的位置加權係數更為準確,在檢測不同方向的邊沿時梯度的+-幅度一致。

由於Sobel運算元是濾波運算元的形式,用於提取邊緣,可以利用快速卷積函式, 簡單有效,因此應用廣泛。美中不足的是,Sobel運算元並沒有將影象的主體與背景嚴格地區分開來,換言之就是Sobel運算元沒有基於影象灰度進行處理,由於Sobel運算元沒有嚴格地模擬人的視覺生理特徵,所以提取的影象輪廓有時並不能令人滿意。 在觀測一幅影象的時候,我們往往首先注意的是影象與背景不同的部分,正是這個部分將主體突出顯示,基於該理論,我們給出了下面閾值化輪廓提取演算法,該演算法已在數學上證明當畫素點滿足正態分佈時所求解是最優的。Sobel邊緣運算元的卷積如圖所示,影象中的每個畫素都用這兩個核做卷積。這兩個核分別對垂直邊緣和水平邊緣響應最大,兩個卷積的最大值作為該點的輸出位。運算結果是一幅邊緣幅度影象。


Sobel運算元認為鄰域的畫素對當前畫素產生的影響不是等價的,所以距離不同的畫素具有不同的權值,對運算元結果產生的影響也不同。一般來說,距離越大,產生的影響越小。

二、演算法步驟

Step1.為降噪對影象進行平滑處理,對影象進行高斯濾波。
Step2.用sobel運算元進行邊緣檢測
Step3.用prewitt運算元進行邊緣檢測
Step4.用roberts運算元進行邊緣檢測
Step5.把原影象用拉普拉斯運算元的模板處理
Step6.把A影象歸零
Step7.把A的R分量用拉普拉斯運算元模板處理
Step8.把A的G分量用拉普拉斯運算元模板處理
Step9.把A的B分量用拉普拉斯運算元模板處理
Step10.令B=I-A

Step11.顯示B影象

三、結果分析


Sobel運算元並沒有將影象的主體與背景嚴格地區分開來。Sobel運算元是一階微分運算元,是加權平均濾波,且檢測的影象邊緣可能大於兩個畫素,和prewitt運算元一樣對灰度漸變低噪聲的影象有較好的檢測效果,但是對於混合多複雜噪聲的影象,處理效果顯得不理想。


Prewitt運算元是一階微分運算元,是平均濾波,對灰度漸變低噪聲的影象有較好的檢測效果。但是,對於混合多複雜噪聲的影象,處理效果顯得不理想。儘管如此,prewitt模板實現起來仍舊比sobel模板更為簡單。


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


邊緣增強可以提高影象中某一部分的清晰度,使影象特定區域色彩更加鮮明,使畫面整體更加清晰。從圖中可以看出,經邊緣增強後的影象清晰的顯示出圖中帽子的邊界和細節。

四、完整程式

clear all
clc
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(:));
g = imread('C:\Users\Administrator\Desktop\11.jpg');
f=rgb2gray(im2double(g));
subplot(2,3,1);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;
subplot(2,3,2),imshow(f)
title('高斯濾波器後的影象');
%%%%3*3的sobel運算元%%%%%%%%
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)=max(abs(sum(fsx(:))),abs(sum(fsy(:))));
    end
end
fs=im2uint8(ftemp);
subplot(2,3,3),imshow(fs)
title('用sobel邊緣運算元檢測的影象');
% %%%利用prewitt運算元進行邊緣檢測%%%
 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sx=[-1 -1 -1;0 0 0;1 1 1];
 sy=[1 0 -1;1 0 -1;1 0 -1];%這裡是prewitt運算元

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);
 subplot(2,3,4),imshow(fr)
 title('用prewitt運算元邊緣檢測的影象');
 % %%%利用roberts運算元進行邊緣檢測%%%
 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 sx=[-1 0;0 1];
sy=[0 -1;1 0];
for x=2:1:rowhigh-1
    for y=2:1:colhigh-1
        mod=[f(x-1,y-1) f(x-1,y);f(x,y-1) f(x,y)];
        fsx=sx.*mod;
        fsy=sy.*mod;
      ftemp(x,y)=max(abs(sum(fsx(:))),abs(sum(fsy(:))));
    end
end
ft=im2uint8(ftemp);
subplot(2,3,6),imshow(ft)
title('用roberts邊緣檢測的影象');
%拉普拉斯運算元銳化影象,用二階微分
%四鄰接g(x,y)=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)
I=im2double(g);
[m,n,c]=size(I);
A=zeros(m,n,c);
%分別處理R、G、B
%先對R進行處理
for i=2:m-1
    for j=2:n-1
        A(i,j,1)=I(i+1,j,1)+I(i-1,j,1)+I(i,j+1,1)+I(i,j-1,1)-4*I(i,j,1);
    end
end

%再對G進行處理
for i=2:m-1
    for j=2:n-1
        A(i,j,2)=I(i+1,j,2)+I(i-1,j,2)+I(i,j+1,2)+I(i,j-1,2)-4*I(i,j,2);
    end
end

%最後對B進行處理
for i=2:m-1
    for j=2:n-1
        A(i,j,3)=I(i+1,j,3)+I(i-1,j,3)+I(i,j+1,3)+I(i,j-1,3)-4*I(i,j,3);
    end
end
B=I-A;
Figure
imwrite(B,’11.jpg’,’jpg’)
 subplot(121)
 imshow('C:\Users\Administrator\Desktop\11.jpg');title('原始影象');
 subplot(122)
 imshow('11.jpg');title('邊緣增強影象')