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


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

image.png

1. 最近邻

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

2.双线性

image.png
如图所示

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

  • 1 首先根据 dst_width/src_widthdst_height/src_height去算出来具体的缩放比例,
    之后根据这个 resize_rate 去算出来缩放之后的图像的每个坐标(dst_x,dst_y)在 原始图像中对应的坐标R0(src_x,src_y) (如图中的R0)
# 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

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

  • 2 得到目标像素最近的四个坐标P[n] (n=1,2,3,4)
    之后根据P1 P2权重算出来T1的值,P3 P4算出来T2的值,最终通过T1 T2算出来R0的值,就是我们最终的缩放图中(dst_x,dst_y)的值了。

3.双立方

image.png
如图所示

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

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

关于图像RGB(GRAY)压缩算法三类_第1张图片
这里的传参其实是距离值 (|x0-x1| = |x|)

当a=0.5时候效果最佳

具体函数 :
关于图像RGB(GRAY)压缩算法三类_第2张图片
image.png

关于图像RGB(GRAY)压缩算法三类_第3张图片
image.png

关于图像RGB(GRAY)压缩算法三类_第4张图片
image.png

加权平均最终结果公式:

关于图像RGB(GRAY)压缩算法三类_第5张图片
加权平均最终结果公式
  • 我们要做的就是求出权重函数中的参数x,从而获得上面所说的16个像素所对应的系数。
  • 求出a(i,j)对应的系数k_ij。假设行系数为k_i,列系数为k_j。我们以a00位置为例:
    首先,我们要求出当前像素与P点的位置,比如a00距离P(x+u,y+v)的距离为(1+u,1+v)
  • 那么我们可以得到:
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)
  • 这样我们就分别得到了行和列方向上的系数。
    由k_i_j=k_i*k_j我们就可以得到每个像素a(i,j)对应的权值了。

  • 最后通过加权平均算出来R0的结果值:

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

你可能感兴趣的:(关于图像RGB(GRAY)压缩算法三类)