Algorithms, Part II - Week 2 - Seam Carving
这是一个PS里的功能,删去图片中信息量较小的像素,实现改变图片长宽比而不发生扭曲
是否也可以做一个生成新像素的程序呢
分析
分三步
- 计算每个像素能量
- 找出最小能量像素
- 移除最小能量像素
能量计算
这点作业写的很详细,一个叫双梯度能量的函数可供计算
对于像素$(x,y)$,计算它的能量公式为
$$
\sqrt{\Delta_x^2(x, y) + \Delta_y^2(x, y)}
$$
其中
$$
\Delta_x^2(x, y) = R_x(x, y)^2 + G_x(x, y)^2 + B_x(x, y)^2
$$
并且规定边缘像素能量为1000
$R_x(x, y),G_x(x, y),B_x(x, y)$分别为像素的RGB值,用java自带的方法就能得到
寻找最小能量
按照作业思路,实现一个垂直寻找方法和一个倒置方法,这样一来水平寻找方法就是先倒置进行垂直寻找再倒置回来
移除最小能量
同寻找方法思路,实现一个水平移除方法和一个倒置方法
这里要同时移除 color 数据
输出图片
不能每移除一次像素就生成一次图片,可以在构造函数获取Color类型的数据,在移除能量的时候一并移除相关Color,最后才生成图片。
写的时候发现不能用泛型数组真的迷茫,好在RGB可以直接用整形存储,再写一个把 int 转成 RGB 的函数就行
private Color getRGB(int rgb) {
return new Color((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
}
参考
http://coursera.cs.princeton.edu/algs4/assignments/seam.html
http://coursera.cs.princeton.edu/algs4/checklists/seam.html
http://www.jianshu.com/p/24cf792dbef8
https://github.com/nastra/AlgorithmsPartII-Princeton/blob/master/src/SeamCarver.java