0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

视频图像三插值方式的结果

新机器视觉 来源:简书 作者:梧桐光影 2021-11-09 15:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在播放视频时,常遇到视频尺寸与画布尺寸不一致的情况。为了让视频按比例填充画布,需要对视频中的每一帧图像做缩放处理。

缩放就是在原图的基础上做插值计算,从而增加或减少像素点的数量。常见的插值方式有最近点插值,线性插值,兰索斯插值

下面简要介绍,并对比三种插值方式的结果。

最近点插值

在一维空间中,最近点插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。计算方式如下:

假设原图为A[aw,ah],宽度为aw,高度为ah。目标图为B[bw,bh],宽度为bw,高度为bh。已知A[aw,ah]的宽度,高度及其中每个点的颜色值,B[bw,bh]中每个点像素值的计算方式如下:

for(int i=0; i<bh; ++i){
    for(int j=0; j<bw; ++j){
        int posX = floor(j/(float)bw * aw + 0.5f);
        int posY = floor(i/(float)bh * ah + 0.5f);
        B[i,j] = A[posY, posX];
    }
}

线性插值

线性插值是以距离为权重的一种插值方式。在一维空间中,假设有点A,B,其距离为LAB。A,B之间任意一点C的值为A*LBC/LAB+B*LAC/LAB。在二维空间中,需要在两个方向上做插值。

已知Q11,Q21,Q12,Q22,计算P点的值时,需要先由Q11和Q21插值得到R1,由Q12和Q22插值得到R2,再由R1和R2插值得到P。


详情可参考:

https://zh.wikipedia.org/wiki/%E5%8F%8C%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC

该方法生成的图像比较平滑

兰索斯插值(lanczos)

一维的线性插值,是在目标点的左边和右边各取一个点做插值,这两个点的权重是由线性函数计算得到。而一维的兰索斯插值是在目标点的左边和右边各取四个点做插值,这八个点的权重是由高阶函数计算得到

详细原理可查阅:

https://en.wikipedia.org/wiki/Lanczos_resampling

二维的兰索斯插值在x,y方向分别对相邻的八个点进行插值,也就是计算加权和,所以它是一个8x8的描述子。

网上目前可找到兰索斯算法有两份:GPUImage和OpenCV。其中GPUImage中是用GLSL实现,其算法有误,并不能得到正确的结果。OpenCV中是用C++实现的CPU端代码。


我参考OpenCV中的实现方式,实现了一份GPU上的兰索斯插值算法,该算法在GPU上运行,并不额外消耗CPU资源。其对应的GLSL为

uniform int ssize;
uniform int tsize;
uniform int flag;
uniform float scale;
uniform sampler2D inputImageTexture;
void interpolateLanczos4(in float fx, inout float rate[8]) {
    const float s45 = 0.70710678118654752440084436210485;
    const float PI = 3.1415926535897932384626433832795;
    float cs[] = float[16]( ,1.0, 0.0, -s45, -s45, 0.0, 1.0, s45, -s45, -1.0, 0.0, s45, s45, 0.0, -1.0, -s45, s45);
    if( fx < 0.0000000001 ) {
        for( int i = 0; i < 8; i++ ) {
            rate[i] = 0.0;
        }
        rate[3] = 1.0;
        return;
    }
    float sum = 0.0;
    float y0 = -(fx+3.0)*PI*0.25;
    float s0 = sin(y0);
    float c0 = cos(y0);
    for(int i = 0; i < 8; i++ ) {
        float y = -(fx+float(3-i))*PI*0.25;
        int index = i*2;
        rate[i] = (cs[index]*s0 + cs[index+1]*c0) g (y*y);
        sum += rate[i];
    }
    sum = 1.0gsum;
    for(int i = 0; i < 8; i++ ) {
        rate[i] *= sum;
    }
}
void main() {
    vec4 fragmentColor = vec4(0);
    float curPos = float(tsize);
    if( flag == 0 ) {
        curPos = fragTexCoord.x * float(tsize);
    } else {
        curPos = fragTexCoord.y * float(tsize);
    }
    float fx = (curPos + 0.5) * scale - 0.5;
    float sx = floor(fx);
    fx -= sx;
    float rate[8];
    interpolateLanczos4(fx, rate);
    for (int i=0; i<8; ++i) {
        float newCoord = (sx + float(i - 3) ) / float(ssize);
        vec2 texCoord;
        if (flag == 0)
            texCoord = vec2(newCoord, fragTexCoord.y);
        else
            texCoord = vec2(fragTexCoord.x, newCoord);
        fragmentColor += texture2D(inputImageTexture, texCoord) * rate[i];
    }
    gl_FragColor = fragmentColor;
}

																											

上述代码需要执行两遍:

第一遍的输入为原图,缩放宽度方向。ssize为原图宽度,tsize为目标图宽度。执行完毕后,把结果存到纹理中,作为第二遍的输入;
第二遍缩放高度方向,ssize为原图高度,tsize为目标图高度。执行完毕后,把结果显示到屏幕上。

结果对比

将上面的对比图放大后可以发现,线性插值的结果较最近点插值更平滑,兰索斯插值的结果较线性插值更清晰。

性能对比

运行环境:iphone5s,ios8.3
运行程序:自研播放器demo


以上三种插值算法渲染每帧图像时,占用CPU时间都是40ms左右。由于这三种算法都是在GPU上实现,其对应的CPU代码相同,结果与预期相符。


占用GPU时间如下所示:

插值方式 最近点插值 线性插值 兰索斯插值
每帧图像平均占用的GPU时间(ms) 6 6 12

兰索斯插值算法占用GPU的平均时间为12ms,是其它两种算法的两倍,由于该算法中shader代码执行了两遍,结果也与预期相符。

由于GPU与CPU是异步执行,大部分视频帧率不超过30,因此GPU上多出的6ms不会造成性能瓶颈。

注:GPUImage中的兰索斯插值实现有误,本文是参考OpenCV实现的。

作者:梧桐光影
链接:https://www.jianshu.com/p/8ae52a88ca61

责任编辑:haq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 视频
    +关注

    关注

    6

    文章

    1999

    浏览量

    74653
  • 图像
    +关注

    关注

    2

    文章

    1096

    浏览量

    42168

原文标题:三种图像插值方式对比

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DAC5681Z 16 位 1.0 GSPS 型数模转换器(DAC)产品手册总结

    滤波器。每个FIR可配置为以下任一格式 低通或高通模式,允许选择更高阶输出的光谱图像。一个芯片 延迟锁环(DLL)通过为LVDS输入
    的头像 发表于 11-21 14:03 442次阅读
    DAC5681Z 16 位 1.0 GSPS <b class='flag-5'>插</b><b class='flag-5'>值</b>型数模转换器(DAC)产品手册总结

    神经网络加速器的双线性插值上采样

    没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波轮廓可能会有一点模糊。 (3)次曲线插方法参数多,计算量比双线性插值要多得多,虽然效果好,但速度较慢。 (4)基于深度学习的上
    发表于 10-29 06:36

    使用Otsu阈值算法将灰度图像

    Otsu 算法是由日本学者OTSU于1979年提出的一种对图像进行二化的高效算法,又称“最大类间方差法”。当我们对一个图象进行二化操作的时候,需要根据一项灰度阈值来判决每个像素点应该被视作纯黑
    发表于 10-28 06:49

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—视频图像处理框架

    创龙科技研发的 TL3588-EVM 评估板依托 RK3588/RK3588J SoC 强大的视频图像处理能力,可满足多场景图像应用需求。为帮助开发者全面了解其视频
    的头像 发表于 10-16 11:45 613次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—<b class='flag-5'>视频</b><b class='flag-5'>图像</b>处理框架

    环直瓷片电容选型需要考虑哪些方面?

    环直瓷片电容作为电子电路中常用的元件,其选型需综合考虑电路需求、产品特性、环境条件及可靠性要求等多方面因素。以下是选型时需重点关注的维度及具体要点: 一、基础参数匹配 1、电容 需求分析:根据
    的头像 发表于 10-14 14:29 270次阅读
    <b class='flag-5'>三</b>环直<b class='flag-5'>插</b>瓷片电容选型需要考虑哪些方面?

    图像采集卡与视频采集卡的主要区别对比

    图像采集卡和视频采集卡的核心区别在于它们的设计目标、处理对象和典型应用场景。尽管名称相似,且有时功能会有重叠(尤其是高端设备),但它们侧重点不同:以下是主要区别:1.处理对象与目标图像采集卡:主要目
    的头像 发表于 06-27 14:42 667次阅读
    <b class='flag-5'>图像</b>采集卡与<b class='flag-5'>视频</b>采集卡的主要区别对比

    基于LockAI视觉识别模块:C++使用图像的统计信息

    )。 COLOR_BGR2GRAY:将BGR图像转换为灰度图像。 返回: 无。最后结果储存在grayImage中。注意: 其中根据不同的转换要求可以使用不同的转换代码,具体如下所示
    发表于 05-08 10:31

    基于LockAI视觉识别模块:C++图像的基本运算

    src, OutputArray dst); 参数: src:输入图像(cv::Mat) dst:输出图像(cv::Mat) 返回结果储存在dst中 2.7
    发表于 05-06 16:56

    基于事件相机的统一帧与自适应去模糊框架(REFID)

    )的解决方案。团队提出了一种基于事件相机的统一帧与自适应去模糊框架(REFID)。该框架基于双向递归网络,结合事件流和图像信息,自适应地融合来自不同时间点的信息,从而能够在模糊的输入帧情况下同步实现
    的头像 发表于 03-14 11:48 1304次阅读
    基于事件相机的统一帧<b class='flag-5'>插</b><b class='flag-5'>值</b>与自适应去模糊框架(REFID)

    如何在USB视频类(UVC)框架中使用EZ-USB™FX3实现图像传感器接口USB视频类(UVC)

    电子发烧友网站提供《如何在USB视频类(UVC)框架中使用EZ-USB™FX3实现图像传感器接口USB视频类(UVC).pdf》资料免费下载
    发表于 02-28 17:36 2次下载

    Discovery4100图像控制,是通过DMD微镜的开关方式还是调整灰度的方式进行图像控制的?

    您好,我们购买一套VIALUX公司的V-7001,用的就是discovery 4100的 芯片,据销售人员跟我们介绍,控制图像方式是改变灰度(微镜的反射率,想了解一下是否可以通过微镜的开关去实现
    发表于 02-26 07:24

    k230如何将yolo分类视频流推理后的视频结果保存到本地?

    请问k230如何将yolo分类视频流推理后的视频结果保存到本地?
    发表于 02-08 08:09

    EE-276:Blackfin处理器上图像处理的视频框架注意事项

    电子发烧友网站提供《EE-276:Blackfin处理器上图像处理的视频框架注意事项.pdf》资料免费下载
    发表于 01-06 14:17 0次下载
    EE-276:Blackfin处理器上<b class='flag-5'>图像</b>处理的<b class='flag-5'>视频</b>框架注意事项

    请问DAC39J84内部方式0吗?

    请问DAC39J84内部方式0吗? 请问2x 4x 8x 16x
    发表于 01-03 06:41

    Teledyne Lecroy示波器算法

    示波器是通过内部硬件ADC对模拟信号采样来获取离散的数据点,然而这些离散的数据点有时难以完整呈现出原始模拟信号的全貌。软件算法的意义就在于,它能够依据特定的数学算法,在已采集的数据点之间插入新的数据点,帮助使用者更好地还原和分析模拟信号的波形。最普遍的
    的头像 发表于 12-24 16:11 1867次阅读