今天首次接触了图像编辑中的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 ...
随机推荐
-
opencv里面CV_32FC1家族
因为总是接触过这样一些#define里面的东西但是总也不知道是干什么用的.而且每看一次梦比一次. 对于这些东西到底是什么的简写根本就不能理解. 原意是跑一下这个例程的: cvRectangle( my ...
-
C#微信开发之旅--准备阶段
最近才开始学微信开发的相关内容,记录下,慢慢的养成习惯! 1.申请公众号: 公众号分为 订阅号 和 服务号.他们之前的区别可以点击这里查看 因为我们是测试的,所以可以直接申请测试帐号,就把所有的功能都 ...
-
Qt通过odbc读取excel数据
传统的读取方式是通过Excel.Application,这种方式不仅操作繁琐,而且速度也不快. 通过odbc读取,可以使用select语句直接读取整个工作表,处理excel数据就跟数据库一样方便. 当 ...
-
国际化标签 <;fmt:bundle>;&;<;fmt:message>;的使用
国际化标签 <fmt:bundle>&<fmt:message>的使用 Message.properties文件: name=www.gis520.com #info= ...
-
Kickstart Round D 2017 problem A sightseeing 一道DP
这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...
-
C#6.0语言规范(三) 基本概念
应用程序启动 具有入口点的程序集称为应用程序.运行应用程序时,会创建一个新的应用程序域.应用程序的几个不同实例可以同时存在于同一台机器上,并且每个实例都有自己的应用程序域. 应用程序域通过充当应用程序 ...
-
JQuery监听页面滚动总结
1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offset().top; 3. ...
-
【Pyton】【小甲鱼】类和对象
一.类 定义一个类,例子如下: class Turtle: #定义一个名为Turtle的类,Python中类型约定以大写字母开头 #属性 color='green' weight=10 legs=4 ...
-
Size类型如何调用和定义
cv::Size sz = cv::Size(PROB_W, PROB_H);//Size(srcimage.cols, srcimage.rows) groundtoimage(xylimit, u ...
-
对于一个web工程,如果我们复制一个已有的工程粘贴到同一个workspace下,我们除了需要更改工程的名字还需要更改这个新工程的content root,否则会报错。
对于一个web工程,如果我们复制一个已有的工程粘贴到同一个workspace下,我们除了需要更改工程的名字还需要更改这个新工程的content root,否则会报错.步骤如下: 右键新的工程---&g ...