基于Seam Carving实现图像的重定位 附完整代码

news2024/12/26 14:16:21

相比于算法目标的复杂,算法步骤却异常的简单,下面具体介绍利用 SeamCarving 算法进行图像剪裁的步骤:

1.计算图像中每个像素的“重要程度”(能量),生成能量图。在绝大多数情况下,我们可以做出如下假设:像素值变化越剧烈的区域(如边界,角点),是人眼最容易捕捉到的区域,也是图像相对重要的区域。与此相反,像素变化较为平缓的区域,很多情况下使图像中的“背景区域”,是人们很少关注的区域。所以,算法给出一个简易假设:如果一个像素梯度绝对值较大,则该像素重要,算法倾向于保留。而某像素位置的梯度绝对值接近 0,则该像素不重要,算法倾向于删除。因此,某像素的“重要度”(能量)可由以下公式计算得出:

每个像素按照上述公式算出能量值后,构成能量图 E。

  1. 从能量图中找到一条能量累积最小的纵向八连通路径,称之为 Seam。

通常在这个步骤中使用动态规划算法,能够使得算法的时间复杂度从 n3^n

(暴力搜索)降低至 n^22。其核心步骤是构建能量累计图 M,其计算方式如下:

在此同时,记录每一个像素最小能量路径的前置像素。之后,从 M 最后一行找到能量累积最小的像素,从此像素开始,根据前置像素信息回溯到第一行,最终找到一条能量累积最小的纵向连通路径。

3.删除上一步骤中得到的连通路径。

4.重复 1 至 3 步骤,直到删除的列数符合剪裁要求。

5.将图像旋转 90°,重复 1-4 步骤,直到删除的行数符合剪裁要求。

6.将图像旋转回原图方向。对于图像重定向的任务,其核心思路是:首先通过其他方法对原有图像进行等比例放缩(例如双线性插值放大图像),之后在该图像上利用 SeamCarving 进行图像剪裁,即可起到图像重定向的效果。

而对于区域删除的任务,只需要将待删除像素的重要性(能量)特殊标注为 ∞,就能使生成的 Seam 通过待删除区域,不断删除 Seam 直到将目标区域完全删除。同理,对于不想误删的区域,可手动将其重要性(能量)标注为 +∞。

三、算法实现


1. 计算能量图

本次实现选取 Sobel 算子计算像素点的梯度,Sobel 算子形式如下:

该算子与原图像做卷积,可以得出图像每个像素点的梯度,这就构成了算法描述中提到的能量图,其代码实现如下图:

2.计算能量累积图

生成能量累积图过程中值得注意的问题是,计算时需要时刻记录每个像素在其最小能量连通路径中的前置节点,这样方便在找到最小累积值对应的像素之后,回溯找到整条最小能量连通路径。其实现代码如下所示:

3.找出最小能量连通路径并删除这部分

通过上一步骤中生成的前置节点信息 track,回溯找到最小能量的联通路径,最终对其进行删除,其实现代码如下所示:

4.根据目标图片尺寸对原图进行剪裁。

其实现代码如下:

5.图像重定向

实现代码图像的重定向主要针对目标尺寸比原图像尺寸大的情况(若重定向尺寸较原图小,可直接进行图像剪裁)。针对这种情况,首先根据目标尺寸的长宽,适当等比例放大原图像,针对放大后的图像再进行上述的图像剪裁操作,最终完成图像重定向的目标。

6. 区域删除的实现

1)设定某矩形区域能量值为 ∞,并删除一条最小能量连通路径

2)多次删除连通路径,直到指定区域完全被删除

其中值得注意的是,第一个函数是将标定的矩形区域以纵向删除的方式进行去除(一次删除矩形中的一列),而后者则是以横向的方式对选定矩形区域删除(一次删除矩形中的一行)。根据选定目标的不同,两种删除方式得到的结果也有所不同。

四、实验结果与分析


1. 中间结果的可视化

1)原图像读取

2)能量图

3)能量累积图

4)找到最小能量连通路径左边图像中使用红色细线标注(中部偏右),右边图像使用绿色细线标注(靠左部分)。

2.图像剪裁

如上图所示,第一幅图像由 333500 像素剪裁为 333300 像素,第二幅图像由 500*500 像素剪裁为 400450 像素。左半部分均为原图像,右半部分图像则是剪裁后的结果。可以看出在上述两种情况下,剪裁前后图像几乎没有发生扭曲和变形。最重要的是,图像中重要的物体和区域(船、人物等)没有因为长宽比例的变化而发生挤压和拉伸。

对于上述情况,将图像由 500500 像素剪裁至 500350 像素。图像变窄的同时人物面部也发生了可见的扭曲和变形,这是由于人物皮肤区域较为平滑,但其位于图像的前景区域,这种情况下不能仅根据像素梯度判断该像素是是否重要。对于前景比例较大或前景区域较为平滑的图像,SeamCarving 通常会得到不理想的结果,这是算法的重要缺陷之一.

3.图像放缩

这部分内容与上一部分相似,仅放出实验结果:

第一幅图由 333500 像素重定向至 320400 像素,第二幅图由 500500 像素重定向至 550600 像素

4.区域删除

本次实验选取某一矩形区域,对其进行删除。左侧图像中待删除的矩形区域标记有蓝紫色蒙版(远方的小船),右侧图像为删除矩形后的图像:

上述两组删除实例中,前者是纵向删除矩形中的像素(一次删除矩形的一列),后者则是横向删除矩形中的像素。所以删除前后,前一副图像的宽度变窄,而后一幅图像的高度降低。但无论是横向删除还是纵向删除,删除后的图像依然没有发生明显的形变与扭曲,保持着良好的稳定性与可视性。

而在以上两组删除实例中,对于图中人脸嘴唇区域的删除,前者采取了纵向删除的方式,而后者采用了横向删除的方式。可以明显地看出,纵向删除的方式极大地扭曲了人脸图像,而横向删除后的图像看上去则比较自然,甚至产生了人物“抿嘴”的效果。所以,针对不同的图像、不同的待删除区域,应该慎重选择删除的策略。

五、尝试与发现


1.改变像素重要性评价指标

上文图像剪裁第三组实验中,Lena 图像人脸在经过 SeamCarving 剪裁之后,人脸区域发生扭曲,影响了图像的整体观感。这是由于人的皮肤虽然是图像的前景,但其梯度较为平滑,导致了算法的误删。为了解决这个问题,需要让算法更加“智能”地判断像素的“重要性”,所以,本文尝试增加像素的重要性评价指标,结合前景分离的技术(GrabCut),提升前景像素的重要性,最终使得图像剪裁更加“智能”。

GrabCut 是迭代的 GraphCut 算法。该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,能够较为迅速地将图像中的前景和背景分离,该算法为每个像素估计其为前景的概率,根据阈值完成图像的像素级分割。

上图是 GrabCut 对 Lena 图像进行前景分离的结果,可以看到算法把前景中的人像较为完整地保留了下来,背景则以黑色像素替代。但是受限于算法的能力,可以看到分离后的图像仍然带有一些背景信息。

如上图所示,左图为直接利用 SeamCarving 对图像进行剪裁的结果,而右图则是经过 GrabCut 提升前景像素重要性(能量值)后图像剪裁的结果。第一幅图的人像发生了扭曲变形,双眼间距明显变小。而后者能够较为完整地保留图像中的人像,即“重要区域”,删除较多的部分则是图像左半部分的背景。

2. 加速剪裁过程

经过实验,SeamCarving 把一帧 500500 的图像剪裁到 500425 大小需要超过 2 分钟的时间,这样的时间性能还有很大的提升余地。在实验过程中发现,计算能量累积图 M 是占用时间较多的步骤之一,所以为了避免重复计算 M,本文试图根据单次 M 的计算结果删除多条连通路径。这个过程有两种简易的方式实现,下文是对两种方式的实现与探讨:

1.删除一条连通路径周围的像素在绝大多数情况下,连通路径周围的像素与路径上的像素较为相似,通常的能量值也较小。所以第一个思路即对连通路径进行“加粗”,从而一次删除多条路径,如下图所示:

这种方式的弊端显而易见:如果仅删除一条较“窄”的路径,周围像素的色差不会很明显,而删除了较“粗”的路径,图像中容易出现可见色差。

2.利用 M 计算出多条路径其思路如下:根据 M 的计算结果,算法按照能量累积从小到大的顺序,贪心地寻找没有“交叉”的多条路径,结果如下图三条绿色路径所示:

当然,这种方式的弊端也较为明显:为了使路径没有交叉的像素,靠后选择的路径能量累积值可能较大,那条路径很有可能是需要保留的路径。

上图中分别使用三种方式将 500500 的图像剪裁至 500425 像素,三种剪裁方式分别是一次删除单一路径、上述方法一(“粗”路径)以及上述方法二(多条非交叉路径),其中方法一和方法二均一次删除三条路径用以加速算法。总体来说,三种方法的到的结果较为近似,但上述方法一由于删除的路径较“粗”,可以在人脸上看到明显的色差,效果不如其他两种方式。三种方式剪裁的时间分别为:

可以看出,两种改进方式较之原方法,时间性能均提升了 3 倍左右。然而综合来看,两种加速算法都有较大的弊端,而且尽管时间性能成倍提升,也远远不能达到实时运行,这很大程度上受限于动态规划时间复杂度限制,如果要彻底改进 SeamCarving 的时间性能,可能需要改变动态规划这一关键步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【string 类的使用方法(总结)】

1. 为什么学习string类? C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要…

采用NVIDIA Jetson Orin NX 系统的视觉边缘计算机

边缘计算机采用NVIDIA Jetson Orin NX模块化系统和高带宽图像采集卡,用于实时图像采集计算和人工智能处理。虹科的合作伙伴Gidel是一家专注于高速图像采集和处理的以色列科技公司,今天宣布新的NVIDIA Jetson Orin NX™ 16GB模块化系统(SoM)将被添加到Gid…

SpringSecurity配置及使用

Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security 模块,进行少量的配置,即…

什么是渲染农场,渲染农场一般怎么收费?

对于用3D软件创作效果图或影视动画的艺术家们来说,应该对渲染农场并不陌生,但是对于初入CG行业的人来说,看到网上很多人说渲染农场,肯定会疑惑,什么是渲染农场?渲染农场也叫“分布式并行集群计算系统”&…

【6】【vue3+elementplus+springboot】 管理系统 【前后端实践】

第一部分: elementplus官网:一个 Vue 3 UI 框架 | Element Plus (element-plus.org) 1、安装elementplus npm install element-plus --save查看package.json中存在依赖表示成功安装 2、引入elementplus import ElementPlus from element-plus import …

论文解读 - 城市自动驾驶车辆运动规划与控制技术综述 (第5部分,完结篇)

文章目录🚗 V. Vehicle Control(车辆控制)🔴 A. Path Stabilization for the Kinematic Model(基于运动学模型的路径稳定)🟥 1)Pure Pursuit(纯追踪)&#x1…

H3C SecParh堡垒机任意用户登录与远程执行代码漏洞

H3C SecParh堡垒机任意用户登录与远程执行代码漏洞1.H3C SecParh堡垒机任意用户登录漏洞1.1.漏洞描述1.2.漏洞影响1.3.漏洞复现1.3.1.登录页面1.3.2.构建URL1.4.总结2.H3C SecParh堡垒机远程命令执行漏洞2.1.漏洞描述2.2.漏洞影响2.3.漏洞复现2.3.1.登录页面2.3.2.构建URL2.4.总…

python-pptx 操作PPTx幻灯片文件删除并替换图片

python-pptx 操作PPTx幻灯片文件删除并替换图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、原理 通过查找ppt中的图片指纹替换 二、操作流程 原始ppt如下: 根据…

[单片机] MCU串口发送C方案优化

应用场景: 主频不高非操作系统的单片机,需要在while循环中发送 数据到上位机,当数据较长时,会让发送的过程会让其他操作有卡顿感。为了解决这个问题,需采用一种方法:在每次大循环中只发一个字节数据&#x…

HTML5+CSS3(一)-全面详解(学习总结---从入门到深化)

目录 ​编辑 第一个前端程序 学习效果反馈 前端工具的选择与安装 前端常见开发者工具 浏览器 VSCode中文语言包安装: 学习效果反馈 VSCode开发者工具快捷键 VSCode常用快捷键列表 学习效果反馈 HTML5简介与基础骨架 HTML5的DOCTYPE声明 HTML5基本骨架 html…

Linux(CentOS Stream 9)安装MySQL8.0

mysql8下载链接 链接:https://pan.baidu.com/s/1yBCDbDYUmQWjcM1SdS7Xng 提取码:t37m 上传到服务器上并解压 cd /usr/localtar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz解压包重命名为mysql mv mysql-8.0.21-linux-glibc2.12-x86_64 /usr/l…

Linux部署RKNN-toolkit过程以及异常点记录(详细记录)

文章目录Linux部署RKNN-toolkit过程以及异常点记录1.在Linux中安装Miniconda1.1 使用服务器下载Miniconda1.2 安装conda1.3 激活刚安装完成的软件1.4参考博文2.创建并激活Miniconda新环境(rknn)2.1 创建conda环境(命名为rknn)2.2 …

做亚马逊、沃尔玛测评自养号大额、退款一定要解决的几个问题?

大家好我是测评龙哥,今天我跟大家说下做亚马逊、沃尔玛测评自养号、退款、lu货、项目需要用到的防关联、防封号环境的一些底层技术原理。这里讲的内容我相信很少有人能掌握,都是一些比较难的IT术技。 如果你现在准备开始做测评是在了解阶段还是已经在做…

SRM-询报价管理系统搭建指南

1、简介1.1、案例简介本文将介绍,如何搭建SRM-询报价管理。1.2、应用场景企业根据询价需求通知参与报价的供应商,所有供应商会收到通知后进行报价,自动生成了比价数据,企业可参考比价数据对供应商进行选择。2、设置方法2.1、表单搭…

GF_CLR初始用 - 正式版

参照:DeerGF_Wolong框架使用教程 与tackor老哥的踩坑日记所编写,第二次尝试,总结第一次经验重新来。 点击链接加入群聊【Gf_Wolong热更集合】 一. 部署 HybridCLR(Wolong) 环境 首先安装Windows Build Support (IL2CPP)需要完整的克隆项目…

自动驾驶感知——激光雷达物体检测算法

文章目录1. 基于激光雷达的物体检测1.1 物体检测的输入与输出1.2 点云数据库1.3 激光雷达物体检测算法1.3.1 点视图1.3.1.1 PointNet1.3.1.2 PointNet1.3.1.3 Point-RCNN1.3.1.4 3D-SSD1.3.1.5 总结和对比1.3.2 俯视图1.3.2.1 VoxelNet1.3.2.2 SECOND1.3.2.3 PIXOR1.3.2.4 AFDe…

2023年Java学到什么程度可以找工作了?

不管是过去现在还是未来,任何以就业为目的的学习,参考的就业要求最直接的方式就是直接去搜索目标岗位企业的招聘要求。是不是很简单呢!下面是根据Java不同技术层次列举招聘要求:初级Java开发工程师:中级Java开发工程师…

出现这些症状,说明你的免疫力在走下坡路!

这些年免疫力逐渐成为大家关注的重点。随着身边越来越多的人感染,免疫力的强弱影响着每个人身体的恢复情况,好的免疫力就是最有效的药物。免疫力讲究平衡二字,太强、太弱都不好。太强会让机体过于敏感,对非致病因素也发起攻击&…

网络故障监控某小程序延时分析案例

背景 某港口集疏港系统近期出现故障,在凌晨3-5点时段无法上传疫情通勤卡,对港口货物运输带来影响。 该港口已部署NetInside全流量回溯系统,针对本次故障,进行故障定位和原因分析。 分析简介 操作时间:2022年9月8日星…

【C++】C++入门 命名空间 及输入与输出

前言 C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助。 C补充C语言语法的不足,以及对C语言设计不合理的地方进行优化,比如&#x…