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、可视化效果
评论(0)
您还未登录,请登录后发表或查看评论