【发布时间】:2015-01-15 15:24:51
【问题描述】:
我有一个大小为 RGB uint8(576,720,3) 的图像,我想将每个像素分类为一组颜色。我已经使用 rgb2lab 从 RGB 空间转换到 LAB 空间,然后删除了 L 层,所以它现在是由 AB 组成的 double(576,720,2)。
现在,我想将其分类为我在另一张图像上训练过的一些颜色,并将它们各自的 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
但是,由于图像分辨率的原因,这非常慢(52 秒),而且我手动循环遍历每个 x 和 y。
是否有一些我可以使用的内置函数来执行相同的工作?必须有。
总结一下:我需要一种分类方法,将像素图像分类到一组已定义的集群中。
【问题讨论】:
-
如果您确实编写了代码,是否对已接受的解决方案与您发布的伪代码的实际代码的运行情况进行了比较?
-
@Divakar 是的,这实际上很有趣。我的第一次尝试:52 秒。我的第一次尝试,但迁移到使用并行计算(4 个池):10 秒。方法#1:0.06 秒。相当惊人。
-
对于方法 2,您也有机会尝试一下吗?很抱歉对这些数字很吵,但这些让我很兴奋:)
-
呵呵,这很酷:) 我真的很喜欢矩阵编程的性能甚至比并行计算好那么多!为了留在内存中,矩阵的大小是否有任何限制?我还没有尝试过方法 #2,但我可以在今天晚些时候尝试一下。
-
使用方法 #1,您很快就会达到内存带宽限制,但使用方法 #2,它应该更适合大数据大小。我很想知道方法 #2 的运行时比较,特别是对于大数据大小,如果您想测试,请告诉我!顺便说一下,我们称之为矢量化的矩阵编程的巨大加速魔法在
bsxfun中发挥了重要作用,这是最通用的矢量化工具!
标签: performance matlab machine-learning classification data-mining