Programming Assignment 2: Seam Carving
编程作业二
作业链接:Seam Carving & Checklist
我的代码:SeamCarver.java
问题简介
接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩放的算法(由 Shai Avidan 和 Ariel Shamir 所发表)。概念上,这个算法会找出好几条 seams,而这些 seams 是在照片中最不重要的一连串像素,接着再利用这些 seams,对照片做缩放。如果是要缩小照片,则移除这些 seams,若是放大,则在这些 seams 的位置上,插入一些像素。
这样的技术可以用在 image retargeting,将照片正确且没有扭曲得放在各种大小的屏幕或位置上,比如说,手机、投影幕等等。
摘自维基百科。
举个例子,这是一张需要变窄的照片。
传统的收缩(左)会改变塔的形状,裁剪(右)会让塔变得不完整。
Seam Carving 则可以达到下图的效果。
为了评价像素点的重要性,我们需要个函数计算能量,作业这里使用双梯度(dual-gradient)能量函数。图片里颜色变化区域的像素能量高,像塔和天空间的边界区域,seam carving 就会避免移除这些区域的像素。具体的计算方法和一些约定,参见:Seam Carving,不提。
任务摘要
The SeamCarver API. Your task is to implement the following mutable data type:
public class SeamCarver {
public SeamCarver(Picture picture) // create a seam carver object based on the given picture
public Picture picture() // current picture
public int width() // width of current picture
public int height() // height of current picture
public double energy(int x, int y) // energy of pixel at column x and row y
public int[] findHorizontalSeam() // sequence of indices for horizontal seam
public int[] findVerticalSeam() // sequence of indices for vertical seam
public void removeHorizontalSeam(int[] seam) // remove horizontal seam from current picture
public void removeVerticalSeam(int[] seam) // remove vertical seam from current picture
}
摘自 Seam Carving,这里略去很多细节。
PS:
原本注释较长会跑到下一行,看着很难受,而 Github 默认会有横向滚动条,于是为实现这个滚动条折腾了好久,一度跑偏,未果。最终是直接查看博客页面的审查元素,在博客园设置里的”页面定制 CSS 代码“添加一行代码 pre {white-space: pre;}
即可。。。
问题分析
按 Checklist 里建议的编程步骤,先实现构造器,以及 picture(),width() 和 height() 这些简单的方法,了解下 Picture.java 就好。接着建议我们实现能量函数,有 Checklist 里的提示和测试程序,也没有什么大问题,不用创建 Color 对象的优化也可以有。
到了计算 seams 的方法,Checklist 提示说不要显式地用图片创建图,然后再去跑最短路径算法,而是直接在像素点上进行操作。想了下,没什么头绪,去题目讨论页面寻找灵感。这里的图片像素点和下一行相邻的三个像素点相连,可以看做无环的带权有向图(权重在点上),于是我们按拓扑排序的顺序来放松各个像素点就可以算出 seams。拓扑排序不用特地去算,直接一行一行从左到右遍历下来就好,这里这就是一种拓扑顺序其实。
模仿课程里的实现,来两个辅助数组 distTo[][] 和 edgeTo[][],findVerticalSeams() 不久也本地测试成功。到了实现 findHorizontal() 方法,Checklist 叫我们把图片转置(transpose)一下,就是第一行变第一列,第二行变第二列这样,然后直接用 findVerticalSeams() 找,跑完再把图片转回来。转置的实现没有想到啥好办法,new 一个新的长宽相反的 Picture 对象,再一个个像素点用 Picture.setRGB()。这边的行列和常见的有点不一样,老是报错说数组越界,但最后还是成功跑出来了。反正先跑起来,交上去性能不好的话,再来优化吧。
删除 seams 也没有想到什么好方法,同样地 new 一个长或宽少一个像素点的 Picture 对象,再用 Picture.setRGB() 配置。实现了删除垂直的 seams,水平的一样是将图片转置后跑删除垂直 seams 的方法,然后再把图片转置回来。
本地测试成功,虽然 Checklist 里还有些优化看不懂,但也先交上去看看,不行也能有针对性地进行优化。幸运的是第一次提交就有 99 分,稍作修改就拿到了满分,那还有些优化就不管啦,哈哈哈。
测试结果
Programming Assignment 2: Seam Carving的更多相关文章
- Seam carving 学习笔记
今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的.虽然我自己可能理解的不是很深刻,但是记录下来,总是好的. seam carving直接翻译过来是“线裁剪”的意思.它的主要用途是对 ...
- HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...
- 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 3.Programming Assignment : Planar data classification with a hidden layer
Planar data classification with a hidden layer Welcome to the second programming exercise of the dee ...
- Algorithms: Design and Analysis, Part 1 - Programming Assignment #1
自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...
- Algorithms : Programming Assignment 3: Pattern Recognition
Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...
- 递推DP HDOJ 5092 Seam Carving
题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ...
- hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】
Seam Carving Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- Programming Assignment 2: Randomized Queues and Deques
实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...
- 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 2、编程作业常见问题与答案(Programming Assignment FAQ)
Please note that when you are working on the programming exercise you will find comments that say &q ...
随机推荐
- Debian9安装桌面环境
更新安装源 apt-get update 安装 x-window apt-get install x-window-system-core 安装 gnomeapt-get install gnome- ...
- 转载:BIO | NIO | AIO
http://my.oschina.net/bluesky0leon/blog/132361 也谈BIO | NIO | AIO (Java版) 转载自:zheng-lee博客 发布时间: 201 ...
- (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括
一.Xpath 解析 xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则: nodename :选取此节点的所有子节点 // : ...
- [转]深入Java单例模式
文章从 https://blog.51cto.com/devbean/203501 转载 问题 : doble-check 实现的单例模式有什么缺点 线程安全的单例写法应该是怎么样的 概述 在G ...
- [linux] shell脚本编程-xunsearch安装脚本学习
安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...
- Java调用TSC打印机进行打印
最近项目中用到了打印机,最开始的完全不懂,现在弄好了,所以做了总结,该篇包括后台的调用打印(两种方式)跟前端的js的打印,但是只有IE现在支持打印,而且如果想远程连接打印机,二维码的生成和直接由打印机 ...
- ios开发 学习积累20161027~20161031
前言 学习ios这几天来,总结下,函数的定义,调用.跟其他语言都有一定的区别: 几个特别重要的就是对象的迭代的使用和判断.取随机数.动画的实现及数组的深入研究等等 之前的总结地址 ios开发 学习积累 ...
- Servlet学习系列1
一.引言: 1.什么是Servlet? JavaWeb 开发规范中的一个组成部分. 服务器端的一段小程序(代码) 2.什么是服务器?→ 安装了服务器软件的计算机. 硬件:电脑 --->高性能 ...
- Java基础——面向对象
Hello 大家好,我又来啦,今天我们来说说Java的面向对象. 还记得之前去面试几家公司的实习生职位,大部分面试官都问过我有关面向对象 的问题,不知道以后还会不会问,估计是不会了吧...(:3[▓▓ ...
- PoPo数据可视化周刊第2期
羡辙在bilibili开课啦 就在这个月,不知道是不是受了 @Jannchie见齐 的影响,羡辙竟然在bilibili开授Echarts课程,目前已开课两节. [滚城一团]的 ECharts 训练营 ...