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

作者: _小老虎_ | 来源:发表于2019-09-29 23:14 被阅读0次

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

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)

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

加权平均最终结果公式:

加权平均最终结果公式
  • 我们要做的就是求出权重函数中的参数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)压缩算法三类

    先上一下三中算法对比效果图 image.png 1. 最近邻 就是根据比例算出来在缩放图中的xy在目标图中的xy坐...

  • Kmeans算法原理与应用-RGB图像压缩

    1 kmeans聚类思想 维基百科上的描述对于 X = {x1, x2, ..., xn} n 个观测样本,其中每...

  • 无标题文章

    .nbsp{background:rgb(137,211,250);!important;}.gray{backg...

  • 有关图片压缩整理

    纹理压缩 有损压缩:是指对图像的压缩过程中,算法丢失一部分图像信息,降低了图像的质量,并且这种损失是不可逆的。有损...

  • 校园招聘2017

    网易招聘 图像算法工程师(北京) 岗位描述:1、负责实现并优化编解码及压缩等图像算法;2、负责图像相关的技术、系统...

  • 8、彩色图像处理

    1、MATLAB中彩色图像的表示 RGB图像 令 fR、fG、fB 分别表示三幅 RGB 分量图像。一幅 RGB ...

  • 【DIP】人脸痘斑检测算法

    Tags: DIP 方案1 原图 I rgb2gray 转换到灰度空间 gray 原图转换到hsv空间,提取v空间...

  • RLE压缩算法

    RLE压缩算法形成长度压缩算法,Run Length Encoding. 主要用途:对黑白图像和基于调色板的单调图...

  • Android中RGB_565方式压缩图片详解

    Android压缩图片的方式 质量压缩 采样率压缩 缩放压缩 色彩压缩 RGB_565简介 RGB_565是色彩压...

  • 色彩空间类型转换

    RGB是一种比较常见的色彩空间类型,除此之外还有一些其他的色彩空间,比如常见的包括GRAY色彩空间(灰度图像)、X...

网友评论

    本文标题:关于图像RGB(GRAY)压缩算法三类

    本文链接:https://www.haomeiwen.com/subject/ttbjyctx.html