这篇博客是接着上一篇来哒,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
好了,今天就分享这么多吧,可爱