主要内容

使用模糊系统分类像素

这个例子展示了如何使用模糊推理系统(FIS)对图像像素进行分类。这个例子需要图像处理工具箱™软件。

像素分类是根据特定像素属性对每个像素进行分类,从而对图像进行分割的一种图像处理技术。噪声和其他不确定性来源会使像素分类复杂化。使用基于fis的方法进行分类可以帮助解决这种不确定性。

本例包括以下阶段。

  1. 调优FIS以基于颜色对像素进行分类。

  2. 调优FIS以基于纹理对像素进行分类。

  3. 将调整后的FIS对象组合成一个层次模糊系统进行像素分类。

加载图像数据,其中包含三个可见部分:绿色草地、白色边框和足球。

exData = load(“fuzzpixclass”);cImg = exData.cImg;图imshow (cImg)

图中包含一个轴对象。axis对象包含一个image类型的对象。

这个示例使用模糊系统将图像分割为三类,将每个像素分类为属于绿色草地、白色边界或足球。

彩色分割图像

图像段包括以下颜色属性。

  • 绿场:绿色和黑色阴影像素的变化

  • 白色边框:白色,浅绿色,深色阴影像素

  • 足球:白色和深色像素

由于深色像素的数量与绿色和白色像素相比微不足道,您可以创建一个模糊分类器来区分绿色和白色像素。你可以用样本绿色和白色像素来训练分类器,因为没有一个片段包含唯一的颜色属性。

从绿色区域和白色边界段中提取具有代表性的子图像作为训练数据。每个子图像都包含像素颜色的变化。

grnImg = exData.grnImg;whtImg = exData.whtImg;图subplot(1,2,1)“绿子图象”) subplot(1,2,2)“白色子图象”

图中包含2个轴对象。坐标轴对象1包含一个image类型的对象。坐标轴对象2包含一个image类型的对象。

构建金融中间人

对于颜色分割,构造一个无规则的三输入一输出Sugeno FIS。对于每个输入和输出变量,包括两个默认的成员函数(mf)。

colorFISIn = sugfis(“NumInputs”3,“NumInputMFs”2,...“NumOutputs”, 1“NumOutputMFs”2,“AddRules”“没有”);

输入变量对应于每个像素的RGB值。如果像素颜色为绿色,则输出值高;否则就是低的。

火车FIS

从代表性颜色子图像创建训练数据。的getColorInputDatahelper函数为指定图像中的每个像素创建一个RGB值的三列数组,该函数显示在示例的末尾。

[grnSubRow,grnSubCol,grnSubDepth] = size(grnImg);%绿色子图像大小[whtSubRow,whtSubCol,whtSubDepth] = size(whtImg);%白色子图像大小trnX = [...getColorInputData (grnImg);...getColorInputData (whtImg)...];trnY = [...的(grnSubRow * grnSubCol, 1);...%输出高(1)绿色像素0 (whtSubRow * whtSubCol, 1)...白色像素输出低(1)];

输入数据trnXRGB像素值有三列。输出数据trnY是一个列向量,其中每个绿色像素包含一个1,每个白色像素包含一个0。

为的学习规则创建一个选项集colorFISIn.为了缩短优化过程的持续时间,交叉验证参数使用最小值。

选项= tunefisOptions(“OptimizationType”“学习”“KFoldValue”2,...“ValidationTolerance”, 0.0,“ValidationWindowSize”1);

如果您拥有并行计算工具箱™软件,则可以通过设置选项。UseParallel真正的.如果没有并行计算工具箱软件,请设置选项。UseParallel

为了学习规则并找到FIS参数值,本例使用了遗传算法优化,这是一个随机过程。要获得可重复的结果,请将随机数生成器初始化为默认配置。

rng (“默认”

学习模糊规则colorFISIn使用训练数据和选项。学习规则使用tunefis功能可能需要几分钟。对于本例,您可以通过设置来启用调优runtunefis真正的.在不运行的情况下加载预训练的结果tunefis,设置runtunefis

Runtunefis = false;

若要学习新规则而不调整输入和输出MF参数,请将参数设置设置为[].有关更多信息,请参见tunefis

如果runtunefis colorFISOut1 = tunefis(colorFISIn,[],trnX,trnY,options);% #好< UNRCH >其他的colorFISOut1 = exData.colorFISOut1;结束

计算训练FIS的均方根误差(RMSE)。的calculateRMSE示例末尾显示的helper函数使用训练后的FIS对训练数据像素进行分类,并将结果与预期的像素分类进行比较。

流('学习规则后训练RMSE = %。3 f MPG \ n”...calculateRMSE (colorFISOut1 trnX trnY));
学习规则后的训练RMSE = 0.283 MPG

在学习新规则之后,调优输入和输出MF参数。要获得FIS的可调参数设置,请使用getTunableSettings函数。

[in,out] = gettunthesettings (colorFISOut1);

要调优现有FIS参数值而不学习新规则,请设置OptimizationType“优化”

选项。OptimizationType =“优化”

使用指定的可调参数、训练数据和调优选项调优FIS参数。

如果runtunefis rng (“默认”colorFISOut = tunefis(colorFISOut1,[in;out],trnX,trnY,options);colorFISOut。Name =“colorFISOut”其他的colorFISOut = exData.colorFISOut;结束

计算调优后FIS的RMSE。

流('调优MF参数后训练RMSE = %。3 f MPG \ n”...calculateRMSE (colorFISOut trnX trnY));
调整MF参数后训练RMSE = 0.228 MPG

部分图片

使用调谐后的FIS分割原始图像。为此,首先提取红色、绿色和蓝色像素值。

[imgRow,imgCol,imgDepth] = size(cImg);红色= cImg(:,:,1);green = cImg(:,:,2);blue = cImg(:,:,3);colorInput =[红色(:)绿色(:)蓝色(:)];

使用调优的FIS对每个像素进行分类。

eoptions = evalfisOptions;eoptions。EmptyOutputFuzzySetMessage =“没有”;eoptions。NoRuleFiredMessage =“没有”;eoptions。OutOfRangeInputValueMessage =“没有”;y = evalfis(colorFISOut,colorInput,eoptions);

元素分割图像getSegmentedImageHelper函数,该函数显示在示例的末尾。这个函数根据FIS输出值创建二进制掩码。

greenSegment = getSegmentedImage(重塑(y,[imgRow,imgCol]),cImg);

查看分割后的图像。FIS分类为白色的像素以黑色显示。剩下的像素被归类为绿色。

图imshow (greenSegment)

图中包含一个轴对象。axis对象包含一个image类型的对象。

白色像素部分从边界和球段中移除。绿色部分也不正确地包含了来自球的像素。因此,分类过程需要另一个像素属性,可以识别草地和球之间的区别。

使用纹理的分段图像

为了区分场和球,使用灰度图像梯度数据来识别场和球的纹理。

提取球的代表性子图像,并将绿色、白色和球的子图像转换为灰度。

ballImg = exData.ballImg;grayGrnImg = rgb2gray(grnImg);grayWhtImg = rgb2gray(whtImg);grayBallImg = rgb2gray(ballImg);

方法计算每个子图像的梯度,并将每个像素的梯度幅度归一化normMathelper函数。

[gX,gY] = imgradientxy(grayGrnImg);grngrtexture = normMat(imgradient(gX,gY));[gX,gY] = imgradientxy(grayWhtImg);whtgrtexture = normMat(imgradient(gX,gY));[gX,gY] = imgradientxy(grayBallImg);ballTexture = normMat(imgradient(gX,gY));

查看每个子图像的梯度。

图,subplot(2,3,1) imshow(grnImg) subplot(2,3,2) imshow(whtImg) subplot(2,3,3) imshow(ballImg) subplot(2,3,4) imshow(grnGrsTexture) subplot(2,3,5) imshow(whtGrsTexture) subplot(2,3,6) imshow(ballTexture)

图中包含6个轴对象。坐标轴对象1包含一个image类型的对象。坐标轴对象2包含一个image类型的对象。坐标轴对象3包含一个image类型的对象。Axes对象4包含一个image类型的对象。Axes对象5包含一个image类型的对象。Axes对象6包含一个image类型的对象。

绿草段和白草段的梯度值相似,但与球段的梯度值不同。因此,只使用绿色和球段梯度数据来训练模糊纹理分类器。

构建金融中间人

球场和草地的归一化梯度有不同的模式。要学习这些模式,请创建一个没有规则的三输入一输出Sugeno FIS。对于每个输入和输出变量,包括两个默认的成员函数(mf)。

texturerefisin = sugfis(“NumInputs”3,“NumInputMFs”2,...“NumOutputs”, 1“NumOutputMFs”2,“AddRules”“没有”);

输入变量为三个连续像素指定梯度值。如果第三个像素属于草地,则输出值高;反之,则为低。

火车FIS

从果岭和球区梯度创建训练数据。的getGradientInputDataHelper函数(示例末尾显示)创建一个连续像素值组合的三列数组。

[grsGradRow,grsGradCol] = size(grngrstructure);草的纹理大小[ballGradRow,ballGradCol] = size(ballTexture);%球纹理尺寸trnX = [...getGradientInputData (grnGrsTexture);...3个连续像素的%梯度值getGradientInputData (ballTexture)...3个连续像素的%梯度值];trnY = [...的(grsGradRow * grsGradCol, 1);...%输出高(1)绿色纹理0 (ballGradRow * ballGradCol, 1)...%输出低(1)的球纹理];

输入数据trnXIs有三列表示三个连续像素的梯度值。输出数据trnY是一个列向量,如果第三个像素属于字段纹理,则包含1,否则包含0。

要学习模糊规则,请设置OptimizationType“学习”

选项。OptimizationType =“学习”

火车textureFISIn使用训练数据学习规则。

如果runtunefis rng (“默认”) textureFISOut1 = tunefis(textureFISIn,[],trnX,trnY,options);% #好< UNRCH >其他的textureFISOut1 = exData.textureFISOut1;结束流('学习规则后训练RMSE = %。3 f MPG \ n”...calculateRMSE (textureFISOut1 trnX trnY));
学习规则后的训练RMSE = 0.477 MPG

在学习新规则之后,调优输入和输出MF参数。要获得FIS的可调参数,请使用getTunableSettings函数。

[in,out] = gettunthesettings (textureFISOut1);

要在不学习新规则的情况下调优现有FIS参数,请设置OptimizationType“优化”

选项。OptimizationType =“优化”

使用指定的可调参数、训练数据和调优选项调优FIS参数。

如果runtunefis rng (“默认”) textureFISOut = tunefis(textureFISOut1,[in;out],trnX,trnY,options);textureFISOut。Name =“textureFISOut”其他的textureFISOut = exData.textureFISOut;结束流('调优MF参数后训练RMSE = %。3 f MPG \ n”...calculateRMSE (textureFISOut trnX trnY));
调整MF参数后的训练RMSE = 0.442 MPG

部分图片

使用调谐后的FIS分割原始图像。为此,首先计算图像梯度并提取连续的像素组合。

[gX,gY] = imgradientxy(rgb2gray(cImg));imgTexture = normMat(imgradient(gX,gY));gradInput = getGradientInputData(imgTexture);

使用调优的FIS对每个像素进行分类。

y = evalfis(texturerefisout,gradInput,eoptions);

元素分割图像getSegmentedImagehelper函数。

grassField = getSegmentedImage(重塑(y,[imgRow,imgCol]),cImg);

查看分割后的图像。FIS分类为属于球的像素以黑色显示。其余像素归为字段像素。

图imshow (grassField)

图中包含一个轴对象。axis对象包含一个image类型的对象。

训练后的FIS对草地和球进行分割,分割中错误像素较少。

使用颜色和纹理分割图像

要根据颜色和纹理对像素进行分类,可以组合colorFISOut而且textureFISOut使用层次模糊系统,或FIS树。

为此,首先创建一个具有两个输入和三个输出的Sugeno FIS。第一个输入变量是的输出colorFISOut第二个输入变量是的输出textureFISOut.输出变量是像素属于每个图像段的程度:绿色区域、白色边界和足球。

segFIS = sugfis(“名字”“segFIS”“NumInputs”2,“NumInputMFs”2,...“NumOutputs”3,“NumOutputMFs”2,“AddRules”“没有”);

命名输入变量、输出变量和mf。

segFIS.Inputs(1)。Name =“颜色”;segFIS.Inputs (1) .MembershipFunctions(1)。Name =“白色”;.MembershipFunctions segFIS.Inputs(1)(2)。Name =“绿色”;segFIS.Inputs(2)。Name =“纹理”;segFIS.Inputs (2) .MembershipFunctions(1)。Name =“球”;segFIS.Inputs (2) .MembershipFunctions(2)。Name =“草”;segFIS.Outputs(1)。Name =“新建”;segFIS.Outputs (1) .MembershipFunctions(1)。Name =“低”;.MembershipFunctions segFIS.Outputs(1)(2)。Name =“高”;segFIS.Outputs(2)。Name =“whiteBorder”;segFIS.Outputs (2) .MembershipFunctions(1)。Name =“低”;segFIS.Outputs (2) .MembershipFunctions(2)。Name =“高”;segFIS.Outputs(3)。Name =“soccerBall”;segFIS.Outputs (3) .MembershipFunctions(1)。Name =“低”;segFIS.Outputs (3) .MembershipFunctions(2)。Name =“高”

将以下规则添加到FIS中。

  • 如果像素有一个光滑的球纹理,将足球输出设置为高。

  • 如果像素是白色的,并且具有草纹理,将白色边框输出设置为高。

  • 如果像素是绿色的,并且有草的纹理,并且是绿色的字段输出到高。

规则= [“纹理==球=> greenField=低,whiteBorder=低,足球=高”"color==white & texture==grass => greenField=low, whiteBorder=high, soccer =low""color==green & texture==grass => greenField=high, whiteBorder=low, soccer =low"];segFIS = addRule(segFIS,规则);

的输出创建一个FIS树colorFISOut而且textureFISOut的输入segFIS

fis = [colorFISOut textureFISOut segFIS];Con = [...“colorFISOut / output1”“segFIS /颜色”...“textureFISOut / output1”“segFIS /纹理”...];拳头=拳头树(fis,con);

利用FIS树对图像像素进行分类,分割图像。对于每个分割图像,非黑色像素被分类为段的一部分。

y = evalfis(拳头,[colorInput gradInput],eoptions);greenField = getSegmentedImage(重塑(y(:,1),[imgRow,imgCol]),cImg);whiteBorder = getSegmentedImage(重塑(y(:,2),[imgRow,imgCol]),cImg);足球= getSegmentedImage(重塑(y(:,3),[imgRow,imgCol]),cImg);

查看绿色区域像素。

图imshow(greenField)“绿地”

图中包含一个轴对象。axis对象包含一个image类型的对象。

查看白色边框像素。

xlabel(“白边”

图中包含一个轴对象。axis对象包含一个image类型的对象。

查看足球像素。

图imshow(足球)“足球”

图中包含一个轴对象。axis对象包含一个image类型的对象。

结论

图像片段包含错误的分类。您可以通过使用降噪算法对结果进行后处理来删除许多错误分类的像素,例如形态学操作(imdilateimerodeimopenimclose).例如,使用形态闭合操作来降低绿场分割图像中的噪声。

greenFieldLowNoise = getsegmentedimagclose(重塑(y(:,1),[imgRow,imgCol]),cImg);图imshow (greenFieldLowNoise)

图中包含一个轴对象。axis对象包含一个image类型的对象。

为了提高模糊分类器的性能,可以:

  • 使用更多的训练数据。

  • 学习多个像素的颜色模式,而不是学习单个像素的颜色。

  • 增加梯度特征向量的长度,换句话说,使用超过三个连续像素的梯度值。

  • 在FIS中添加更多的mf进行像素分类。

  • 使用2型FIS。

  • 使用验证公差、较大的窗口大小和较高的k-fold值进行交叉验证。

  • 调优构造的FIS树的参数segFIS

本地函数

函数数据= getColorInputData(img)从图像中创建RGB输入数据用于训练。[row,col,depth] = size(img);数据=零(行*col,深度);Id = 0;I = 1:行J = 1:col id = id + 1;K = 1:深度数据(id, K) = img(i,j, K);结束结束结束结束函数[rmse,actY] = calculateRMSE(fis,x,y)计算FIS输出的均方根误差。指定FIS评估的选项持续的evalOptions如果isempty(evalOptions)“EmptyOutputFuzzySetMessage”“没有”...“NoRuleFiredMessage”“没有”“OutOfRangeInputValueMessage”“没有”);结束评估FISactY = evalfis(fis,x,evalOptions);计算RMSEdel = actY - y;Rmse =√(mean(del.^2));结束函数cImg = getSegmentedImage(y,cImg)通过创建二值图像,使用分类器输出分割图像%,使用0.5阈值。Id = y >= 0.5;Y (id) = 1;Y (~id) = 0;cImg(:,:,1) = cImg(:,:,1).*y;cImg(:,:,2) = cImg(:,:,2).*y;cImg(:,:,3) = cImg(:,:,3).*y;结束函数y = normMat(x)将数组元素归一化到范围[0 1]。TMP = x(:);Mn = min(tmp);Mx = max(tmp);D = (mx-mn);Y = (x-mn);如果D > y = y/ D;结束结束函数数据= getGradientInputData(x)为训练创建梯度输入数据。X = X (:);N = 3;%三个连续的梯度值。数据= 0(长度(x),n);指定完整的输入向量。I = n:length(x) data(I,:) = x(I -n+1: I)';结束%不完整输入向量中缺失元素的近似值。I = n-1:-1:1 right = x(1: I)';M = n - i;左= repmat(右(1),[1 m]);Data (i,:) =[左,右];结束结束函数cImg = getsegmentedimagclose (y,cImg)通过创建二值图像,使用分类器输出分割图像%,使用0.5阈值。Id = y >= 0.5;Y (id) = 1;Y (~id) = 0;Se = strel(“磁盘”1);Y = imclose(Y,se);cImg(:,:,1) = cImg(:,:,1).*y;cImg(:,:,2) = cImg(:,:,2).*y;cImg(:,:,3) = cImg(:,:,3).*y;结束

另请参阅

|||

相关的话题

Baidu
map