系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、导入RGB图像并转换为灰度图像
- 二、转换图像双精度数据
- 三、获取图像梯度
- 四、定义用于边缘检测的模糊推理系统(FIS)
- 五、指定FIS规则
- 六、评价FIS
- 七、绘制结果
前言
这个例子展示了如何使用模糊逻辑进行图像处理。具体来说,这个例子展示了如何检测图像中的边缘。边是两个均匀区域之间的边界。可以通过比较相邻像素的强度来检测边缘。然而,由于均匀区域没有清晰的定义,两个相邻像素之间的小强度差异并不一定代表边缘。相反,强度差可能代表一种阴影效果。
用于图像处理的模糊逻辑方法允许使用隶属度函数来定义像素属于边缘或均匀区域的程度。
一、导入RGB图像并转换为灰度图像
导入图片
Irgb = imread('peppers.png');
Irgb是一个384 x 512 x 3 uint8数组。Irgb(第三个数组维度)的三个通道表示图像的红色、绿色和蓝色强度。将Irgb转换为灰度,以便您可以使用二维数组而不是三维数组。为此,可以使用rgb2gray函数。
Igray = rgb2gray(Irgb);
figure
image(Igray,'CDataMapping','scaled')
colormap('gray')
title('Input Image in Grayscale')
二、转换图像双精度数据
评价模糊推理系统的evalfis函数只支持单精度和双精度数据。因此,使用im2double函数将Igray转换为double数组。
I = im2double(Igray);
三、获取图像梯度
本例中的模糊逻辑边缘检测算法依赖于图像梯度在均匀区域中定位断裂。计算沿x轴和y轴的图像梯度。Gx和Gy是简单的梯度滤波器。为了获得一个包含I的x轴梯度的矩阵,我们使用conv2函数将I与Gx卷积。梯度值在[-1 1]范围内。类似地,为了获得I的y轴梯度,将I与Gy卷积。
Gx = [-1 1];
Gy = Gx';
Ix = conv2(I,Gx,'same');
Iy = conv2(I,Gy,'same');
绘制图像梯度。
figure
image(Ix,'CDataMapping','scaled')
colormap('gray')
title('Ix')
figure
image(Iy,'CDataMapping','scaled')
colormap('gray')
title('Iy')
你可以使用其他滤波器来获得图像梯度,例如Sobel算子或Prewitt算子。有关如何使用卷积对图像进行滤波的信息,请参阅什么是空间域的图像滤波?(图像处理工具箱)或者,如果你有图像处理工具箱软件,你可以使用imfilter(图像处理工具箱)、imgradientxy(图像处理工具箱)或imgradient(图像处理工具箱)函数来获取图像梯度。
四、定义用于边缘检测的模糊推理系统(FIS)
创建一个用于边缘检测的模糊推理系统(FIS)。
edgeFIS = mamfis('Name','edgeDetection');
指定图像梯度Ix和Iy作为edgeFIS的输入。
edgeFIS = addInput(edgeFIS,[-1 1],'Name','Ix');
edgeFIS = addInput(edgeFIS,[-1 1],'Name','Iy');
为每个输入指定一个零均值高斯隶属函数。如果一个像素的梯度值为0,那么它属于度为1的隶属函数。
sx = 0.1;
sy = 0.1;
edgeFIS = addMF(edgeFIS,'Ix','gaussmf',[sx 0],'Name','zero');
edgeFIS = addMF(edgeFIS,'Iy','gaussmf',[sy 0],'Name','zero');
sx和sy指定了Ix和Iy输入的零隶属度函数的标准差。为了调整边缘检测器的性能,可以改变sx和sy的值。增大该值会使算法对图像中的边缘不那么敏感,降低检测到的边缘的强度。指定边缘检测图像的强度作为edgeFIS的输出。
edgeFIS = addOutput(edgeFIS,[0 1],'Name','Iout');
为Iout指定三角形的隶属度函数,白色和黑色。
wa = 0.1;
wb = 1;
wc = 1;
ba = 0;
bb = 0;
bc = 0.7;
edgeFIS = addMF(edgeFIS,'Iout','trimf',[wa wb wc],'Name','white');
edgeFIS = addMF(edgeFIS,'Iout','trimf',[ba bb bc],'Name','black');
与sx和sy一样,你可以改变wa、wb、wc、ba、bb和bc的值来调整边缘检测器的性能。三元组指定了隶属函数三角形的开始、峰值和结束。这些参数会影响检测到的边缘的强度。绘制edgeFIS输入和输出的隶属函数。
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')
五、指定FIS规则
添加规则,如果一个像素属于一个均匀区域,它就变成白色,否则变成黑色。当图像在两个方向上的梯度都为零时,表示像素处于均匀区域。如果任意一个方向的梯度不为零,则该像素位于边缘上。
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";
edgeFIS = addRule(edgeFIS,[r1 r2]);
edgeFIS.Rules
ans =
1×2 fisrule 数组 - 属性:
Description
Antecedent
Consequent
Weight
Connection
Details:
Description
_______________________________________
1 "Ix==zero & Iy==zero => Iout=white (1)"
2 "Ix~=zero | Iy~=zero => Iout=black (1)"
六、评价FIS
使用Ix和Iy的相应行作为输入,评估I中每一行像素的边缘检测器的输出。
Ieval = zeros(size(I));
for ii = 1:size(I,1)
Ieval(ii,:) = evalfis(edgeFIS,[(Ix(ii,:));(Iy(ii,:))]');
end
七、绘制结果
绘制原始灰度图像。
figure
image(I,'CDataMapping','scaled')
colormap('gray')
title('Original Grayscale Image')
绘制检测到的边缘。
figure
image(Ieval,'CDataMapping','scaled')
colormap('gray')
title('Edge Detection Using Fuzzy Logic')