FFmpeg与音视频流媒体工程开发相关图形学

关于图像RGB(GRAY)压缩算法三类

2019-09-29  本文已影响0人  _小老虎_

先上一下三中算法对比效果图

image.png

1. 最近邻

就是根据比例算出来在缩放图中的xy在目标图中的xy坐标取整的像素

2.双线性

image.png
如图所示

双线性的原理是利用distance去作为一个权重值,
目标(dst_x,dst_y)的最终结果(rgb)值。
步骤主要是:

# example:
        for d_y in range(dst_h):
            for d_x in range(dst_w):
                s_x = d_x / sizePoint
                s_y = d_y / sizePoint

当然最终得到的目标坐标肯定不是整数

3.双立方

image.png
如图所示

双立方比较繁琐,具体原理是通过周围十六个像素点的加权平均算出来的R0的值。

我们用来计算权重的公式(具体可以看这篇论文Cubic convolution interpolation for digital image processing)

这里的传参其实是距离值 (|x0-x1| = |x|)
当a=0.5时候效果最佳
具体函数 :
image.png
image.png
image.png

加权平均最终结果公式:

加权平均最终结果公式
k_i_0=W(1+u),k_j_0=W(1+v).
k_i_0=W(1+u), k_i_1=W(u), k__i_2=W(1-u), k_i_3=W(2-u);
k_j_0=W(1+v), k_j_1=W(v), k_j_2=W(1-v), k_j_3=W(2-v)
pixelB(X,Y)=pixelA(0,0)k_0_0+pixelA(0,1)k_0_1+…+pixelA(3,3)*k_3_3;
上面的啰嗦一堆懒得打字,下面是我写的函数代码(只放关键部分)
##
# @brief resize2
#
def resize_binary_cubic_interpolation(img=None,sizePoint=1,out_path=None):
    ##
    # BiCubic Function
    #
    def binary_cubic(x):
        CONST_A = -0.5 # 0.5-0.75
        x = np.abs(x) # absolute val

        if x <= 1:
            return (CONST_A+2)*(x**3) - (CONST_A+3)*(x**2) + 1
        elif x > 1 and x < 2:
            return CONST_A*(x**3) - 5*CONST_A*(x**2) + 8*CONST_A*x - 4*CONST_A
        else:
            return 0
    
    ... ...

    ###### do
    ######

    ... ...

    for color_index in range(0,3):
        for d_y in range(dst_h):
            for d_x in range(dst_w):
                s_x = d_x / sizePoint
                s_y = d_y / sizePoint
                print(d_x,d_y)

                x_weight,y_weight = get_weight_x_y(s_x,s_y)
                #print(x_weight)
                #print(y_weight)

                dst_val = 0 # tag val
                for i in range(0,4):
                    for j in range(0,4):
                        add_val = y_weight[i] * x_weight[j] * img[int(s_y+i-1),int(s_x+j-1),color_index] # y,x
                        dst_val = dst_val + add_val

                print("dst_val:",dst_val)
                dst_val = trim_color_val(int(dst_val))
                #print("dst_val2:",dst_val)
                dst_img[d_y,d_x,color_index] = dst_val

    return dst_img
上一篇下一篇

猜你喜欢

热点阅读