关于图像RGB(GRAY)压缩算法三类
2019-09-29 本文已影响0人
_小老虎_
先上一下三中算法对比效果图
image.png
1. 最近邻
就是根据比例算出来在缩放图中的xy在目标图中的xy坐标取整的像素
2.双线性
image.png
如图所示
双线性的原理是利用distance
去作为一个权重值,
目标(dst_x,dst_y)
的最终结果(rgb)值。
步骤主要是:
- 1 首先根据
dst_width/src_width
和dst_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