讲义链接:http://vision.stanford.edu/teaching/cs131_fall1718/files/08_seam_carving.pdf

图像大小调整

截至上一节,对图像匹配的介绍暂时告一段落。本节将介绍在尽量少地改变图片观感情况下的尺寸调整(resizing)问题,即:
输入图像I: m×n;
输出图像I: m×n,且具有“好”的视觉效果——这里的“好”仅表示具体观感,没有明确的定义(荒谬不荒缪?)。但是有一些要求必须满足:
1. 目标图像中的基本长宽比须满足要求;
2. 一些重要的内容和结构(important content and structures)需要保持;
3. Limit artifact;
虽然评价标准如此主观,但是办法总归是比问题要多的,我们还是可以定义一些用来描述“看起来好”的程度的概念——显著性度量(Saliency Measures)函数E(p): I[0,1].
E(p)对一幅给定图像I中的每一个像素p赋予了相应的能量值E[0,1]。而能量越高,意味着这个像素p越重要。

裂缝切割(Seam Carving)

我们先看该算法用于处理将图像I: m×n转化为图像I: m×nn<n的问题。
第一步:记

E(I)=|Ix|+|Iy|

直觉上,一方面边缘处所包含的信息量更大,另一方面人眼对于边缘也更加敏感,所以对于边缘上的点(导数绝对值最大的点)应当赋予更高的能量值。
第二步:定义裂缝:m维向量SY={sjy}j=1m={(j,y(j))}j=1m,s.t.j,|y(j)y(j1)|1
(另一方向上同理)
第三步:选取裂缝并删除:选取并删去总能量最低的一条裂缝(optimal seam,最优裂缝)S=argminSsSE(s)
为了找到这条optimal seam,下面介绍了基于递归的动态规划算法。

动态规划(dynamic programming)

建立累积能量的递归关系:

M(i,j)=E(i,j)+min[M(i1,j1),M(i1,j),M(i1,j+1)]

对于一个像素能量矩阵E
CS131学习笔记(lecture8)
建立累积能量矩阵M,其第一行为E的第一行,第二行及之后每行元素由递推关系式求得:
CS131学习笔记(lecture8)
然后从M的最后一行开始按照最小的累积能量路径溯回,从而得到seam。
一些思考:
1.运行时间:上述步骤每运行一次,图像缩短一个像素。则从宽度n到宽度n共需要运行nn次。总的时间复杂度为O((nn)mn)
2.图片在上下翻折之后,算法运行结果不变。
3.由于每次裂缝切割都删去了能量值较低的像素,所以随着算法的运行,图像中像素的平均能量是在逐渐增加的。

两个维度的像素调整

有了前述算法,我们直觉上也许会说,那就先横着删,再竖着删呗?这种思想是可以理解的。但是,这是optima吗?答案是不一定。所以动态规划要重出江湖了。
递推关系式:

T(r,c)=min{T(r1,c)+E(sx(Inr1×mc)),T(r,c1)+E(sy(Inr×mc1))}

在这里我们删除的其实是一条从左上角到右下角的路径,每做一次removal,图像在两个维度的size都会减1。
在大部分情况下,上面的这一系列删除算法都是相当有效的,但是也存在一个limitation:这种像素删除算法会破坏图像的结构。
CS131学习笔记(lecture8)
这时我们通过最小化插入能量来实现原图结构的保持。直觉上,每删除一个像素,会存在原本不相邻的像素变得相邻的事发生,由于这个过程会产生图像的结构破坏,所以我们计算所有产生“相邻化“的地方的能量,作为“插入能量“。最后择取最三种选择中“插入能量“最小的方案。
如图,在删除(i,j)像素的上一行像素时有三种选择(i-1,j-1)(i-1,j)(i-1,j+1)。
CS131学习笔记(lecture8)
第一种移除方案中的插入能量为:CL(i,j)=|I(i,j1)I(i,j+1)|+|I(i,j1)I(i1,j)|
第二种移除方案中的插入能量为:CV(i,j)=|I(i,j1)I(i,j+1)|
第三种移除方案中的插入能量为:CR(i,j)=|I(i,j1)I(i,j+1)|+|I(i,j1)I(i1,j)|
则新的累计能量递推关系为:CS131学习笔记(lecture8)
然后按照之前的溯洄方法即可在不破坏原图结构的情况下进行resize。
CS131学习笔记(lecture8)

相关文章: