基于Processing图像序列处理保存导出的流程梳理
做一个基于processing的图像序列处理保存导出的流程梳理。本案例没有什么实质性的目的,仅为流程梳理做演示。
准备
把需要处理的影像渲染成序列图片,可以在PR中剪辑并导出PNG序列【格式倒是没什么要求,看质量需求,Processing支持的格式都可以,详情请参考这篇:Processing中PImage类和loadImage()、createImage()函数的相关解析】。
其中的命名规则也没有什么特殊要求,在Processing中都可以适应,如下图:

OK!
编写PDE
新建速写本,然后保存项目,把序列图片塞进来,一般放在data文件夹中【PS:不放data也可以,采用绝对路径读取】。一切准备就绪。开始写代码。
首先处理单张图片。这里就一并粘上:
PImage moviePicture; //源影像截图
PGraphics resultPicture; //处理过后的图片
void settings(){
size(500, 500);
}
void setup() {
moviePicture = loadImage("xqdz001.png"); //读取
moviePicture.filter(GRAY); //灰阶操作
resultPicture=createGraphics(moviePicture.width, moviePicture.height); //新建图片
surface.setSize(moviePicture.width*2,moviePicture.height); //为了方便监视,重新分配窗口大小
//frameRate(24);
noLoop(); //因为是单张处理,不用循环
}
void draw() {
resultPicture.beginDraw();
////////////////////////////////////////
// 这一块是重点,核心算法,很清晰的处理方式
// 即遍历每个像素,对比像素信息,然后填充给新的像素块
////////////////////////////////////////
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
color cc = moviePicture.get(i, j);
if (brightness(cc) > 200) { //如果亮度大于200 (区间 0 - 255)
resultPicture.set(i, j, cc);
} else {
color cl=color(0, 0, 0); //没有达到亮度的以黑色填充
resultPicture.set(i, j, cl);
}
}
}
////////////////////////////////////////
resultPicture.endDraw();
image(moviePicture, 0, 0);
image(resultPicture,moviePicture.width,0);
// 有条件可以建立独立窗口监视
resultPicture.save("result.png"); //导出处理后的图片
}
得到结果:

很显然,我的做法是为了提取影像中最亮的像素,即影片中光剑的内容以及各种反光。
接下来
修改代码,使之匹配处理多张图片,即批处理。做法有很多,可以把loadImage读取逻辑、图像处理、保存等过程封装成单独一个个模块,也可以简化一点,直接换字符读取。
PImage moviePicture; //源影像截图
PGraphics resultPicture; //处理过后的图片
int frame = 0; //帧数累计,方便得到图片名字、读取、保存
void settings(){
size(500, 500);
}
void setup() {
moviePicture = loadImage("xqdz"+nf(frame,3)+".png"); //读取
moviePicture.filter(GRAY); //灰阶操作
resultPicture=createGraphics(moviePicture.width, moviePicture.height); //新建图片
surface.setSize(moviePicture.width*2,moviePicture.height); //为了方便监视,重新分配窗口大小
//frameRate(24);
//noLoop(); //因为要批处理了,所以把它关掉
}
void draw() {
resultPicture.beginDraw();
////////////////////////////////////////
// 这一块是重点,核心算法,很清晰的处理方式
// 即遍历每个像素,对比像素信息,然后填充给新的像素块
////////////////////////////////////////
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
color cc = moviePicture.get(i, j);
if (brightness(cc) > 200) {
resultPicture.set(i, j, cc);
} else {
color cl=color(0, 0, 0);
resultPicture.set(i, j, cl);
}
}
}
////////////////////////////////////////
resultPicture.endDraw();
image(moviePicture, 0, 0);
image(resultPicture,moviePicture.width,0);
// 有条件可以建立独立窗口监视
resultPicture.save(dataPath("") + "\\result\\result"+ nf(frame,3)+".png"); //导出处理后的图片,路径为data\result文件夹下
frame ++;
moviePicture = loadImage("xqdz"+nf(frame,3)+".png"); //读取
moviePicture.filter(GRAY); //灰阶操作
}
运行起来便得到结果:

如果你照搬我的写法,哈哈,是有bug的!因为并没有设定取值范围,即超出帧数后,就读不到图片了,会报空指针异常如下:

不过也无所谓,因为这不需要实时运行看结果的,正好自己就结束了,哈哈~~~
正常的做法:
frame ++;
if(frame >= 600)
{
noLoop();
println("Finished!");
exit(); //退出程序
}
很简单的逻辑,超出阈值让它停止并结束。
延伸
上面的结果是不带透明通道的。如果想要光留下高亮部分,其他部分没有信息,可以这么来设定:
resultPicture.beginDraw();
resultPicture.background(0,0); //每次刷新图片,注意`background`函数是可以带alpha通道权重值参数的!
////////////////////////////////////////
// 这一块是重点,核心算法,很清晰的处理方式
// 即遍历每个像素,对比像素信息,然后填充给新的像素块
////////////////////////////////////////
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
color cc = moviePicture.get(i, j);
if (brightness(cc) > 200) {
resultPicture.set(i, j, cc);
} else {
color cl=color(0, 0, 0, 0); //不填充任何颜色信息 ,此句可省略
resultPicture.set(i, j, cl);
}
}
}
////////////////////////////////////////
resultPicture.endDraw;
这样得到的实时监视画面如下:

得到的图片如下:

结语
Processing处理图像是比较灵活的,没有条条框框,随心所欲。。。只要抓好几个要点,即流程重点:
- 确保图片对象存在并且Processing有权读取
- 遍历图片像素,计算处理,把新的结果输出到新图片上
- 保存时注意通道的相关细节,还要注意路径、命名等
其他的并没有什么难点。如果想要处理得理想,就得在像素处理模块上下文章,学学图形学,看看卷积、形态学、深度学习等知识!有需要补充的另开篇幅再总结,结束!
基于Processing图像序列处理保存导出的流程梳理的更多相关文章
- 基于索引的QA问答对匹配流程梳理
知识库(主要是标准的QA信息)匹配需求是对已经梳理出的大量标准QA对信息进行匹配,找出最符合用户问题的QA对进行回复,拆分主要的处理流程主要为如下两点: 标准QA信息入库索引: 通过对用户提出的问题进 ...
- Java基于注解和反射导入导出Excel
代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...
- 简述基于Struts框架Web应用的工作流程
简述基于Struts框架Web应用的工作流程 解答:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们 ...
- 基于linux与busybox的reboot命令流程分析
http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...
- docker save 保存导出镜像
Docker保存镜像 tag 镜像 # 镜像打 tag 标签 # docker tag 镜像id/名 新名字 docker tag fce91102e17d tomcat01 commit 镜像 注意 ...
- APP测试流程梳理
APP测试流程梳理 1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试 ...
- CMDB04 /流程梳理、cmdb总结
CMDB04 /流程梳理.cmdb总结 目录 CMDB04 /流程梳理.cmdb总结 1. 流程梳理 1.1 环境 1.2 远程连接服务器 1.3 向服务器上传文件 1.4 运维管理服务器 2. cm ...
- Eureka服务端源码流程梳理
一.简述 spring cloud三步走,一导包,二依赖,三配置为我们简化了太多东西,以至于很多东西知其然不知其所以然,了解底层实现之后对于一些问题我们也可以快速的定位问题所在. spring clo ...
- .16-浅析webpack源码之编译后流程梳理
这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...
随机推荐
- 伪静态是什么?伪静态与普通html静态网页区别?
什么是伪静态,伪静态作用伪静态即是网站本身是动态网页如.php..asp..aspx等格式动态网页有时这类动态网页还跟"?"加参数来读取数据库内不同资料.很典型的案例即是discu ...
- C# 学习笔记(三)----- 设备监视 ( System.Management )
实例:串口监视 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- JDBC中的元数据——1.数据库元数据
package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...
- 多线程编程<五>
1 /** 2 * 中断线程:当线程由于调用sleep(),join(),wait()而暂停时,如果中断它,则会收到一个InterruptedException异常. 3 * 调用Thread.isI ...
- 刷题-力扣-1137. 第 N 个泰波那契数
1137. 第 N 个泰波那契数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-th-tribonacci-number 著作权 ...
- REST设计风格:你写的 RESTful API 到第几层了?
理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...
- T-SQL - query01_创建数据库|创建表|添加数据|简单查询
时间:2017-09-29 整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...
- 笔记:如何使用postgresql做顺序扣减库存
如何使用postgresql做顺序扣减库存 Ⅰ.废话在前面 首先这篇笔记源自于最近的一次需求,这个临时性需求是根据两份数据(库存数据以及出库数据) 算出实际库存给到业务,至于库存为什么不等于剩余库存, ...
- SpringMVC-源码-图解
- 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器
wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...