游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1986|回复: 1

双三次卷积插值

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2006-1-9 11:56:00 | 显示全部楼层 |阅读模式
最近研究图像插值,可惜不在学校了,找不到资料看,胡乱搞了一个大家帮我看看

我的理解是这样的,对像素周围16个点进行采样

(P11,P12,P13,P14)
(P21,P22,P23,P24)
(P31,P32,P33,P34)
(P41,P42,P43,P44)

先对每行的4个点进行采样一次,

为了方便,我用SIGMA(1,4)表示∑1-4

那么Pi = SIGMA(j=1,4)(S(dxj) * Pij);
其中S(dxj)是一个三角函数的近似值
当|dxj|<1时为1 - 2 * dxj * dxj + | dxj | *  | dxj | * | dxj |;
当|dxj|>=1并且|dxj|<2时为4 - 8 * | dxj |  + 5 * dxj * dxj - | dxj | *  | dxj | * | dxj |;
当|dxj|>=2时为0

又由于dxj = xj - (int)x;
那么我估计上面的公式简化合并后应该是这样的

Pi = dx * (dx * (dx * (Pi4 - Pi3 + Pi2 - Pi1) - Pi4 + Pi3 - 2 * ( Pi2 - Pi1) ) + Pi3 - Pi1) + Pi2;

16个点经过第一次采样后得到4个点

再经过一次采样,把4个点代入上面的公式,得到插值。


不知道我的理解是不是这样

这样只能算是一种双三次插值方法,不知道如何实现双三次锐化和双三次模糊?

欢迎大家指教

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2006-1-9 21:23:00 | 显示全部楼层

Re:双三次卷积插值

static float4x4        tco =
{
        0, A, -2*A, A,
        1, 0, -A-3, A+2,
        0, -A, 2*A+3, -A-2,
        0, 0, A, -A
};

float4 taps(float x)
{
        return mul(tco, float4(1, x, x*x, x*x*x));
}

float4 c3sample(float4 taps, float2 t)
{
        return
                mul(taps,
                        float4x4(
                                tex2D(s0, t-dx),
                                tex2D(s0, t),
                                tex2D(s0, t+dx),
                                tex2D(s0, t+dx+dx)
                        )
                );
}

float4 main_bicubic(float2 tex : TEXCOORD0) : COLOR
{
        // not usable for 1:1 mapping!
        // tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
        // this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
       
        tex -= 0.5*dxdy;
       
        float2 dd = frac(tex * size);

        float4 tx = taps(dd.x);
        float4 c = mul(
                taps(dd.y),
                float4x4(
                        c3sample(tx, tex-dy),
                        c3sample(tx, tex),
                        c3sample(tx, tex+dy),
                        c3sample(tx, tex+dy+dy)
                )
        );

        return c;
}
引自media player classic中的bi-cubic interpolation shader。
其中,-A即为cardinal spline中的tension parameter
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 05:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表