我在Cocoa Touch中使用vImages,在我的例子中,它基本上是ARGB浮点数组,我需要做一个子采样。使用vImage函数进行低通滤波是没有问题的,但我如何选择2x2像素中的一个(假设我想按因子2进行二次采样)?当然,我可以使用vDSP stride函数,但这只适用于水平子采样,而不适用于垂直子采样。
我希望下面的内容能澄清我打算做的事情。我希望选择所有标有X的像素,如下图所示:
X O X O X O
O O O O O O
X O X O X O
O O O O O O
X O X O X O
O O O O O O但是因为内存是线性的,所以我的数组看起来像这样:
X O X O X O O O O O O O X O X O X O O O O O O O X O X O X O O O O O O O如何以合理的方式执行子采样?
编辑:我正在寻找一种有效的方法来对存储为一维浮点数组(包括负值)的给定位图进行二维下采样。
发布于 2012-08-18 21:30:28
实际情况是,当您进行这种子采样时,实际上并没有什么聪明的事情可以做;跨步内存访问不允许使用很多技巧来加快速度,因此您使用的任何库代码基本上都等同于您可能在几分钟内自己编写的C代码。我将使用一个简单的C实现。
我相信这可以在GPU上相当高效地完成,但除非你的数据已经在GPU上下文中,否则这不会带来性能上的优势。如果您必须首先将数据传输到那里,那么在实际操作中节省的性能成本将会被淹没。
发布于 2012-08-17 07:31:10
我经常这样做--你需要知道图像的宽度。所以你有一个指针,你每隔一个像素取一行,然后你把指针撞成一整行,然后开始每隔一个像素,直到你到了行的末尾,然后再把指针撞整行。
对我来说,我通常将图像渲染到位图上下文中,所以我知道每像素的字节数、以像素为单位的宽度和每行的字节数(用指针表示,但对你来说,它可能只是宽度x字节/像素)。
编辑:对不起,我没听清楚。给定一个x列y行的位图,您将创建一个新的CGBitMapContext,并使用上面的示例获取“每隔一个”像素并将其写入到这个新上下文中。现在你有了第二个位图,如果正是你在问题中想要的像素。有了这个位图,您现在可以应用您想要的任何进一步处理。
发布于 2012-12-01 04:09:56
由于内存是线性的,让我们将源矩阵解释为双宽半高的矩阵:
X O X O X O O O O O O O
X O X O X O O O O O O O
X O X O X O O O O O O O在使用交错复制(stride = 2)后,我们有:
X X X O O O
X X X O O O
X X X O O O然后使用vDSP_mmov将左侧子矩阵复制到结果子矩阵。
对于交错复制(第一阶段)可以使用vDSP_zvmov函数,但它没有针对浮点数进行优化。使用0作为标量参数的vDSP_vsadd可能会运行得更快。
https://stackoverflow.com/questions/11993468
复制相似问题