MATLAB中速度高效的分类

我有一张尺寸为RGB uint8(576,720,3)的图像,我希望对每个像素进行颜色分类。我已经使用rgb2lab将图像从RGB颜色空间转换到LAB颜色空间,并移除了L层,现在它是一个double(576,720,2)的AB层数组。

现在,我希望将这些像素分类到我在另一张图像上训练得到的颜色中,并计算了它们的AB表示如下:

Cluster 1: -17.7903  -13.1170Cluster 2: -30.1957   40.3520Cluster 3:  -4.4608   47.2543Cluster 4:  46.3738   36.5225Cluster 5:  43.3134  -17.6443Cluster 6:  -0.9003    1.4042Cluster 7:   7.3884   11.5584

为了将每个像素分类/标记到1到7的簇中,我目前使用以下伪代码进行操作:

clusters;for each x  for each y    ab = im(x,y,2:3);    dist = norm(ab - clusters); // 计算ab与每个簇之间的距离的范数    [~, idx] = min(dist);  endend

然而,由于图像分辨率和手动遍历每个x和y的操作,这个过程非常慢(52秒)。

有没有一些内置函数可以执行相同的任务?一定有这样的函数。

总结:我需要一种分类方法,能够将像素图像分类到已定义的簇集合中。


回答:

方法一

对于一个N x 2大小的点/像素数组,你可以避免使用permute,如Luis的其他解决方案中建议的那样,这可能会稍微减慢速度,采用一种"permute-unrolled"版本,同时让bsxfun针对2D数组而不是3D数组工作,这在性能上肯定会更好。

因此,假设簇按N x 2大小的数组排列,你可以尝试这种基于bsxfun的另一种方法 –

%// 获取a和bim_a = im(:,:,2);im_b = im(:,:,3);%// 获取对应簇ID的最小索引[~,idx]  = min(bsxfun(@minus,im_a(:),clusters(:,1).').^2 + ...    bsxfun(@minus,im_b(:),clusters(:,2).').^2,[],2);idx = reshape(idx,size(im,1),[]);

方法二

你可以尝试另一种方法,利用MATLAB中快速矩阵乘法,并基于这个智能解决方案

d = 2; %// 问题的维度大小im23 = reshape(im(:,:,2:3),[],2);numA = size(im23,1);numB = size(clusters,1);A_ext = zeros(numA,3*d);B_ext = zeros(numB,3*d);for id = 1:d    A_ext(:,3*id-2:3*id) = [ones(numA,1), -2*im23(:,id), im23(:,id).^2 ];    B_ext(:,3*id-2:3*id) = [clusters(:,id).^2 ,  clusters(:,id), ones(numB,1)];end[~, idx] = min(A_ext * B_ext',[],2); %//'idx = reshape(idx, size(im,1),[]); %// 所需的ID

矩阵乘法基于的距离矩阵计算是如何进行的?

让我们考虑两个矩阵AB,我们希望计算它们之间的距离矩阵。为了便于接下来的解释,让我们假设A3 x 2B4 x 2大小的数组,这表明我们正在处理X-Y点。如果AN x 3BM x 3大小的数组,那么它们将是X-Y-Z点。

现在,如果我们要手动计算距离矩阵平方的第一个元素,它将如下所示 –

first_element = ( A(1,1) – B(1,1) )^2 + ( A(1,2) – B(1,2) )^2         

这将是 –

first_element = A(1,1)^2 + B(1,1)^2 -2*A(1,1)* B(1,1)   +  ...                A(1,2)^2 + B(1,2)^2 -2*A(1,2)* B(1,2)    … 方程  (1)

现在,根据我们提出的矩阵乘法,如果你检查前面代码中循环结束后A_extB_ext的输出,它们将如下所示 –

enter image description here

enter image description here

因此,如果你对A_extB_ext的转置进行矩阵乘法,乘积的第一个元素将是A_extB_ext的第一行的元素逐个相乘的和,即这些的和 –

enter image description here

结果将与前面方程 (1)得到的结果相同。这将继续对A的所有元素与B中与A相同列的所有元素进行操作。因此,我们将得到完整的平方距离矩阵。仅此而已!

向量化变体

基于矩阵乘法的距离矩阵计算的向量化变体是可能的,尽管它们没有看到大的性能改进。接下来列出两种这样的变体。

变体一

[nA,dim] = size(A);nB = size(B,1);A_ext = ones(nA,dim*3);A_ext(:,2:3:end) = -2*A;A_ext(:,3:3:end) = A.^2;B_ext = ones(nB,dim*3);B_ext(:,1:3:end) = B.^2;B_ext(:,2:3:end) = B;distmat = A_ext * B_ext.';

变体二

[nA,dim] = size(A);nB = size(B,1);A_ext = [ones(nA*dim,1) -2*A(:) A(:).^2];B_ext = [B(:).^2 B(:) ones(nB*dim,1)];A_ext = reshape(permute(reshape(A_ext,nA,dim,[]),[1 3 2]),nA,[]);B_ext = reshape(permute(reshape(B_ext,nB,dim,[]),[1 3 2]),nB,[]);distmat = A_ext * B_ext.';

因此,这些也可以被视为实验版本。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注