谷歌图像压缩技术RAISR

Posted by DuHuazhen on May 5, 2018

本文是基于ubuntu14.04+python3.5+anaconda+opencv3.1

简介

Google刚刚发布了一种名为RAISR(Rapid and Accurate Super Image Resolution,意为“快速、精确的超级图像分辨率技术”)的图像压缩技术,旨在保存宝贵的数据,而不牺牲照片质量;并在带宽受限的移动设备上提供清晰锐利的图像。 Google声称,该技术可以降低高达75%的带宽,RAISR分析同一图像的低分辨率和高分辨率版本,了解到高分辨率版本出众的原因,然后在低分辨率版本模拟出来。实际上就是使用机器学习创建一个类似Instagram的过滤器,欺骗你的眼睛,让你相信低分辨率与高分辨率图像是一致的。 仔细看了下算法的原理,才发现这个算法的压缩机制主要包括两个部分:

(1)先创建一个低分辨率的图片,保存在hashtable中。

(2)在高低分辨率的成对图片中学习,即先对低分辨率图片应用低功耗的的升采样,然后在升采样图片和高分辨率图片的组合中学习过滤器。

如下这段核心代码可以看到:

mat = cv2.imread("./train/alp2.jpg")
h = np.load("lowR2.npy")

mat = cv2.cvtColor(mat, cv2.COLOR_BGR2YCrCb)[:,:,2]


# 升采样
LR = cv2.resize(mat,(0,0),fx=2,fy=2)

LRDirect = np.zeros((LR.shape[0],LR.shape[1]))
for xP in range(5,LR.shape[0]-6):
    for yP in range(5,LR.shape[1]-6):
        patch = LR[xP-5:xP+6,yP-5:yP+6]

       # 之前保存的方向强度等属性信息
        [angle,strenth,coherence] = hashTable(patch,Qangle,Qstrenth,Qcoherence)
        j = angle*9+strenth*3+coherence
        A = patch.reshape(1,-1)
        t = xP%2*2+yP%2

 过滤器
        hh = np.matrix(h[j,t])
        LRDirect[xP][yP] = hh*A.T

  从上面可以看出,RAISR 的过滤器都是根据图像的边缘特征训练的:亮度和色彩梯度、平实和纹理区域等。这又受到方向(direction,边缘角度)、强度(strength,更锐利的边缘强度更高)和黏性(coherence,一项量化边缘方向性的指标)的影响。

下载源码

https://github.com/duhuazhen/RAISR有一些地方的脚本语言应该是在2.7环境下编译的,因此需要对上述代码中进行相应的修订,https://github.com/ndscigdata/RAISR/tree/master对源码进行了相应的修订

git clone https://github.com/ndscigdata/RAISR/tree/master

依次运行以下命令

python hashTable.py
 python train.py 

 python test.py 

测试结果如下 fig2.png

参考

https://github.com/duhuazhen/RAISR

https://github.com/ndscigdata/RAISR/tree/master