编程作业二

作业链接: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的更多相关文章

  1. Seam carving 学习笔记

    今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的.虽然我自己可能理解的不是很深刻,但是记录下来,总是好的. seam carving直接翻译过来是“线裁剪”的意思.它的主要用途是对 ...

  2. HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)

    Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...

  3. 课程一(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 ...

  4. Algorithms: Design and Analysis, Part 1 - Programming Assignment #1

    自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...

  5. Algorithms : Programming Assignment 3: Pattern Recognition

    Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...

  6. 递推DP HDOJ 5092 Seam Carving

    题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ...

  7. hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】

    Seam Carving Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  8. Programming Assignment 2: Randomized Queues and Deques

    实现一个泛型的双端队列和随机化队列,用数组和链表的方式实现基本数据结构,主要介绍了泛型和迭代器. Dequeue. 实现一个双端队列,它是栈和队列的升级版,支持首尾两端的插入和删除.Deque的API ...

  9. 课程一(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 ...

随机推荐

  1. 去掉img标签周围的空白

    我们在页面布局的时候,明明已经去掉了所有标签的margin和padding,img标签周围依然会有空白,解决方法有以下几种: 1.给img标签设浮动: img{ float:left; } 2.将im ...

  2. 每天一道leetcode234-回文链表

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 2018. ...

  3. C# 过滤sql特殊字符串方法

    1. /// <summary>    /// 过滤不安全的字符串    /// </summary>    /// <param name="Str" ...

  4. MVC知识点

    一·  MVC MVC设计模式->MVC框架(前端开发框架),asp.net(webform) aspx M:Model (模型,负责业务逻辑处理,比如说去db中获取数据) V:View (视图 ...

  5. [javaSE] 数据结构(二叉树-遍历与查找)

    前序遍历:中,左,右 中序遍历:左,中,右 后序遍历:左,右,中 二叉树查找 从根节点进行比较,目标比根节点小,指针移动到左边 从根节点进行比较,目标比根节点大,指针移动到右边 /** * 前序遍历 ...

  6. poj 2002 Squares 几何二分 || 哈希

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 5749 Descript ...

  7. python 实现websocket

    python中websocket需要我们自己实现握手代码,流程是这样:服务端启动websocket服务,并监听.当客户端连接过来时,(需要我们自己实现)服务端就接收客户端的请求数据,拿到请求头,根据请 ...

  8. Web服务器学习总结(一):web服务器简介

    一.WEB服务器 1.1.WEB服务器简介 1.Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处 ...

  9. bootstrap 中的 iCheck 全选反选功能的实现

    喜欢bootstrap 风格的同学应该知道,iCheck的样式还是很好看的. 官网: http://www.bootcss.com/p/icheck/ 进入正题,iCheck提供了一些方法,可以进行全 ...

  10. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)

    一.文件准备 1.1 文件名称 telegraf-1.2.1_windows_amd64.zip influxdb-1.2.2_windows_amd64.zip grafana-4.2.0.wind ...