做一个基于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处理图像是比较灵活的,没有条条框框,随心所欲。。。只要抓好几个要点,即流程重点:

  1. 确保图片对象存在并且Processing有权读取
  2. 遍历图片像素,计算处理,把新的结果输出到新图片上
  3. 保存时注意通道的相关细节,还要注意路径、命名等

其他的并没有什么难点。如果想要处理得理想,就得在像素处理模块上下文章,学学图形学,看看卷积、形态学、深度学习等知识!有需要补充的另开篇幅再总结,结束!

基于Processing图像序列处理保存导出的流程梳理的更多相关文章

  1. 基于索引的QA问答对匹配流程梳理

    知识库(主要是标准的QA信息)匹配需求是对已经梳理出的大量标准QA对信息进行匹配,找出最符合用户问题的QA对进行回复,拆分主要的处理流程主要为如下两点: 标准QA信息入库索引: 通过对用户提出的问题进 ...

  2. Java基于注解和反射导入导出Excel

    代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...

  3. 简述基于Struts框架Web应用的工作流程

    简述基于Struts框架Web应用的工作流程 解答:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们 ...

  4. 基于linux与busybox的reboot命令流程分析

    http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...

  5. docker save 保存导出镜像

    Docker保存镜像 tag 镜像 # 镜像打 tag 标签 # docker tag 镜像id/名 新名字 docker tag fce91102e17d tomcat01 commit 镜像 注意 ...

  6. APP测试流程梳理

    APP测试流程梳理 1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试 ...

  7. CMDB04 /流程梳理、cmdb总结

    CMDB04 /流程梳理.cmdb总结 目录 CMDB04 /流程梳理.cmdb总结 1. 流程梳理 1.1 环境 1.2 远程连接服务器 1.3 向服务器上传文件 1.4 运维管理服务器 2. cm ...

  8. Eureka服务端源码流程梳理

    一.简述 spring cloud三步走,一导包,二依赖,三配置为我们简化了太多东西,以至于很多东西知其然不知其所以然,了解底层实现之后对于一些问题我们也可以快速的定位问题所在. spring clo ...

  9. .16-浅析webpack源码之编译后流程梳理

    这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...

随机推荐

  1. 伪静态是什么?伪静态与普通html静态网页区别?

    什么是伪静态,伪静态作用伪静态即是网站本身是动态网页如.php..asp..aspx等格式动态网页有时这类动态网页还跟"?"加参数来读取数据库内不同资料.很典型的案例即是discu ...

  2. C# 学习笔记(三)----- 设备监视 ( System.Management )

    实例:串口监视 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  3. JDBC中的元数据——1.数据库元数据

    package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...

  4. 多线程编程<五>

    1 /** 2 * 中断线程:当线程由于调用sleep(),join(),wait()而暂停时,如果中断它,则会收到一个InterruptedException异常. 3 * 调用Thread.isI ...

  5. 刷题-力扣-1137. 第 N 个泰波那契数

    1137. 第 N 个泰波那契数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-th-tribonacci-number 著作权 ...

  6. REST设计风格:你写的 RESTful API 到第几层了?

    理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...

  7. T-SQL - query01_创建数据库|创建表|添加数据|简单查询

    时间:2017-09-29  整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...

  8. 笔记:如何使用postgresql做顺序扣减库存

    如何使用postgresql做顺序扣减库存 Ⅰ.废话在前面 首先这篇笔记源自于最近的一次需求,这个临时性需求是根据两份数据(库存数据以及出库数据) 算出实际库存给到业务,至于库存为什么不等于剩余库存, ...

  9. SpringMVC-源码-图解

  10. 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器

    wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...