參考河北師範大學碩士學位論文——基於八方向Sobel運算元的邊緣檢測演算法研究。
由於自己實現濾波器運算,計算速度很慢,以後有能力再進行改進。
運算元定義如下:
演算法思路:
1.將RGB映像轉化為CIELab色彩空間的映像。
2.計算不同方向上的梯度,乘以權值後取最大值當作輸出值。
效果如下:
已耗用時間:33.543444 秒。
已耗用時間:79.695009 秒。
跑的好慢QAQ
代碼如下:
CIELabEdge.m(演算法的總入口)
%在CIELab色彩空間下對圖片進行邊緣檢測(參數為待處理的RGB映像)%使用論文中的八方向Sobel運算元進行濾波%論文引自--鄭英娟. 基於八方向Sobel運算元的邊緣檢測演算法研究. 河北師範大學碩士學位論文. 2013.3.26%From:Yinggang Wang%Create Date:2018.3.30function [] = CIELabEdge(img)%色彩空間轉換Lab = RGB2Lab(img);%濾波處理Edge = MyFilter(Lab);%輸出結果figure('NumberTitle','off','Name','邊緣');imshow(Edge,[]);figure('NumberTitle','off','Name','邊緣(負片)');imshow(imcomplement(Edge),[]);
MyFilter.m(自己實現的濾波器)
%使用濾波器濾波(參數:CIELab色彩空間的三維矩陣)(映像輸出大小比實際小一點)%%From:Yinggang Wang%Create Date:2018.3.30function im = MyFilter(ori)s = size(ori);im = zeros(s(1),s(1,2));for i = 3:(s(1)-2) for j = 3:(s(2)-2) im(i-2,j-2) = getOutput(ori,i,j); endend
getOutput.m(得到每一點的輸出值)
%得到x,y座標像素點的輸出值%%From:Yinggang Wang%Create Date:2018.3.30function out = getOutput(ori,x,y)%以下是八個方向的運算元D0 = [1,2,4,2,1];D22_5 = [1,2,4,2,4];D45 = [1,4,2,4,1];D67_5 = [1,2,4,2,4];D90 = [1,2,4,2,1];D112_5 = [1,2,4,2,1];D135 = [1,4,2,4,1];D157_5 = [1,2,4,2,4];a = zeros(1,8);a(1) = sum(D0 .* [CD(ori(x-2,y-1),ori(x-2,y+1)),CD(ori(x-1,y-1),ori(x-1,y+1)),CD(ori(x,y-1),ori(x,y+1)),CD(ori(x+1,y-1),ori(x+1,y+1)),CD(ori(x+2,y-1),ori(x+2,y+1))]);a(2) = sum(D22_5 .* [CD(ori(x-2,y),ori(x+2,y)),CD(ori(x-1,y+1),ori(x+1,y-1)),CD(ori(x,y-1),ori(x,y+1)),CD(ori(x-1,y-1),ori(x+1,y+1)),CD(ori(x-1,y),ori(x+1,y))]);a(3) = sum(D45 .* [CD(ori(x+1,y-2),ori(x+2,y-1)),CD(ori(x,y-1),ori(x+1,y)),CD(ori(x-1,y-1),ori(x+1,y+1)),CD(ori(x-1,y),ori(x,y+1)),CD(ori(x-2,y+1),ori(x-1,y+2))]);a(4) = sum(D67_5 .* [CD(ori(x,y-2),ori(x,y+2)),CD(ori(x-1,y-1),ori(x+1,y+1)),CD(ori(x-1,y),ori(x+1,y)),CD(ori(x-1,y+1),ori(x+1,y-1)),CD(ori(x,y+1),ori(x,y-1))]);a(5) = sum(D90 .* [CD(ori(x-1,y-2),ori(x+1,y-2)),CD(ori(x-1,y-1),ori(x+1,y-1)),CD(ori(x-1,y),ori(x+1,y)),CD(ori(x-1,y-2),ori(x+1,y-2)),CD(ori(x-1,y+2),ori(x+1,y+2))]);a(6) = sum(D112_5 .* [CD(ori(x,y-2),ori(x,y+2)),CD(ori(x-1,y-1),ori(x+1,y+1)),CD(ori(x-1,y),ori(x+1,y)),CD(ori(x-1,y+1),ori(x+1,y-1)),CD(ori(x,y+1),ori(x,y-1))]);a(7) = sum(D135 .* [CD(ori(x-1,y-2),ori(x-2,y-1)),CD(ori(x,y-1),ori(x-1,y)),CD(ori(x+1,y-1),ori(x-1,y+1)),CD(ori(x+1,y),ori(x,y+1)),CD(ori(x+2,y+1),ori(x+1,y+2))]);a(8) = sum(D157_5 .* [CD(ori(x-2,y),ori(x+2,y)),CD(ori(x-1,y+1),ori(x+1,y-1)),CD(ori(x,y-1),ori(x,y+1)),CD(ori(x-1,y-1),ori(x+1,y+1)),CD(ori(x-1,y),ori(x+1,y))]);a(1) = a(1)/10.0;a(2) = a(2)/13.0;a(3) = a(3)/12.0;a(4) = a(4)/13.0;a(5) = a(5)/10.0;a(6) = a(6)/13.0;a(7) = a(7)/12.0;a(8) = a(8)/13.0;out = ((max(a)+0.5));
CD.m(求兩點的歐式距離)
%求兩點的歐式距離%%From:Yinggang Wang%Create Date:2018.3.30function dis = CD(a,b)dis = sqrt((a-b)^2 + (a-b)^2 + (a-b)^2);
代碼已經上傳:點擊進入下載頁面