<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      高性能計算-NEON-圖像旋轉(zhuǎn)(18)

      1. 目標(biāo):使用 NEON intrinsic 函數(shù),對512*512 png 四通道圖像順時針旋轉(zhuǎn)90度。

      思路: 像素分塊,對塊內(nèi)轉(zhuǎn)置;再水平鏡像。圖像庫使用 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};
                  //儲存數(shù)據(jù): 像素轉(zhuǎn)置、然后水平翻轉(zhuǎn)存儲[i+m][j] -> [j][i+m] -> [j][N-(i+m)-blocksize]
                  //加載塊數(shù)據(jù)
                  for(int m=0;m<blockSize;m++)
                      block.val[m] = vreinterpretq_u32_u8(vld1q_u8(src+((i+m)*w+j)*c));
                  //像素轉(zhuǎn)置
                  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 所以手動交換數(shù)據(jù)
                  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. 測試結(jié)果

      原圖

      image

      旋轉(zhuǎn)后圖像

      image

      posted @ 2024-12-04 22:05  安洛8  閱讀(109)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品高清国产三级囯产AV| 又白又嫩毛又多15p| 国产系列丝袜熟女精品视频 | 中文字幕日本六区小电影| 久久天天躁狠狠躁夜夜躁2012| 久久精品国产一区二区蜜芽| 亚洲成a人片在线观看久| 日本丰满熟妇videossexhd| 老熟妇欲乱一区二区三区| 亚洲国产另类久久久精品黑人 | 中文字幕亚洲综合小综合| 亚洲中文字幕无码一区日日添 | 久久亚洲精品日本波多野结衣| 国产中文三级全黄| 久久精品国产亚洲av亚| 久在线视频播放免费视频| 日韩精品av一区二区三区| 内射中出无码护士在线| 萍乡市| 极品少妇无套内射视频| 午夜成人精品福利网站在线观看| 超碰人人超碰人人| 日韩少妇人妻vs中文字幕| 天堂www在线中文| 国产精品午夜福利免费看| 亚洲中文字幕国产精品| 日本深夜福利在线观看| 少妇高潮水多太爽了动态图| 波多野42部无码喷潮| 国产乱码日韩亚洲精品成人| av日韩精品在线播放| 日本韩无专砖码高清观看| 亚洲国产一区二区三区最新| 亚洲区日韩精品中文字幕| 一区二区三区精品偷拍| 精品视频福利| 精品视频一区二区| 2022最新国产在线不卡a| 一本一道av中文字幕无码| 亚洲国产日韩欧美一区二区三区| 亚洲偷自拍另类一区二区|