MATLAB - 模糊逻辑图像处理(Fuzzy Logic Image Processing)

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、导入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')

在这里插入图片描述


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值