关闭

在Metal上实现对多通道feature map的双线性插值

标签: metal双线性插值
369人阅读 评论(1) 收藏 举报
    kernel void resize_interpolation_array(
                                  texture2d_array<half, access::sample> inTexture [[texture(0)]],
                                  texture2d_array<half, access::write> outTexture [[texture(1)]],
                                  ushort3 gid [[thread_position_in_grid]])
    {
        if (gid.x >= outTexture.get_width() ||
            gid.y >= outTexture.get_height() ||
            gid.z >= outTexture.get_array_size()) return;

        constexpr sampler s(coord::pixel, filter::nearest, address::clamp_to_zero);

        const ushort2 pos = gid.xy;
        const ushort slice = gid.z;

        float scale_x = float(inTexture.get_width())/float(outTexture.get_width());
        float scale_y = float(inTexture.get_height())/float(outTexture.get_height());

        float i = scale_x * float(pos.x+0.5)-0.5; //this is a trick
        float j = scale_y * float(pos.y+0.5)-0.5; //this is a trick
        float i_ceil = ceil(i);
        float i_floor = floor(i);
        float j_ceil = ceil(j);
        float j_floor = floor(j);

        half4 in;
        in = inTexture.sample(s, float2(pos.x    , pos.y    ), slice);

        half4 f00 = inTexture.sample(s,float2(i_floor,j_floor),slice);
        half4 f10 = inTexture.sample(s,float2(i_ceil,j_floor),slice);
        half4 f01 = inTexture.sample(s,float2(i_floor,j_ceil),slice);
        half4 f11 = inTexture.sample(s,float2(i_ceil,j_ceil),slice);

        float4 r1 =(i_ceil-i)*float4(f01) + (i-i_floor)*float4(f11);
        float4 r2 = (i_ceil-i)*float4(f00) + (i-i_floor)*float4(f10);
        float4 out = (j-j_floor)*r1 + (j_ceil -j)*r2;

        outTexture.write(half4(out), gid.xy, gid.z);

    }

Reference:
http://handspeaker.iteye.com/blog/1545126
http://www.cnblogs.com/enigma19971/p/5828447.html
https://en.wikipedia.org/wiki/Bilinear_interpolation

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

双线性插值的图像缩放算法的研究与实现

一、引言 数字图像处理的对象因其涉及到社会的各个领域,倍受到越来越多的关注,而图像缩放作为数字图像处理中的基本操作尤为重要,在社会的很多领域都需要对图像进行放大和缩小。利用VC++的MFC类库中的S...
  • SMF0504
  • SMF0504
  • 2016-05-03 14:13
  • 1822

双线性插值算法原理及其实现

双线性插值原理部分:转自http://handspeaker.iteye.com/blog/1545126 最近在编程时用到了双线性插值算法,对图像进行缩放。网上有很多这方面的资料,介绍的也...
  • xbcReal
  • xbcReal
  • 2016-10-11 11:24
  • 1792

opencl:C++实现双线性插值图像缩放

用OpenCL实现图像缩放代码是比较简单的,因为OpenCL本身就支持双线性插值 下面是kernel代码(从Mali OpenCL SDK 抄来的:/samples/image_scaling/as...
  • 10km
  • 10km
  • 2016-02-27 16:20
  • 2976

双线性插值方法及实现

  • 2014-03-08 21:45
  • 1.86MB
  • 下载

java 图形双线性插值实现伸缩

  • 2009-01-08 11:25
  • 4KB
  • 下载

matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)

需求说明:图像处理FPGA实现前期算法准备 当前算法:已通过matlab验证成功 function scaler_bilinear() %--------------------...
  • Times_poem
  • Times_poem
  • 2016-05-25 16:53
  • 1063

使用双线性插值进行图像放大的实现

原理: 双线性插值 在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。 红色的数据点与待插值得到的绿色点 假如我们想得到未知函数 在...
  • lvyanming
  • lvyanming
  • 2015-03-19 19:27
  • 1883

双线性插值的图像缩放算法的研究与实现

一、引言 数字图像处理的对象因其涉及到社会的各个领域,倍受到越来越多的关注,而图像缩放作为数字图像处理中的基本操作尤为重要,在社会的很多领域都需要对图像进行放大和缩小。利用VC++的MFC类库中的S...
  • kraussyin
  • kraussyin
  • 2012-11-26 15:23
  • 820

雙線性插值(Bilinear interpolation)的圖像拉伸在mobile上面的實現

http://blog.csdn.net/cay22/article/details/5555561  雙線性插值(Bilinear interpolation)的圖像拉伸在mobile上面的實...
  • rocky69
  • rocky69
  • 2012-02-10 08:53
  • 875

雙線性插值(Bilinear interpolation)的圖像旋轉在mobile上面的C++實現

http://blog.csdn.net/cay22/article/details/5555585  雙線性插值(Bilinear interpolation)的圖像旋轉在mobile上面的C...
  • rocky69
  • rocky69
  • 2012-02-10 08:53
  • 1701
    个人资料
    • 访问:182637次
    • 积分:2760
    • 等级:
    • 排名:第15013名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:73条
    文章分类
    最新评论