Android平台-彩色RGB图像灰度化-neon优化实例解析
2014-12-05 15:31
591 查看
图像的灰度化公式比较简单。
Y = (R * 77 + G * 151 + B * 28 ) / 256
传统的C语言一次处理一个像素点,neon指令可以一次处理8个像素点,下面看看neon优化后的加速效果。
在Android NDK Samples 中有一个hello-neon的工程,里面有一个滤波器的C代码和neon优化代码时间对比,
这里可以在这个框架上加入RGB灰度化的neon实例。
代码如下:
代码解析:
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
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
相关文章推荐
- Android平台-彩色RGB图像灰度化-neon优化实例解析
- Android图像处理实例解析
- 解析C#彩色图像灰度化算法的实现代码详解
- RGB彩色图像灰度化经验公式
- Android平台调用Web Service实例解析
- opencv彩色图像(RGB)转灰度图像及其优化
- -01-RGB彩色图像转换为灰度图像【ARM NEON加速】
- neon优化的yuv420转rgb24汇编代码,iOS/Android可用
- 解析C#彩色图像灰度化算法的实现代码详解
- 在 Android 平台上解析 XML 資料並轉成 DOM
- 图形图像处理-之-彩色转化到灰度的速度优化
- linux的触摸屏之三:解析android平台上的tslib过程
- Android HAL实例解析
- Android HAL实例解析
- Intel平台下Linux中ELF文件动态链接的加载、解析及实例分析(一): 加载
- Intel平台下Linux中ELF文件动态链接的加载、解析及实例分析
- Intel平台下Linux中 ELF文件动态链接的加载、解析及实例分析(一): 加载
- MTD系列 - android平台上linux启动时init进程解析init.rc文件分析
- Android平台下SeeJoPlayer视频播放器(功能介绍及源码解析,附源码)
- Intel平台下Linux中ELF文件动态链接的加载、解析及实例分析