NEON优化——OpenCV Resize双线性插值

算法要点

一、基本原理

具体原理可以自行搜索,这里只大致描述一下,目标图像上某一个点按比例映射到原始图像上某一点,不过通常计算得到的原始点坐标不是整数,最近邻的做法是向下取整,而双线性差值的做法是取与该坐标最接近的上下左右四个点来线性加权,在放大的时候不会像最近邻那样锯齿严重,但是计算量会大不少。这里要注意的是加权分为两个维度,横向和纵向。此外,边界的处理也要注意。

二、优化思路

这里核心的优化思路有两点:

  1. 避免重复计算
  2. 浮点转定点

避免重复计算

首先要分析哪里存在可能的重复计算。resize是原始图像和目标图像之间的映射,这个映射不一定是一对一的。比如对于目标图像的高大于原始图像的高的情况,目标图像的多个行可能会映射到原始图像的同一行,这样我们就可以利用之前的计算结果,而不用重复计算。
对于目标图像上的某个点,映射到原始图像的坐标为O,相邻的四个点为ABCD,则目标图像的像素值为val = A(1-fx)(1-fy) + Bfx(1-fy) + C(1-fx)fy + Dfxfy
这个公式可以分解为两个过程:HResize和VResize

HResize

val0 = A(1-fx) + Bfx 
val1 = C(1-fx) + Dfx

VResize

val = val0*(1-fy) + val1*fy

之所以分解为两步,是因为上面提到的当目标图像的多行映射到

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
对于在ARM SIMD NEON上进行resize操作,可以使用NEON指令集中的相关指令来实现。具体的实现方式取决于你要对什么进行resize操作,比如图像、矩阵等。 以下是一个使用NEON指令集进行图像resize的示例代码: ```c #include <arm_neon.h> void resize_neon(unsigned char* src, unsigned char* dst, int src_width, int src_height, int dst_width, int dst_height) { int src_stride = src_width * 4; int dst_stride = dst_width * 4; float x_ratio = (float)src_width / dst_width; float y_ratio = (float)src_height / dst_height; for (int y = 0; y < dst_height; y++) { for (int x = 0; x < dst_width; x++) { float src_x = x * x_ratio; float src_y = y * y_ratio; int src_x_int = (int)src_x; int src_y_int = (int)src_y; float x_diff = src_x - src_x_int; float y_diff = src_y - src_y_int; int src_index = src_y_int * src_stride + src_x_int * 4; uint8x8x4_t src_pixels = vld4_u8(src + src_index); uint8x8_t pixel1 = src_pixels.val[0]; uint8x8_t pixel2 = src_pixels.val[1]; uint8x8_t pixel3 = src_pixels.val[2]; uint8x8_t pixel4 = src_pixels.val[3]; uint8x8_t result_pixel = vqadd_u8(vqadd_u8(vqadd_u8(vqmul_u8(pixel1, vdup_n_u8(255 - x_diff)), vqmul_u8(pixel2, vdup_n_u8(x_diff))), vqmul_u8(pixel3, vdup_n_u8(255 - x_diff))), vqmul_u8(pixel4, vdup_n_u8(x_diff))); vst1_u8(dst + y * dst_stride + x * 4, result_pixel); } } } ``` 这段代码使用NEON指令集中的相关指令来实现图像的resize操作。具体的实现细节包括计算源图像和目标图像的宽高比例,以及使用NEON指令进行像素插值计算。 请注意,这只是一个示例代码,实际的实现方式可能会根据具体的需求和场景有所不同。你可以根据自己的需求进行相应的修改和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值