首页 > 其他分享 >高性能计算-NEON-图像旋转

高性能计算-NEON-图像旋转

时间:2024-12-04 22:10:04浏览次数:8  
标签:stb int NEON 高性能 图像 include define

1. 目标:使用 NEON intrinsic 函数,对512*512 png 四通道图像顺时针旋转90度。

思路: 像素分块,对块内转置;再水平镜像。图像库使用 stb img

2. 代码

#include <stdio.h>
#include <arm_neon.h>

#include <stdlib.h>
#define STB_IMAGE_IMPLEMENTATION
#include "./stb/stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "./stb/stb_image_write.h"

// #define DEBUG

int main()
{
    //读取图像
    int w,h,c;
#ifdef DEBUG
    w=h=8;c=4;
    uint8_t* src = (uint8_t*)calloc(w*h*c,1);
    for(int i=0;i<h;i++)
    {
        for(int j=0;j<h*c;j++)
            src[i*h*c+j] = j;
    }
    for(int i=0;i<h;i++)
    {
        for(int j=0;j<w*c;j+=4)
            printf("%u%u%u%u ",*(dst+i*h*c+j),*(dst+i*h*c+j+1),*(dst+i*h*c+j+2),*(dst+i*h*c+j+3));
        printf("\n");
    }
    printf("======\n");
#else
    uint8_t *src = stbi_load("./pic.png",&w,&h,&c,0);
    if(!src)
    {
        printf("load img failed.\n");
        return 0;
    }
    else
        printf("int w %d h %d c %d\n",w,h,c);//512 512 4

#endif

    uint8_t *dst = (uint8_t*)calloc(w*h*c,sizeof(uint8_t));
    int blockSize = 4;// 128/sizeof(src[0][0]);

    for(int i=0;i<h;i+=blockSize)
    {
        for(int j=0;j<w;j+=blockSize)
        {
            uint32x4x4_t block = {0};
            uint32x4x2_t blockTemp = {0};
            //储存数据: 像素转置、然后水平翻转存储[i+m][j] -> [j][i+m] -> [j][N-(i+m)]
            //加载块数据
            for(int m=0;m<blockSize;m++)
                block.val[m] = vreinterpretq_u32_u8(vld1q_u8(src+((i+m)*w+j)*c));
            //像素转置
            blockTemp = vtrnq_u32(block.val[0],block.val[1]);
            block.val[0] = blockTemp.val[0];
            block.val[1] = blockTemp.val[1];
            blockTemp = vtrnq_u32(block.val[2],block.val[3]);
            block.val[2] = blockTemp.val[0];
            block.val[3] = blockTemp.val[1];
            //没有 vtrnq_u64 所以手动交换数据
            blockTemp.val[0] = vreinterpretq_u32_u64(vtrn1q_u64(vreinterpretq_u64_u32(block.val[0]),vreinterpretq_u64_u32(block.val[2])));
            blockTemp.val[1] = vreinterpretq_u32_u64(vtrn2q_u64(vreinterpretq_u64_u32(block.val[0]),vreinterpretq_u64_u32(block.val[2])));
            block.val[0] = blockTemp.val[0];
            block.val[2] = blockTemp.val[1];

            blockTemp.val[0] = vreinterpretq_u32_u64(vtrn1q_u64(vreinterpretq_u64_u32(block.val[1]),vreinterpretq_u64_u32(block.val[3])));
            blockTemp.val[1] = vreinterpretq_u32_u64(vtrn2q_u64(vreinterpretq_u64_u32(block.val[1]),vreinterpretq_u64_u32(block.val[3])));
            block.val[1] = blockTemp.val[0];
            block.val[3] = blockTemp.val[1];

            for(int m=0;m<blockSize;m++)
            {
                block.val[m] = vrev64q_u32(block.val[m]);
                block.val[m] = vcombine_u32(vget_high_u32(block.val[m]),vget_low_u32(block.val[m]));
                //存储
                vst1q_u8(dst+((j+m)*h+(h-i-blockSize))*c,vreinterpretq_u8_u32(block.val[m]));
            }
        }
    }
    #ifdef DEBUG
    for(int i=0;i<w;i++)
    {
        for(int j=0;j<h*c;j+=4)
            printf("%u%u%u%u ",*(dst+i*h*c+j),*(dst+i*h*c+j+1),*(dst+i*h*c+j+2),*(dst+i*h*c+j+3));
        printf("\n");
    }
    free(src);
    #else
    stbi_write_png("pic1.png",h,w,c,dst,h*c);
    stbi_image_free(src);
    #endif
    free(dst);
    return 0;
    
}

3. 测试结果

原图

image

旋转后图像

image

标签:stb,int,NEON,高性能,图像,include,define
From: https://www.cnblogs.com/anluo8/p/18587333

相关文章

  • [C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kern
    在上一篇文章里,给大家讲解了32位图像水平翻转(FlipX)算法,于是本文来探讨更加复杂的24位图像水平翻转算法。本文除了会给出标量算法外,还会给出向量算法。且这些算法是跨平台的,同一份源代码,能在X86(Sse、Avx等指令集)及Arm(AdvSimd等指令集)等架构上运行,且均享有SIMD硬件加速。一、标......
  • [C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kern
    在上一篇文章里,给大家讲解了32位图像水平翻转(FlipX)算法,于是本文来探讨更加复杂的24位图像水平翻转算法。本文除了会给出标量算法外,还会给出向量算法。且这些算法是跨平台的,同一份源代码,能在X86(Sse、Avx等指令集)及Arm(AdvSimd等指令集)等架构上运行,且均享有SIMD硬件加速。一、标......
  • 高清重塑:增大图像分辨率,让图像更清晰!
    ......
  • 下载Adobe Photoshop(PS2024)广泛使用的图像处理软件
    下载链接链接:https://pan.baidu.com/s/1mFbSYBhKOVBbTWHWHKskaA?pwd=86uf提取码:86uf 一、Photoshop功能介绍1.图像编辑与修饰Photoshop最基本的功能就是图像编辑。用户可以使用PS进行图像的裁剪、旋转、调整大小、色彩修正等基本操作。此外,PS提供强大的图像修饰工具......
  • 数字图像空域隐写和分析技术的实现
    目录前言一、LSB顺序隐写二、LSB随机隐写三、抗分析的LSB随机隐写四、卡方分析五、信息估算法分析六、RS分析前言西南科技大学信息隐藏课程作业二,数字图像空域隐写与分析技术的实现。该实验的主要难点在于分析的实现,本人也是到处参考其他人的文章和代码才勉强完成该......
  • 一个简单的图像分类神经网络
     importtorchimporttorch.onnxfromtorchimportnnfromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasetsfromtorchvision.transformsimportToTensorbatch_size=64device="cuda"#这部分代码加载了FashionMNIST数据集,datasets.Fa......
  • 合合信息智能图像处理技术,让你的设备更智能
    最近和一位朋友聊天,听到一些关于打印机的吐槽。从20年开始,部分或者全部远程办公的企业渐渐多起来,wfh的打工人也在家添置了简易的必要办公设备,比如打印机。在家用,自然没有买办公室和打印店那种有扫描台的“大家伙”。但问题来了,手机拍摄的照片没有打印机扫描那么精准,出来的效果也是......
  • Net中使用快速高性能的DX截图
    使用DX获取桌面图像主要有如下5步:1获取适配器;2获取输出;3创建设备;4创建复制输出;5创建图像纹理使用的组件,Opencv使用mat进行分辨率转换压缩 using指令集合usingSystem;usingSystem.Runtime.ExceptionServices;usingSystem.Runtime.InteropServices;usingSystem......
  • 使用ModelArts VS Code插件调试训练ResNet50图像分类模型
    应用场景Notebook等线上开发工具工程化开发体验不如IDE,但是本地开发服务器等资源有限,运行和调试环境大多使用团队公共搭建的CPU或GPU服务器,并且是多人共用,这带来一定的环境搭建和维护成本。因此使用本地IDE+远程Notebook结合的方式,可以同时享受IDE工程化开发和云上资源的即开......
  • 自动化测试工具Ranorex Studio(五十一)-如何做基于图像的自动化
    如何做基于图像的自动化如果Ranorex不能明确地识别某些你的GUI元素,那么使用基于图像的机制来自动化它们将会大有帮助。 C#//Createbitmaptosearchfor//withinapplicationformand//clickitBitmapbmp=Ranorex.Imaging.Load(@”..\..\GreenSeaTurtleSma......