Matlab 中的高效分类

2023-11-25

我有一张尺寸为 RGB 的图像uint8(576,720,3)我想将每个像素分类为一组颜色。我已经使用rgb2lab从RGB空间到LAB空间,然后删除L层,所以现在是double(576,720,2)由AB组成。

现在,我想将其分类为我在另一张图像上训练过的一些颜色,并将它们各自的 AB 表示计算为:

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

现在,为了将每个像素分类/标记为簇 1-7,我当前执行以下操作(伪代码):

clusters;
for each x
  for each y
    ab = im(x,y,2:3);
    dist = norm(ab - clusters); // norm of dist between ab and each cluster
    [~, idx] = min(dist);
  end
end

然而,由于图像分辨率以及我手动循环每个 x 和 y,这非常慢(52 秒)。

我可以使用一些内置函数来执行相同的工作吗?必须有。

总结一下:我需要一种分类方法,将像素图像分类到一组已经定义的簇中。


方法#1

For a N x 2大小的点/像素数组,你可以避免permute正如建议的路易斯的其他解决方案,这可能会减慢速度,有一种"permute-unrolled"它的版本,也让我们bsxfun努力实现2D数组而不是3D数组,性能一定更好。

因此,假设簇被排序为N x 2大小的数组,你可以尝试其他bsxfun基于方法-

%// Get a's and b's
im_a = im(:,:,2);
im_b = im(:,:,3);

%// Get the minimum indices that correspond to the cluster IDs
[~,idx]  = min(bsxfun(@minus,im_a(:),clusters(:,1).').^2 + ...
    bsxfun(@minus,im_b(:),clusters(:,2).').^2,[],2);
idx = reshape(idx,size(im,1),[]);

方法#2

您可以尝试另一种利用的方法fast matrix multiplication in MATLAB并基于这个智能解决方案 -

d = 2; %// dimension of the problem size

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),[]); %// Desired IDs

基于矩阵乘法的距离矩阵计算是怎么回事?

让我们考虑两个矩阵A and B我们要计算他们之间的距离矩阵。为了接下来更容易解释,让我们考虑一下A as 3 x 2 and B as 4 x 2大小的数组,从而表明我们正在处理 X-Y 点。如果我们有A as N x 3 and B as M x 3大小的数组,那么那些将是X-Y-Z points.

现在,如果我们必须手动计算距离矩阵平方的第一个元素,它看起来像这样 –

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)    … Equation  (1)

现在,根据我们提出的矩阵乘法,如果您检查A_ext and B_ext早期代码中的循环结束后,它们将如下所示 –

enter image description here

enter image description here

因此,如果您执行之间的矩阵乘法A_ext并转置B_ext,乘积的第一个元素将是第一行之间的元素乘法之和A_ext and B_ext,即这些的总和 –

enter image description here

结果将与获得的结果相同Equation (1)早些时候。这将继续适用于所有元素A反对所有要素B与在同一列中A。因此,我们最终会得到完整的平方距离矩阵。这就是全部了!

矢量化变体

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

变化#1

[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.';

变化#2

[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.';

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab 中的高效分类 的相关文章

  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • ElasticSearch 匹配多个前缀术语

    我试图为 ElasticSearch 提供一个包含多个术语的查询 然后给出匹配的文档 其中指定的术语位于目标字段中的任何位置 这些术语可以是完整的单词或单词前缀 示例文档 msg 你好 我是一条短信 示例查询字符串 你好消息 你好 和 消息
  • 为什么直接内存“数组”的清除速度比通常的 Java 数组慢?

    我建立了一个 JMH 基准来衡量什么会更快Arrays fill与空 System arraycopy从空数组中 将 DirectByteBuffer 归零或将unsafe内存块试图回答这个问题question https stackove
  • 按类型进行弹簧接线比按名称接线要慢很多

    在我的项目中 我试图迁移 Foo foo Foo beanFactory getBean name into Foo foo beanFactory getBean Foo class 好处是显而易见的 类型安全 更少复杂的代码 更少无用的
  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 我们可以使用什么方法来重塑非常大的数据集?

    当由于非常大的数据计算将花费很长时间并且因此我们不希望它们崩溃时 事先知道要使用哪种重塑方法是很有价值的 Lately methods for reshaping data have been further developed regar
  • matlab中的正则逻辑回归代码

    我正在尝试正则化 LR 在 matlab 中使用以下公式很简单 成本函数 J theta 1 m sum y i log h x i 1 y i log 1 h x i lambda 2 m sum theta j 梯度 J theta t
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • 如何在 python 中使用 libSVM 计算精度、召回率和 F 分数

    我想计算precision recall and f score using libsvm在Python中 但我不知道如何 我已经发现这个网站 http www csie ntu edu tw cjlin libsvmtools eval
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • .NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效的实现

    考虑到入队和出队操作的速度同样重要 NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效 就速度而言 的实现是什么 UniqueQueue是一个不可能出现重复的队列 因此 如果我将一个元素推送到队
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 在Python列表中交换元素的最快方法

    在Python中交换两个列表元素是否有比 L a L b L b L a 或者我必须求助于Cython http cython org or Weave http www scipy org Weave或类似的 看起来 Python 编译器
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • ROC曲线和libsvm

    给定一条 ROC 曲线plotroc m see here http www csie ntu edu tw cjlin libsvmtools roc curve for binary svm 理论问题 如何选择要使用的最佳阈值 编程问题
  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • 是否可以提高 Mongoexport 速度?

    我有一个 1 3 亿行的 MongoDB 3 6 2 0 集合 它有几个简单的字段和 2 个带有嵌套 JSON 文档的字段 数据以压缩格式 zlib 存储 我需要尽快将其中一个嵌入字段导出为 JSON 格式 然而 mongoexport 需

随机推荐

  • RDF 词汇和谓词

    我正在尝试将一些数据转换为 RDF 格式 我能够使用 dc 和 foaf 类型创建基本本体 问题是 对于更复杂的本体 我需要一些更具体的谓词 我正在寻找一些更具体的词汇表 但我不确定词汇表的含义 它只是一个 URI 可能是某个网站 其中包含
  • AWS 上的 Kubernetes HTTP 到 HTTPS 重定向,使用 ELB 终止 SSL

    我正在尝试为流向 Kubernetes 集群的流量设置一个简单的 HTTP 到 HTTPS 重定向 SSL 终止发生在 ELB 上 当我尝试使用nginx ingress kubernetes io ssl redirect true它会导
  • CAS AD LDAP 32 错误

    当我尝试使用 CAS 登录时 我看到了这一点 CAS 通过 LDAP 对 AD 进行身份验证 SEVERE Servlet service for servlet cas threw exception javax naming NameN
  • 如何使用自定义键盘扩展插入 NSAttributedString?

    我想使用键盘扩展以一些自定义字体编写文本 因为这些应用程序 1 2 3 4 是做 我知道我们如何在文档代理中插入普通字符串 self textDocumentProxy insertText mystring 我尝试过插入NSAttribu
  • 清理 HTML 输入

    我正在考虑添加一个富文本编辑器 以允许非程序员更改文本的外观 然而 一个问题是 如果标记不正确 则可能会扭曲所呈现页面的布局 什么是清理 html 的轻量级好方法 您必须在优质和轻量级之间做出选择 推荐的选择是 HTMLPurifier 因
  • 使用 Discord.js 发送消息

    我正在尝试制作一个 Discord 机器人 但我不太理解 Discord js 我的代码如下所示 client on message function message if message content ping client messa
  • 如何在.net中检测麦克风的声音

    我目前有代码来创建位于可用空间中的网络摄像头 并根据我通过按键盘上的按键设置的标志自动向上或向下移动 我希望能够做到这一点 以便如果在麦克风上检测到声音 高于某个阈值 这样它就不会只是拾取噪音 那么该标志就会设置为 true 如果声音停止
  • 如何找出.NET 4中实体框架中的字段最大长度?

    根据this问题是 EF v1 中没有内置方法来计算字段的长度 有没有built in在 NET 4 附带的实体框架中执行此操作的方法 如果是这样 如何实现 EF 4 0 中没有新的方法来访问属性的长度 您仍然需要遍历元数据 如图所示在您引
  • 在 Python 2.6 中使用 unicode_literals 有什么问题吗?

    我们已经让我们的代码库在 Python 2 6 下运行 为了准备 Python 3 0 我们开始添加 from future import unicode literals 进入我们的 py文件 当我们修改它们时 我想知道是否还有其他人这样
  • R Shiny:单击按钮上传文件

    我知道网络上已经有很多材料可以回答我的问题 但似乎没有一个对我有用 我想那是因为我不太了解 Shiny 的响应式编程 因此 我希望创建一个界面 让用户使用以下命令选择文件fileInput只需单击 上传 按钮即可上传 我尝试了来自各个论坛的
  • 在 asp.net 中只能将 ScriptManager 的一个实例添加到页面中

    当我尝试添加用户控件时出现此错误 只能将 ScriptManager 的一个实例添加到页面中 Code ascx
  • web2py数据库中的表示格式

    db define table person Field name format name s 这个格式在这里有什么作用 The format参数用于确定如何显示引用 person 表的其他表中的字段 例如 如果您定义 db define
  • 字符串在 Java 源代码中何时何地初始化/存储?

    这是我的源代码 public class Koray public static void main String args System out println This is a sample program 当我编译它时 我得到了字节
  • 如何在node.js中实现登录验证

    我有这个节点服务器正在运行 var server http createServer function request responsehttp if request method POST var body request on data
  • 如何测试类型是否是匿名的? [复制]

    这个问题在这里已经有答案了 我有以下方法将对象序列化为 HTML 标记 我只想在类型不是匿名的情况下执行此操作 private void MergeTypeDataToTag object typeData if typeData null
  • 从映射驱动器或共享文件夹运行 .NET 程序

    我编写了一个 C Windows 窗体应用程序 用于将一台计算机上的远程文件夹 源 文件夹是映射驱动器 Z folder 中的文件和文件夹与另一台计算机上的另一个远程文件夹 目标 合并文件夹是共享文件夹的 UNC 路径 computerna
  • 为什么我们总是喜欢在SQL语句中使用参数?

    我对数据库工作非常陌生 现在我可以写了SELECT UPDATE DELETE and INSERT命令 但我见过很多论坛 我们更喜欢这样写 SELECT empSalary from employee where salary salar
  • 如何将文件从远程服务器中的目录 A 移动到目录 B?

    我正在使用 JSch 连接到由 GWT 制作的网站中的 SFTP 我读过一个小例子sftpChannel get sftpChannel rename sftpChannel rm 但我没有找到从远程服务器复制文件的解决方案a目录到远程服务
  • 无法在此事件处理程序中执行操作

    我正在尝试从 DataGridView 中删除一行我使用两种类型的指令 A VouchersDGV Rows Clear B If Not DGV Rows RowIndex IsNewRow Then DGV Rows RemoveAt
  • Matlab 中的高效分类

    我有一张尺寸为 RGB 的图像uint8 576 720 3 我想将每个像素分类为一组颜色 我已经使用rgb2lab从RGB空间到LAB空间 然后删除L层 所以现在是double 576 720 2 由AB组成 现在 我想将其分类为我在另一