缝隙裁剪 Seam Carving
主要参考:https://zhuanlan.zhihu.com/p/65339171
如下图所示,改变尺寸中,Seam Carving 相比其他图像缩小方法保留了更多的信息,且维持了主体的比例。Scale 方法会导致目标变形,Crop 方法丢失了图像两边边界区域的内容。
其实很好理解,假设我们现在就只删除一列,crop 方法就是删掉最后一列,但 Seam Carving 的思想是:找到一条最小能量的路径,然后删掉它。如下图的红线:
具体做法也很简单。首先是能量的定义,作者就直接用两个梯度绝对值求和作为一个像素的能量了。那我们就是求下面的公式,其中 s 就表示一条线、e 表示一个点的能量:
这个用动态规划就能做了,假设我们已经确定了第 i 行中要删除的像素是 (i, j)
,那么第 i-1 行中只可能删除 (i-1, j-1)
, (i-1, j)
或者 (i-1, j+1)
中的一个。即动态规划的转移方差就能写出下面这样了,之后就简单求解就可:
那如果是横纵方向都删除呢?最后也是一个动态规划即可。
放大图像
放大图像是逆过程。相当于找一条能量最小的缝隙,然后复制一份即可。但这里有个 trick,如果就用这一条缝隙去拼接最后图像还是不自然(如图 b),应该先找出 k 条能量最低的缝隙,然后反向顺序插入图片中: