Android平台-彩色RGB图像灰度化-neon优化实例解析

Android平台-彩色RGB图像灰度化-neon优化实例解析

2015-03-29

图像的灰度化公式比较简单。

Y = (R * 77 + G * 151 + B * 28 ) / 256

传统的C语言一次处理一个像素点,neon指令可以一次处理8个像素点,下面看看neon优化后的加速效果。


在Android  NDK Samples 中有一个hello-neon的工程,里面有一个滤波器的C代码和neon优化代码时间对比,

这里可以在这个框架上加入RGB灰度化的neon实例。


代码如下:

//image gray sample //NEON优化前的代码 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优化后的代码 void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n) { 	 int i; 	 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); 		   uint8x8_t result;  		   temp = vmull_u8 (rgb.val[0],      rfac);       // vmull_u8 每个字节(8bit)对应相乘,结果为每个单位2字节(16bit) 		   temp = vmlal_u8 (temp,rgb.val[1], gfac);  // 每个比特对应相乘并加上 		   temp = vmlal_u8 (temp,rgb.val[2], bfac);  		   result = vshrn_n_u16 (temp, 8);  // 全部移位8位 		   vst1_u8 (dest, result);   // 转存运算结果 		   src  += 8*3; 		   dest += 8; 	 } }

代码解析:

uint8x8_t 为一个8位的向量,向量的每个元素的数据类型为uint8_t类型,实际上也就是 unsigned char类型

uint16x8_t 为一个8位的向量,向量的每个元素的数据类型为uint16_t类型,实际上也就是 unsigned short类型

vdup_n_u8 装载8位常数向量

uint8x8x3_t 是一个结构定义:

struct int8x8x3_t


int8x8_t val[3];

};

包含了3个int8x8_t数据类型

vmull_u8 每个字节对应相乘

vmlal_u8 乘累加

vshrn_n_u16 

右移操作vst1_u8 数据转存,

从uint8X8_t变为字节流

更多数据类型参看:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348ac/Badcdfad.html


 
     
 
     
 
     
 
     

 
     
 
     

顶部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值