1、概述

 Mahalanobis 距离分类广泛用于聚类。该方程有一个协方差矩阵,它作用于类的变化以创建相似性。

        在 Matlab 中,我们有一个函数 'mahal' 可以计算一个点和一个样本子集之间的距离。

        让我们使用 Mahal() 函数对 RGB 图像进行聚类。

        原始图片如下。


2、实现过程
        让我们根据颜色(即 RGB 分量)为图像“flower8.jpg”制作四个簇。

        如图所示,取一小部分黄色花。

         我们将使用该子集的红色、绿色和蓝色分量作为样本。计算该子集的均值和协方差。
现在图像中每个像素的距离是从样本子集中计算出来的。

下图显示了从子集(黄色)计算的图像中每个像素的距离。

同样,蓝色和粉红色的子集也被视为样本,并相应地进行计算。生成相对于子集的最小距离,并用唯一的簇号更新相应的像素位置。

3、参考代码

 matlab参考代码如下

clear all
clc
 
%READ AN RGB IMAGE
A = imread('flower8.png');
 
R = A(:,:,1); %RED COMPONENT
G = A(:,:,2); %GREEN COMPONENT
B = A(:,:,3); %BLUE COMPONENT
 
%PREALLOCATE THE VECTOR
mahal_dist  = zeros([numel(B),4]);
 
 
%CROP THE SMALL SUBSET OF THE YELLOW FLOWER
A1 = imcrop(A,[277 35 10 10]);
subset_R = A1(:,:,1);
subset_G = A1(:,:,2);
subset_B = A1(:,:,3);
 
%CALCULATE MAHALANOBIS DISTANCE FOR THE RED, BLUE AND GREEN COMPONENTS OF THE WHOLE IMAGE AND ALSO THE
%RED,GREEN AND BLUE COMPONENTS OF THE SMALL SUBSET
mahal_dist(:,1) = mahal(double([R(:),G(:),B(:)]),double([subset_R(:),subset_G(:),subset_B(:)])); %Yellow
 
 
%CROP THE SMALL SUBSET OF THE BLUE FLOWER
A1 = imcrop(A,[155 18 10 10]);
subset_R = A1(:,:,1);
subset_G = A1(:,:,2);
subset_B = A1(:,:,3);
 
mahal_dist(:,2) = mahal(double([R(:),G(:),B(:)]),double([subset_R(:),subset_G(:),subset_B(:)])); %Blue
 
 
%CROP THE SMALL PORTION OF THE PINK FLOWER
A1 = imcrop(A,[50 204 10 10]);
 
subset_R = A1(:,:,1);
subset_G = A1(:,:,2);
subset_B = A1(:,:,3);
 
%CALCULATE MAHALANOBIS DISTANCE FOR THE RED, BLUE AND GREEN COMPONENTS OF THE WHOLE IMAGE AND ALSO THE
%RED,GREEN AND BLUE COMPONENTS OF THE SMALL SUBSET
mahal_dist(:,3) = mahal(double([R(:),G(:),B(:)]),double([subset_R(:),subset_G(:),subset_B(:)])); %Pink
 
%CROP THE SMALL SUBSET OF THE OTHER PARTS
A1 = imcrop(A,[187 147 10 10]);
 
subset_R = A1(:,:,1);
subset_G = A1(:,:,2);
subset_B = A1(:,:,3);
 
%CALCULATE MAHALANOBIS DISTANCE FOR THE RED, BLUE AND GREEN COMPONENTS OF THE WHOLE IMAGE AND ALSO THE
%RED,GREEN AND BLUE COMPONENTS OF THE SMALL SUBSET
mahal_dist(:,4) = mahal(double([R(:),G(:),B(:)]),double([subset_R(:),subset_G(:),subset_B(:)]));
 
 
 
%FIND THE MINIMUM VALUE AND GIVE A CLUSTER NUMBER
[val,ind]=min(mahal_dist,[],2);
 
mask = zeros(size(B));
 
for k=1:size(mahal_dist,2)
    mask(ind(:)==k)=k;
end
 
figure, subplot(121),imagesc(A); title('RGB IMAGE'); subplot(122),imagesc(mask);colormap(jet);colorbar;title('CLUSTERS');
 
 
figure,
for k=1:size(mahal_dist,2)
    subplot(2,2,k);
    imshow(uint8(double(A).*logical(mask==k)));
   
end

4、可视化效果