Seam Carving 算法与一般的图像裁剪技术不同,它可以保持图像最具有信息量的部分。
根据提示,我们首先要计算每一个像素的能量值,能量值越高的像素越不可能被作为 Seam 被裁剪。计算能量值使用的函数是 dual-gradient energy
,从图中可以看到,重要信息的边缘基本都是能量较高的点,这是因为根据该函数的定义,重要信息的边缘的点会有非常明显的颜色差异,因此颜色的梯度值比较大。
首先要计算出整个图的能量值,这个只需要按照函数的定义逐步处理就可以了。
private int yielding(Color c1, Color c2) {
// 计算两个颜色的R、G、B差值
int r = (c1.getRed() - c2.getRed());
int g = (c1.getGreen() - c2.getGreen());
int b = (c1.getBlue() - c2.getBlue());
// 代入公式计算结果
return r * r + g * g + b * b;
}
// energy of pixel at column x and row y
public double energy(int x, int y) {
if (x < 0 || x >= width() || y < 0 || y >= height()) {
throw new IllegalArgumentException();
}
// 如果是边界情况,按照定义,能量是 1000
final int DEFAULT_ENERGY = 1000;
if (x == 0 || y == 0 || x ==