久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4997|回復: 1
收起左側

ARM NEON加速引擎 使用C語言實現RGB圖像轉灰度圖

[復制鏈接]
ID:170466 發表于 2017-3-13 22:45 | 顯示全部樓層 |閱讀模式
//使用C語言實現RGB圖像轉灰度圖
//Gray = (R * 77 + G * 151 + B * 28 ) / 256
void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
{
  int i;
  for (i=0; i<n; i++)
  {
    int r = *src++; // load red
    int g = *src++; // load green
    int b = *src++; // load blue

    // build weighted average:
    int y = (r*77)+(g*151)+(b*28);

    // undo the scale by 256 and write to memory:
    *dest++ = (y>>8);
  }
}

//使用NEON Intrinsics優化
void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
{
  int i;
  //讀取8字節的預設值到64位寄存器
  uint8x8_t rfac = vdup_n_u8 (77);// 轉換權值 R
  uint8x8_t gfac = vdup_n_u8 (151);// 轉換權值 G
  uint8x8_t bfac = vdup_n_u8 (28);// 轉換權值 B
  n/=8;

  for (i=0; i<n; i++)
  {
    uint16x8_t  temp;
    uint8x8x3_t rgb  = vld3_u8 (src);//一次讀取3個unit8x8到3個64位寄存器
    uint8x8_t result;

    temp = vmull_u8 (rgb.val[0],      rfac); // temp=rgb.val[0]*rfac
    temp = vmlal_u8 (temp,rgb.val[1], gfac);// temp=temp+rgb.val[1]*gfac
    temp = vmlal_u8 (temp,rgb.val[2], bfac);//temp=temp+rgb.val[2]*bfac

    result = vshrn_n_u16 (temp, 8); // 128位寄存器每16位右移第二個參數位
    vst1_u8 (dest, result); // 轉存運算結果到dest
    src  += 8*3;
    dest += 8;
  }
}

//NEON匯編代碼優化:
static void neon_asm_convert(uint8_t * __restrict dest, uint8_t * __restrict src, int numPixels)
{
  asm volatile("lsr          %2, %2, #3      \n"
               "# build the three constants: \n"
               "mov         r4, #28          \n" // Blue channel multiplier
               "mov         r5, #151         \n" // Green channel multiplier
               "mov         r6, #77          \n" // Red channel multiplier
               "vdup.8      d4, r4           \n"
               "vdup.8      d5, r5           \n"
               "vdup.8      d6, r6           \n"
               ".loop:                       \n"
               "# load 8 pixels:             \n"
               "vld4.8      {d0-d3}, [%1]!   \n"
               "# do the weight average:     \n"
               "vmull.u8    q7, d0, d4       \n"
               "vmlal.u8    q7, d1, d5       \n"
               "vmlal.u8    q7, d2, d6       \n"
               "# shift and store:           \n"
               "vshrn.u16   d7, q7, #8       \n" // Divide q3 by 256 and store in the d7
               "vst1.8      {d7}, [%0]!      \n"
               "subs        %2, %2, #1       \n" // Decrement iteration count
               "bne         .loop            \n" // Repeat unil iteration count is not zero
               :
               : "r"(dest), "r"(src), "r"(numPixels)
               : "r4", "r5", "r6"
               );
}


回復

使用道具 舉報

ID:216667 發表于 2020-3-8 22:54 | 顯示全部樓層
牛逼!牛逼!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女在线一区二区 | 久草新在线 | a免费观看 | 亚洲一区免费视频 | 51ⅴ精品国产91久久久久久 | 亚洲精品2 | 国产精品美女久久久久久免费 | 精品在线一区二区 | 成人在线精品视频 | 美国一级黄色片 | 国产乱码精品1区2区3区 | 成人性生交大片免费看中文带字幕 | 区一区二在线观看 | 国产精品久久久久久婷婷天堂 | 亚洲天堂av在线 | 国产九九九九 | 日本三级全黄三级a | 亚洲电影一级片 | 一区二区三区回区在观看免费视频 | 国产精品嫩草影院精东 | 国产精品日韩欧美一区二区三区 | 欧美精品福利 | av在线免费观看网站 | 欧美成视频| 欧美vide | 特一级毛片 | 久久精品美女 | 日本一区二区高清不卡 | 日韩欧美三级电影 | 久久久久国色av免费观看性色 | 欧美日韩网站 | 超碰av在线 | www日韩 | 中文字幕一区二区三区日韩精品 | 午夜影院在线观看 | 亚洲一区二区国产 | 日韩免费网站 | 精品久| 午夜电影网 | 久操国产 | 亚洲欧美日韩电影 |