基於MATLAB的Sobel邊緣檢測算法實現

  圖像邊緣就是圖像灰度值突變的地方,也就是圖像在該部分的像素值變化速度很是之快,就好比在座標軸上一條曲線有剛開始的平滑忽然來個大轉彎,在變化出的導數很是大。html

Sobel算子主要用做邊緣檢測,它是一離散型差分算子,用來計算圖像亮度函數灰度之近似值。算法

  邊緣是指其周圍像素灰度急劇變化的那些像素的集合。邊緣存在於目標、背景和區域之間,因此,邊緣是圖像分割所依賴的最重要的依據。因爲邊緣是位置的標誌,對灰度的變化不敏感,所以,邊緣也是圖像匹配的重要的特徵。微信

  Sobel邊緣檢測的核心在於像素矩陣的卷積,卷積對於數字圖像處理很是重要,不少圖像處理算法都是作卷積來實現的。卷積運算的本質就是對指定的圖像區域的像素值進行加權求和的過程,其計算過程爲圖像區域中的每一個像素值分別與卷積模板的每一個元素對應相乘,將卷積的結果做求和運算,運算到的和就是卷積運算的結果。函數

矩陣的卷積公式以下。spa

3x3的窗口M與卷積模板C的卷積運算以下。3d

 

Gx和Gy是sobel的卷積因子,將這兩個因子和原始圖像作以下卷積。code

 

Sobel卷積因子htm

其中A表明原始圖像。blog

 

獲得圖像中的每個點的橫向縱向灰度值Gx、Gy。最後經過以下公式來計算改變灰度的大小。圖片

 

可是一般爲了提升效率,使用不開平方的近似值,雖然這樣作會損失精度,,

 

將Sobel算子的實現劃分爲五個步驟:

(1) 計算Gx與Gy與模板每行的乘積。

(2) 兩個3x3矩陣的卷積即將每一行每一列對應相乘而後相加。

(3) 求得3*3模板運算後的Gx、Gy。

(4) 求Gx^2 + Gy^2的平方根或者直接對Gx和Gy取絕對值後求和。

(5)設置一個閾值,運算後的像素值大於該閾值輸出爲全1,小於該閾值輸出爲全0。

平方根和絕對值函數

sqrt(x) 計算平方根
abs(x)取數值的絕對值和複數的幅值

在對圖像數據進行運算時最好將圖像數據轉化成double類型的,避免精度損失。

Sobel邊緣檢測MATLAB實現

Sobel Edge Detect

 1 %RGB_YCbCr
 2 clc;
 3 clear all;
 4 close all;
 5 
 6 RGB_data = imread('lena.jpg');%
 7 
 8 R_data =    RGB_data(:,:,1);
 9 G_data =    RGB_data(:,:,2);
10 B_data =    RGB_data(:,:,3);
11 
12 %imshow(RGB_data);
13 
14 [ROW,COL, DIM] = size(RGB_data); 
15 
16 Y_data = zeros(ROW,COL);
17 Cb_data = zeros(ROW,COL);
18 Cr_data = zeros(ROW,COL);
19 Gray_data = RGB_data;
20 
21 for r = 1:ROW 
22     for c = 1:COL
23         Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
24         Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
25         Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
26     end
27 end 
28 
29 Gray_data(:,:,1)=Y_data;
30 Gray_data(:,:,2)=Y_data;
31 Gray_data(:,:,3)=Y_data;
32 
33 figure;
34 imshow(Gray_data);
35 
36 %Median Filter
37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
38 
39 figure;
40 imshow(imgn);
41 
42 Median_Img = Gray_data;
43 for r = 2:ROW-1
44     for c = 2:COL-1
45         median3x3 =[imgn(r-1,c-1)    imgn(r-1,c) imgn(r-1,c+1)
46                     imgn(r,c-1)      imgn(r,c)      imgn(r,c+1)
47                     imgn(r+1,c-1)      imgn(r+1,c) imgn(r+1,c+1)];
48         sort1 = sort(median3x3, 2, 'descend');
49         sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
50         sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
51         sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
52         mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
53         Median_Img(r,c) = mid_num(2);
54     end
55 end
56 
57 figure;
58 imshow(Median_Img);
59 
60 %Sobel_Edge_Detect
61 
62 Median_Img = double(Median_Img);
63 Sobel_Threshold = 150;
64 Sobel_Img = zeros(ROW,COL);
65 for r = 2:ROW-1
66     for c = 2:COL-1
67         Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);
68         Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);
69         Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
70         %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);
71         if(Sobel_Num > Sobel_Threshold)
72             Sobel_Img(r,c)=0;
73         else
74             Sobel_Img(r,c)=255;
75         end
76     end
77 end
78 
79 figure;
80 imshow(Sobel_Img);

處理後的圖片效果

中值濾波後的lena

Sobel邊沿檢測後的lena

    爲了使圖像邊緣更加明朗,能夠在Sobel的基礎上再進行腐蝕膨脹處理,腐蝕膨脹處理,下一篇繼續分享。

 

轉載請註明出處:NingHeChuan(寧河川)

我的微信訂閱號:開源FPGA

若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.javashuo.com/article/p-otawnomo-ds.html 

相關文章
相關標籤/搜索