做一个基于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. mfc HackerTools进程令牌设置为debug权限

    博客园:https://www.cnblogs.com/ndyxb/p/12734717.html 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作, ...

  2. 安装Ubuntu服务器版 + 远程连接ssh +更换阿里云源

    安装Ubuntu服务器版 1.点击 "开启此虚拟机",开始安装. 2.默认选择English,英文版安装,直接按Enter键即可. 3.默认选择"Install Ubun ...

  3. JDK1.5新特性之注解

    时间:2017-1-2 20:14 --注解的概述    注释是给人看的,而注解是给程序(框架)看的.    在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解 ...

  4. JavaWeb之文件上传、下载

    时间:2016-12-17 18:07 --文件上传概述上传不能使用BaseServlet1.文件上传的作用    例如网络硬盘,就是用来上传和下载文件的.2.文件上传对表单的限制    1)必须使用 ...

  5. xv6学习笔记(5) : 锁与管道与多cpu

    xv6学习笔记(5) : 锁与管道与多cpu 1. xv6锁结构 1. xv6操作系统要求在内核临界区操作时中断必须关闭. 如果此时中断开启,那么可能会出现以下死锁情况: 进程A在内核态运行并拿下了p ...

  6. YOLO V3 原理

    基本思想V1: 将输入图像分成S*S个格子,每隔格子负责预测中心在此格子中的物体. 每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率. bbox ...

  7. HCNP Routing&Switching之OSPF LSA类型(二)

    前文我们了解了OSPF的一类.二类.三类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15209829.html:今天我们来聊一聊OSPF的四类和五类L ...

  8. IO流学习笔记(一)之FileWriter与FileReader

    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按照操作数据分为两种:字节流和字符流 流按流向分为:输入流和输出流 输入流和输出流是相对于 ...

  9. [bug]spring项目通过反射测试私有方法时,注入对象异常

    背景 遇到问题:在进行Spring单元测试编写时,发现被测方法是一个私有方法,无法直接通过注入对象调用 解决思路:首先想到通过反射获取该私有方法的访问权限,并传入注入对象,最终调用对象的私有方法. 出 ...

  10. Qt中的Q_PROPERTY宏浅析

    1. Q_PROPERTY Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObj ...