天天看點

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

一、簡介

0 前言

邊緣檢測是圖像進行中最古老和最基本的問題之一。灰階 邊緣檢測算法的發展時間較長, 算法較多。基于梯度的邊緣檢 測算子最早出現, 基于優化目标函數的方法, Canny算子被廣泛使用。另外還有基于其它技術的邊緣檢測方法, 如多尺度方法、統計過程、曲面拟和和支援向量等。 近年來, 由于數字彩色圖像的廣泛運用, 使彩色數字圖像處理技術日益受到關注。現有的一些彩色圖像邊緣檢測方法中, 有相當部分是灰階圖像邊緣檢測的推廣, 也即首先基于某一彩色分量紅® 、綠(G) 或藍(B) 的圖像進行灰階圖像邊緣 檢測, 然後再将每一獨立分量的邊緣圖聯合形成彩色圖像的邊緣。這些方法忽略了人眼對顔色的視覺感覺, 沒有考慮各顔色分量之間的聯系, 往往得不到好的邊緣檢測效果。而基于彩色空間的邊緣檢測方法可以充分利用彩色圖像中攜帶的彩色資訊。為了充分考慮人眼對不同顔色感覺程度的不同, 同時克服彩色空間角向量距離計算複雜的缺點, 本文使用彩色空間 Mahalanobis 距離作為彩色象素之間差異的度量。 所有的正常邊緣提取方法輸出結果都是二值圖像。是以, 提取的邊緣丢失了許多重要的資訊, 尤其展現在有豐富細節和 微小變化的區域。為了解決這個問題, 利用細胞神經網絡 (CNN) 多值輸出的特點來進行彩色圖像邊緣檢測。

1 細胞神經網絡(CNN)

美國科學家 L.O.Chua 等人 1988 年提出的細胞神經網絡 (CNN) 。由于其具有可并行計算、便于硬體實作等特性, 故它比傳統方法有更大的潛力。 CNN的數學描述如下:

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

2 彩色空間

2.1 RGB 彩色空間

RGB( 紅、綠、藍) 是衆多彩色空間的一種。由于紅、綠、藍三個通道裡的灰階值各自獨立控制紅、綠、藍三種顔色的亮度, 形成數學上的一個三維空間。記錄及顯示彩色圖像時, RGB是最常見的一種方案。因為彩色圖像有三個分量, 彩色象素實際上是向量。在RGB 系統中, 每個彩色點都會在 RGB 坐标系中作為一個從原點延伸到那一點的向量來描述。 令c 代表 RGB 彩色空間中的任意向量:

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

該公式表明 c 的分量是一幅彩色圖像在一個點上的 RGB 分量。彩色分量是坐标( x, y) 的函數, 表示為:

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

對一個大小為 M×N 的圖像來說, 有 MN 個這樣的向量, 其 中, x=0, 1, 2, …, M- 1 和 y=0, 1, 2, …, N- 1。

2.2 Mahalanobis距離

為了度量象素之間的差異, 有一個相似性度量是必要的。 最簡單的度量之一是歐幾裡得距離。令z代表RGB空間中的 任意點, 如果它們之間的距離小于特定的門檻值 D0, 則 z 與 a 是 相似的, z和a間的歐氏距離由下式給出:

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

這裡下标 R, G, B 表示向量 a 和 z 的 RGB 分量。D( z, a) ≤D0 的點的軌道是半徑為 D0 的實心球。包含在球内部和表面上的 點符合特定的彩色準則; 球外面上的點則不符合準則。 上式一個有用的推廣是如下形式的距離測度:

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

這裡 C 是一個實對角陣, 主對角線上的元素起到對各個次元 權重的作用。該距離稱為 Mahalanobis 距離。D( z, a) ≤D0 的點的軌道描述了一個實心的三維橢球體, 其主軸取在最大的資料擴充方向上。當 C 等于機關矩陣 I 時, Mahalanobis 距離約簡為歐幾裡得距離。

2.3 視見函數

人眼對各種不同波長的光有不同的靈敏度, 為了研究客觀 輻射通量對人眼引起的主觀感覺的強度之間的關系, 首先必須 了解人眼對各種波長光的靈敏度。但是, 輻射通量使人眼産生 亮暗感覺的程度是無法作出定量比較的, 幸好人的視覺能相當 精确地判斷兩種顔色光的亮暗感覺是否相同, 是以确定人眼的 光譜響應可将各種波長的光引起相同亮暗感覺所需要的輻射 通量進行比較, 對大量具有正常視力的觀察者所做的實驗表 明, 在比較明亮的環境, 人眼視覺對 λ=555 nm 左右的黃綠光最 敏感。設任何一種波長為 λ的光和 λ=555 nm 的黃綠光産生同 樣亮暗感覺所需的輻射通量分别為 P! 和 P555 , 比值 V( !) =P555 / P! 就稱為人眼視見函數。 各色光在人眼視覺上所引起的視見程度不同。在明亮環境 下, 人眼對波長為 555 nm 的黃綠光最敏感。而對紅光和紫光的 敏感度最低。在陰暗環境下, 人眼對波長約為 510 nm 的綠光最 敏感, 對紅光和紫光的敏感度最低。

【圖像邊緣檢測】基于matlab CNN灰階圖像邊緣提取【含Matlab源碼 490期】

二、部分源代碼

%檔案名稱:  CNN_Edge_extraction.m
%檔案描述:  基于CNN的灰階圖像邊緣提取的程式
%創 
%參考文獻: 《基于細胞神經網絡的圖像邊緣提取算法研究》
%             

clear;
clc;

I=imread('C:\Users\lenovo\Desktop\d083bc186611b136d0e72beeccee8850\CNN邊緣檢測\lena.jpg');
[c,d]=size(I);
x=zeros(c,d);

for i=1:c;
    for j=1:d;
        n(i,j)=double(I(i,j))/255;
        s(i,j)=2*(n(i,j)-0.5);
    end
end
A=[0 0 0;
   0 1.600 0;
   0 0 0];
B=[-1.004 -1.004 -1.004;
   -1.004 10.000 -1.004;
   -1.004 -1.004 -1.004];
z=-1.405;

% A=[0 0 0;
%    0 2 0;
%    0 0 0];
% B=[-1 -1 -1;
%    -1  8 -1;
%    -1 -1 -1];
% z=-0.5;

% A=[0 0 0;
%    0 9.926055 0;
%    0 0 0];
% B=[-1.124332 -1.124332 -1.124332;
%    -1.124332  9.670411 -1.124332;
%    -1.124332 -1.124332 -1.124332];
% z=-1.915585;

circlenumber=0; %circlenumber是細胞神經網絡要循環的次數
judge=0;        %judge是判斷網絡穩定的标志,
                %0是網絡未達到穩定的标志,
                %1表示網絡已經穩定了

%當所有的狀态x(i,j)的絕對值都大于1的時候,就認為網絡趨于穩定
%下面是計算過程,直接疊代到完全收斂
while judge==0
    circlenumber=circlenumber+1;
    for i=2:c-1     %求出各個輸出的值
        for j=2:d-1
            if x(i,j)>=1      %求f(x(i,j))的值,設定為f(i,j)
                f(i,j)=1;     %表示正向穩定時,取白色
            elseif x(i,j)<=-1
                f(i,j)=-1;    %表示負向穩定時,取黑色
            else
                f(i,j)=x(i,j);%未穩定時,将狀态直接輸出
            end
        y(i,j)=f(i,j);        %無論是否穩定,都将結果先直接輸出
        end
    end
    %其中邊界條件是在圖像外面的像素都設定為0;
    %這裡是将上面兩行,下面兩行,還有左右兩行都設定成邊界
    %正式的處理單元是中間2到257行和2到257列的部分
    for i=2:c-1
        for j=2:d-1
            xn(i,j)=z+A(2,2)*y(i,j)+B(2,2)*s(i,j)+B(1,1)*s(i-1,j-1)...
            +B(1,2)*s(i-1,j)+B(1,3)*s(i-1,j+1)+B(2,1)*s(i,j-1)+B(2,3)...
            *s(i,j+1)+B(3,1)*s(i+1,j-1)+B(3,2)*s(i+1,j)+B(3,3)*s(i+1,j+1);
            %以上語句對應于CNN的公式,詳見《細胞網絡神經動力學》p5
        end
    end
    %以下判斷是不是已經全部收斂了,如果全部收斂了,就置judge=1
    judge=1;
    for i=2:c-1
        for j=2:d-1
            if abs(xn(i,j))<1
                judge = 0;
            end
        end
    end
    %以下将xn(i,j)指派給狀态x(i,j)
    for i=2:c-1
        for j=2:d-1
            x(i,j)=xn(i,j);
        end
    end
end


%接下去跳出wile循環,表示已經穩定了
%以下進行邊緣的确定,f(i,j)=1對應的像素值設為1,
%f(i,j)=-1對應的像素值設為0
a=zeros(c,d);
for i=2:c-1
    for j=2:d-1
        if x(i,j)>=1
            a(i,j)=1;
        elseif x(i,j)<=-1
            a(i,j)=0;
        end
    end
end

%以下輸出原始圖像和邊緣圖像a
figure(1);imshow(I);
title('原始圖像');
%以下輸出y(i,j)狀态圖
figure(2);
imshow(a);
title('lena的CNN狀态圖');
imwrite(a,'lena_cnn.png','png');
           

三、運作結果

四、matlab版本及參考文獻

繼續閱讀