编程作业二

作业链接: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. java 初始化顺序问题

    今天在<thinking in java>上面看了关于初始化问题,之前从来都没有深入考虑过,这次算是把它搞明白了,所以记录一下: 这个不是我看到的初始化顺序问题,在网上搜索的时候发现的,感 ...

  2. 仿58同城UITableViewCell动画

    之前看58同城APP有一个页面中Cell依次从右向左移动,今天试着做了下. 在做的过程中也遇到了几个小的问题,也算是注意点吧. 1.Cell出现时每个Cell的动画时间一样,导致没有依次移动的效果. ...

  3. JS实现最小生成树之普里姆(Prim)算法

    最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...

  4. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

  5. MFC—— AfxMessageBox

    AfxMessageBox 错误C2665:   “AfxMessageBox”:   2   个重载中没有一个可以转换所有参数类型 1,楼主发表于:2007-01-01 03:56:34同样的语句, ...

  6. android 加载图片框架--Glide使用详解

    一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...

  7. Best MVC Practices 最佳的MVC实践

    Although Model-View-Controller (MVC) is known by nearly every Web developer, how to properly use MVC ...

  8. [javaSE] 多线程(守护线程)

    我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...

  9. VMwear安装Centos7详细过程

      1.软硬件准备软件:推荐使用VMwear,我用的是VMwear 10镜像:CentOS7   硬件:因为是在宿主机上运行虚拟化软件安装centos,I3CPU双核.硬盘500G.内存4G以上. 2 ...

  10. 【SSH网上商城项目实战24】Struts2中如何处理多个Model请求

       转自: https://blog.csdn.net/eson_15/article/details/51465067 1. 问题的提出 Struts2中如果实现了ModelDriven<m ...