【问题标题】:Subtracting two images using NEON使用 NEON 减去两个图像
【发布时间】:2013-03-07 02:03:07
【问题描述】:

我正在尝试通过使用 Neon 内在函数作为练习来减去两个图像(灰度),我不知道使用 C 内在函数减去两个向量的最佳方法是什么。

void subtractTwoImagesNeonOnePass( uint8_t *src, uint8_t*dest, uint8_t*result, int srcWidth)
{


    for (int i = 0; i<srcWidth; i++)
    {
        // load 8 pixels
        uint8x8x3_t srcPixels  = vld3_u8 (src);
        uint8x8x3_t dstPixels  = vld3_u8 (src);
        // subtract them
        uint8x8x3_t subPixels =  vsub_u8(srcPixels, dstPixels);
        // store the result
        vst1_u8 (result, subPixels);
        // move 8 pixels
        src+=8;
        dest+=8;
        result+=8;

    }

}

【问题讨论】:

  • 编译后使用objdump 并检查生成的二进制文件的程序集。如果它看起来足够好,那就足够了。
  • @auselen 编译不了,有问题 uint8x8x3_t subPixels = vsub_u8(srcPixels, dstPixels);
  • 如果这些只是灰度图像,那么您不想使用 3 种组件类型和内在函数 - 使用 uint8x16_t 作为您的数据类型,然后使用普通的 16 字节加载和存储。
  • 不要更新问题中的代码以反映我在回答中的内容。它使其他人阅读这个问题感到困惑/毫无意义。

标签: arm neon intrinsics


【解决方案1】:

您似乎使用了错误类型的加载和存储。您是否从三通道示例中复制了此内容?我认为这就是您所需要的:

#include <stdint.h>
#include <arm_neon.h>

void subtractTwoImagesNeon( uint8_t *src, uint8_t*dst, uint8_t*result, int srcWidth, int srcHeight)
{
    for (int i = 0; i<(srcWidth/8); i++)
    {
        // load 8 pixels
        uint8x8_t srcPixels = vld1_u8(src);
        uint8x8_t dstPixels = vld1_u8(dst);
        // subtract them
        uint8x8_t subPixels = vsub_u8(srcPixels, dstPixels);
        // store the result
        vst1_u8 (result, subPixels);
        // move 8 pixels
        src+=8;
        dst+=8;
        result+=8;
    }
}

您还应该检查 srcWidth 是否是 8 的倍数。此外,您需要包含图像的所有行,因为您的代码似乎只处理第一行(也许您知道这一点并且只是减少为简单起见)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2011-04-09
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多