zoukankan      html  css  js  c++  java
  • Programming Assignment 2: Seam Carving

    Programming Assignment 2: Seam Carving

    1. 题目阅读

    这个题是课上讲过的,每次删除能量最小的一条路径。

    Seam Carving是一种图像处理方法。在裁剪图片尺寸的同时,保留图像中最有趣的特征。横向缩减时,删除横向上的最短路径,纵向裁剪时,删除纵向上的最短路径。

    整个方法的流程

    • 符号,图像的像素从0开始计数。 矩阵的二维坐标,第一个表示列,第二个表示行!!!!!
    • 能量计算,计算每个点的能量,越高越重要。这里要实现双梯度能量方程。
    • 接缝识别。找到一条能量最小的接缝,和最短路径方法相似,不同之处在于,权重在顶点,而不在路径;路径从顶到底;图是无环的。每个顶点只与其左下,下方,右下三个顶点连接。
    • 接缝删除。最后一步就是删除接缝上的每一个像素。

    SeamCarver API

    需要实现构造函数,能量计算函数,查找(删除)横向(纵向)的接缝。

    能量计算函数

    需要使用双梯度能量方程。懒得编辑公式,具体计算公式见原网站。根据像素四周的点的RGB值计算

    寻找接缝

    返回一位数组,表示需要删除的像素在每一行的位置。如果有相同的最小能量,只需要返回其中任意一个。

    2.题目分析

    实现顺序:

    1. 读取函数
    2. 能量计算函数
    3. 最短路径查找函数
    4. 删除

    构造函数

    使用algs4提供的picture构造,这里要求是mutate,就不需要再单独拷贝了。然后计算图片的宽和高。

    能量计算函数

    1. 填充边界为1000
    2. 循环计算每个像素的能量,Rx,Gx这些实现为单独的函数

    最短能量

    1. 构造图,因为这里权重在点上,做个转变,认为v到w的edge的权重为v点的权重,这样就可以使用现有的方法了。 2. 为了使用最短路径算法,这里认为顶端的点都连接到一个虚拟起点,权重为0。末端点都连接到一个虚拟终点,权重问0。删除的点权重设置为1000. 自己实现最短路径查找,这个是一个DAG,先拓补排序,然后按照这个顺序找。

    认为第一行为一个点和第二行所有点都相连。最后一个行也是。

    只需要实现一个方向,另一个方向可以先转置矩阵,再用前一个实现。(这样效率低了,但是程序好写,可以想效率高,又优雅的方法)

    这里的具体实现。因为接缝只跟能量矩阵相关,那么构造一个转置的能量矩阵,然后写一个函数,对能量矩阵进行查找。横向和纵向只需要构造不同的能量矩阵,然后传给函数。这样就不需要将图片转置。

    将能量数组用二位数组表示,需要实现能量数组的DFS,求出拓补排序。然后根据拓补排序的顺序,对能量数组进行松弛。然后从最后一行反推回第一行,就是seam。

    删除

    将seam之外的点移动到新的数组,同时将seam之外点的能量移动到新的能量数组,然后重新计算seam上下左右点的能量。

    新建立一个空白图片,将原图片除了删除点之外的都拷贝进去。

  • 相关阅读:
    双机调试环境部署
    VC++中通过MultiByteToWideChar将string|char*转换为wstring|wchar_t*
    Unicode环境下的类型转换
    SQL调优日记之发挥SQL性能与你的写法有关--对比三种方式实现相同功能
    从MS SQL删除大数据说开去
    Microsoft SQL Server Reporting Services (SSRS)报表技巧之在图表中增加参考线
    想个法子找出性能差的SQL
    MS SQL,数据库增长时众多表中谁是你关注的目标
    TSQL 日期处理总结
    投入.NET,我的第一篇BLOG
  • 原文地址:https://www.cnblogs.com/huipengly/p/9884659.html
Copyright © 2011-2022 走看看