這篇部落格是接着上一篇來哒,https://blog.csdn.net/luolan9611/article/details/94285158
本篇部落格及上篇部落格搜集的資料、實驗代碼、實驗報告、PPT均已上傳至百度網盤:
連結:https://pan.baidu.com/s/1AmT4TtBAxj1FKf4KUFcsBw 提取碼:kcfe
先上結果~
再上代碼~
唔,要說明的是我使用的是matlabR2018a,如果用matlab2019的話,代碼要有些變化,因為函數接口什麼的會變...
%讀取原始圖像,并将之轉換為灰階圖
Irgb = imread('zx_in_xidian.jpg');
Igray=rgb2gray(Irgb);
%繪制原始圖像和灰階圖
figure
image(Irgb,'CDataMapping','scaled')
title('Input Image in Rgbscale');
figure
image(Igray,'CDataMapping','scaled')
colormap('gray')
title('Input Image in Grayscale');
%将灰階圖轉換為雙精度表示
I=im2double(Igray);
%定義Gx和Gy,将之與I卷積
Gx=[-1 1];
Gy=Gx';
%Ix=mapminmax(conv2(I,Gx,'same'));
%Iy=mapminmax(conv2(I,Gy,'same'));
Ix=conv2(I,Gx,'same');
Iy=conv2(I,Gy,'same');
%繪制Ix和Iy
figure
image(Ix,'CDataMapping','scaled')
colormap('gray')
title('Ix')
figure
image(Iy,'CDataMapping','scaled')
colormap('gray')
title('Iy')
%定義圖像邊緣檢測的模糊推理系統
edgeFIS=newfis('edgeDetection');
%定義模糊推理系統的輸入
edgeFIS = addvar(edgeFIS,'input','Ix',[-1 1]);
edgeFIS = addvar(edgeFIS,'input','Iy',[-1 1]);
%sx和sy分别作為高斯隸屬函數中相應的sigma标準差
sx=0.1;
sy=0.1;
edgeFIS = addmf(edgeFIS,'input',1,'zero','gaussmf',[sx 0]);
edgeFIS = addmf(edgeFIS,'input',2,'zero','gaussmf',[sy 0]);
%定義模糊推理系統的輸出
edgeFIS = addvar(edgeFIS,'output','Iout',[0 1]);
%三角隸屬函數
wa = 0.1;
wb = 1;
wc = 1;
ba = 0;
bb = 0;
bc = 0.7;
%參數說明 fis = addmf(fis,varType,varIndex,mfName,mfType,mfParams)
edgeFIS = addmf(edgeFIS,'output',1,'white','trimf',[wa wb wc]);
edgeFIS = addmf(edgeFIS,'output',1,'black','trimf',[ba bb bc]);
%繪制Ix,Iy和Iout隸屬函數圖像
figure
subplot(2,2,1)
plotmf(edgeFIS,'input',1)
title('Ix')
subplot(2,2,2)
plotmf(edgeFIS,'input',2)
title('Iy')
subplot(2,2,[3 4])
plotmf(edgeFIS,'output',1)
title('Iout')
%定義兩個規則:如果Ix為0,Iy也為0,那麼輸出是白色,即非邊緣區域;如果Ix不為0或者Iy不為0,則輸出黑色,為邊緣區域。
r1 = 'If Ix is zero and Iy is zero then Iout is white';
r2 = 'If Ix is not zero or Iy is not zero then Iout is black';
r = char(r1,r2);
edgeFIS = parsrule(edgeFIS,r);
showrule(edgeFIS)
%将每一行像素送入模糊系統進行評估,得到輸出
Ieval = zeros(size(I));
for ii = 1:size(I,1)
Ieval(ii,:) = evalfis([(Ix(ii,:));(Iy(ii,:));]',edgeFIS);
end
%繪制邊緣檢測後的圖像
figure
colormap('gray')
image(Ieval,'CDataMapping','scaled')
colorbar
title('Edge Detection Using Fuzzy Logic')
%以坐标[2183,1463]上的像素點為例,它的Ix為0.0275,Iy為0.2196
%這一坐标點的Ix和Iy經過高斯隸屬函數計算後得到的隸屬度分别為([0.962893466491363,0.0897068632021378])
%不屬于0的隸屬度是它們的補([0.0371065335086372,0.910293136797862])
%根據高斯隸屬函數得到的隸屬度在三角隸屬函數的圖像上(white的函數圖和black的函數圖),分别進行蘊含操作(min)後,進行Aggregate操作
%将模糊集去模糊化得到單一輸出值(使用質心的方法)
%繪制出該圖像
[output,fuzzifiedInputs,ruleOutputs,aggregatedOut]=evalfis([0.0275,0.2196],edgeFIS);
outputRange=linspace(edgeFIS.output.range(1),edgeFIS.output.range(2),length(aggregatedOut))';
figure
plot(outputRange,aggregatedOut,[output output],[0 1])
xlabel('Iout')
ylabel('Output Memebership')
legend('Aggregated output fzzy set','Defuzzified output')
%繪制該模糊系統的圖像
figure
plotfis(edgeFIS)
title('edgeFIS')
%繪制表面曲線圖
figure
gensurf(edgeFIS)
title('surfaceplot')
原理講解~
記得上篇部落格講的模糊推理過程吧~
模糊推理是使用模糊邏輯将給定輸入映射到輸出的過程。将輸入變量進行模糊化得到模糊集,根據設定的規則描述(前件)進行模糊運算,将模糊運算的結果作用于後果(後件),将每個規則的輸出模糊集聚合為指定輸出,去模糊化後得到推理結果。
模糊推理過程主要分為五個部分:
1.輸入變量的模糊化
通過隸屬函數将前提條件中的所有模糊語句解析為0到1之間的隸屬度。如果前提隻有一個部分,那麼這就是對規則的支援程度。
2.模糊算子(AND或OR)在先行詞中的應用
如果前提條件不隻一個,則應用模糊邏輯運算,将前提解析為0到1之間的隸屬度值。
3.計算前提條件對後件的影響
使用整個規則的支援度來塑造輸出模糊集。模糊規則的結果将整個模糊集配置設定給輸出。該模糊集由隸屬函數表示,該隸屬函數被選擇以訓示後件的品質。如果先行詞僅部分為真,(即指派小于1),則根據蘊涵方法截斷輸出模糊集。
4.所有規則的結果彙總
然後将每個規則的輸出模糊集合聚合為單個輸出模糊集。
5.去模糊化
最後,對結果集進行去模糊化,得到最終的推理結果。
========
那怎麼把這一推理過程用于圖像邊緣檢測呢????
圖像的邊緣是兩個均勻區域之間的邊界,我們可以通過比較鄰近像素的強度來檢測邊緣。但是,由于均勻區域沒有明确定義,兩個相鄰像素之間的小強度差并不總是表示邊緣。相反,強度的差異可能代表着陰影效果。圖像處理的模糊邏輯方法允許我們使用隸屬函數來定義像素屬于邊緣或均勻區域的程度。
如果把圖像看成二維離散函數,那麼圖像梯度其實就是這個二維離散函數的求導:G(x,y) = dx(i,j) + dy(i,j);其中dx(i,j) = I(i+1,j) - I(i,j);dy(i,j) = I(i,j+1) - I(i,j); I是圖像像素的值(如:RGB值),(i,j)為像素的坐标。
先對圖像預處理一下:原圖-->灰階化-->灰階圖歸一化
然後,利用梯度濾波器Gx=[-1 1]和Gy(等于Gx的轉置)和圖像I分别卷積,可以獲得圖像沿水準方向和豎直方向的梯度矩陣Ix和Iy,梯度的值在[-1 1]之間變化。也可以使用其它的濾波器來獲得圖像的梯度。
得到的Ix和Iy你們能看出差別的對吧,Ix是水準方向的梯度,上面有樹幹的紋理,Iy上檢測不到的。
============================
然後我們就要開始進行那五個步驟啦:
使用0均值高斯隸屬函數定義像素點屬于zero(非邊緣像素點)的程度,其中sigma是标準偏差,我設定為0.1,c是均值為0。sigma值的改變可以調整邊緣檢測的性能。增加它們的值會使得算法對于圖像中的邊緣沒那麼敏感并且減少檢測的邊緣的強度。
定義兩個規則:
對于輸出的像素點的值屬于白色還是黑色分别定義white和black隸屬函數,參數a和c定位的是三角形的腳點,b定位的是頂點。其中wa = 0.1;wb = 1;wc = 1;ba = 0;bb = 0;bc = 0.7; wa,wb,wc,ba,bb,bc可以更改以調整邊緣檢測器的性能。如下:
下面這張圖是該圖像邊緣檢測模糊推理系統的示意圖:
以本實驗中的待檢測圖像中的一像素點為例進一步說明第3和第4步。以Ix,Iy=[0.0275,0.2196]的這個像素點(即書包上的那個點)為邊緣檢測模糊推理系統edgeFIS的輸入,它們屬于zero的隸屬度分别為0.9629和0.0897,不屬于zero的隸屬度分别為0.0371(即1-0.9629)和0.9103(即1-0.0897)。
步驟2和步驟3.根據規則1的and運算,取小值0.0897對white進行截斷。根據規則2的or運算,取大值0.9103對black進行截斷。截斷後的模糊集在原圖中由黃線表示。
步驟4.所有規則的結果彙總
将white和black小圖中黃線的部分Aggregation(取大值),即可得到所有規則的結果彙總後的模糊集,如手繪圖中最右下角的黃線所示,其實也就是下圖中的藍色線條。
步驟5.去模糊化
對Aggeragation後的圖像進行去模糊化,即可得到最終的輸出值,如圖橘黃色的線Defuzzified output所示。輸出值約為0.28,是書包那點的輸出值。
===============================================================================
參考資料:
Matlab的官網Example~~
https://ww2.mathworks.cn/help/fuzzy/fuzzy-logic-image-processing.html?requestedDomain=zh
上一篇部落格:
【模糊數學】模糊邏輯,隸屬度,模糊邏輯應用,模糊推理過程
https://blog.csdn.net/luolan9611/article/details/94285158
好了,今天就分享這麼多吧,可愛