编程作业二

作业链接: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. linux下perforce(p4)的使用方法和命令

    环境变量: export P4PASSWD=abcdefg export P4CLIENT=dyoldfish.com export P4USER=dyoldfish export P4PORT=19 ...

  2. JDK1.7新特性(4):java语言动态性之反射API

    直接通过一个代码示例来熟悉java中通过反射来对构造函数/域以及方法处理的相关API: package com.rampage.jdk7.chapter2; import java.lang.refl ...

  3. 【TCP协议】MTU和MSS详解

    需要注意的是,区别两种帧封装格式:802标准帧和以太网帧 1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验码.RFC 1042(IEEE 802) 2,RFC ...

  4. 微信WeUI入门2

    引入需要的样式文件 最重要的css文件为 weui.min.css 基本的框架如下: <!DOCTYPE html> <html lang="zh-CN"> ...

  5. C# DateTime类型和sqlserver DateTime精度不同

    在最近的项目中, 有个关于时间的功能.一个请假的时间.前端选择的时候只有日期.所以比如请一天假就是选2017-8-15和2017-8-15,这样算请这一天的假.但是后台存入数据库时我不能就存2017- ...

  6. Tomcat配置连接c3p0连接池

    一.Tomcat配置JNDI资源 JNDI(Java Naming and Directory Interface),Java 命名和目录接口. JNDI的作用就是:在服务器上配置资源,然后通过统一的 ...

  7. BestCoder Round #93

    这么快两天就过去了啊……昨天是April Fool’s Day,但绝对是我过的所有April Fool’s Day里最没意思的一个…… 估计再不写就要忘了……还是写写吧= = 说好7:00到机房,然而 ...

  8. 解析json结构绘制canvas

    在工作中偶尔会遇到绘制转发卡/邀请卡的业务,且这个转发卡/邀请卡的风格会有很多,要求最后生成图片.这时候如果使用一张图片绘制一个canvas,这个工作量会相当大.分析一下转发邀请的内容,会发现所有的里 ...

  9. 【一些简单的jQuery选择器】

    学习[js DOM 编程艺术],最后面有许多jQuery的选择器,每个都动手敲了一遍. jQuery 提供了高级选择器的方法. js获取元素的三个基本方法分别是通过标签名,类名和id,即(getEle ...

  10. 学习servlet心得

    1,关于字符编码问题: // resp.setCharacterEncoding("UTF-8");//这个的作用仅仅只是输出字符,不做格式转换成HTML // resp.setC ...