Seam carving 学习笔记
今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的。虽然我自己可能理解的不是很深刻,但是记录下来,总是好的。
seam carving直接翻译过来是“线裁剪”的意思。它的主要用途是对图像进行缩放。不同于传统的按比例缩放图像的方式,seam carving的是内容感知的,它充分考虑了图像中像素的重要性,通过删除或增加seam线来实现图像尺寸的调整。它在缩放不是特别大的情况下,能够很好的保护图像中的显著物体。
具体来说,seam carving定义了穿过整幅图像的像素线(即seam),它是由图像中最低能量的像素组成的。如左下图中画出了一个横向的seam和一个纵向的seam。

接下来需要说明的是,seam的形成。seam是有图像中,最不重要的像素组成的。因此,首先要对图像中的像素点的重要性进行定义。给定一幅n x m的图像I,它的能量函数定义为:

在一幅图像中,某一像素点的能量越大,则它也越重要。换言之,像素的能量越小,它在图像中就越不重要。seam线(或缝合线)就是由图像中那些不重要的像素点组成的。
对于上述n x m 的图像I, 一个竖直的seam线定义如下:

这个公式乍看起来很复杂,其实际的意义很容易理解。式中i表示第 i 行,即像素的纵坐标, x(i)表示第 i 行中的某个像素的横坐标值。也就是说,一个竖直的seam线包含 n 行(图像是 n 行乘 m 列的),每行中取出一个像素点。而后面的约束表示的意思是相邻两行的像素点之间是相邻的(八连通领域),这样限制的作用是,去掉seam线之后,画面看起来不会出现很跳跃的感觉,直观表示如下图所示,(i,j)的前一点只能来自(i-1,j-1),(i-1,j),(i-1,j+1)中的某一点。

对于给定的能量函数 e( I ),可以将缝合线的代价函数定义:

当前要选择的缝合线即为代价函数值最小的缝合线。设当前状态下最优的缝合线为 S*:

应当利用动态规划(Dynamic Programming)来求解寻找最低代价的、竖直的、八连通的缝合线上所有像素点的问题。设将当前图像的累积最小能量存储在 M 矩阵里,而将图像的能量函数值存储在 NRG 矩阵里。然后把能量函数 NRG 的首行作为 M 的首行初始值。把当前行的能量函数值加上 M [i 1][ j 1]、M [i 1][ j]和M [i 1][ j1]中的最小值作为 M 下一行的值。通过存储以前计算的结果,可以对缝合线进行多次计算。下面以计算竖直缝合线为例来说明该算法。可以利用下式来填充 M 来计算最优缝合线:

Seam carving 学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- 李洪强iOS开发之OC[017]函数和方法的区别
// // main.m // 15 - 函数和对象的方法的区别 // // Created by vic fan on 16/7/12. // Copyright © 2016年 李洪强. ...
- 【nginx运维基础(3)】Nginx的编译PHP
Apache默认是把PHP作为本身的一个模块(mod_php)来运行的,而Nginx是以FastCGI方式运行的.所以使用Nginx+PHP就是直接配置为FastCGI模式. 安装PHP 下载地址: ...
- 【Linux常识篇(1)】所谓的正向代理与反向代理
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连 ...
- context:component-scan扫描使用上的容易忽略的use-default-filters
问题 如下方式可以成功扫描到@Controller注解的Bean,不会扫描@Service/@Repository的Bean.正确 <context:component-scan base-pa ...
- C++:类的创建
类的创建 #include<iostream> #include<cmath> using namespace std; class Complex //声明一个名为Compl ...
- linux 免交互状态下修改用户密码
当利用某些工具对linux用户进行远程密码更改时,输入[ passwd 用户名 ] 后需要输入两次密码, 但是如果你利用的某些工具无法与linux进行交互的情况下,就没办法变更用户密码了,这个时候可以 ...
- Java对象的序列化(Object Serialization)
先定义两个简单的类: package comm; import java.io.Serializable; import java.util.Date; import java.util.Gregor ...
- JodaTime初体验
前段时间用JDK自带的Calendar类来处理日期,需要获取年.季,月,星期的起始日期,被折腾得要死要活.看了这篇文章 http://www.blogbus.com/dreamhead-logs/22 ...
- TCP protocol
he characteristics of TCP protocol TCP (which means Transmission Control Protocol) is one of the mai ...
- Struts知识问答 分类: 面试 2015-07-10 22:01 4人阅读 评论(0) 收藏
1. 简述Struts框架的初始化流程. 答案: 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-c ...