基于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 ...
随机推荐
- Springboot中配置druid
pom文件信息: <!--引入druid数据源--> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> ...
- git推送文件到gitee
注册gitee账号 设置姓名.个人空间地址 点击头像旁边的加号,新建仓库 安装git # 设置姓名和邮箱,姓名是注册gitee时设置的姓名,邮箱是注册gitee的邮箱 git config --glo ...
- JDBC简介及JDBC编写步骤及常见API
JDBC : Java Database Connectivity,Java数据库连接.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. JDBC就像一座桥 ...
- 性能环境之docker操作指南4(全网最全)
容器的常用操作 docker run -i -t /bin/bash 使用image创建container并进入交互模式, login shell是/bin/bash 实例: $ docker ru ...
- FastAPI(1)- 简单介绍
前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...
- Mysql常用sql语句(6)- limit 限制查询结果的条数
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...
- tornado2.2安装教程
最近要用到vxworks 系统,所以避免不了要安装tornado 软件,进行相关的开发. 自己在安装过程中遇到了点点问题,这里记录下来,免得以后再次安装时遇到同样的问题. 1. 首先提供一个tor ...
- 基于Ubuntu18.04一站式部署(python-mysql-redis-nginx)
基于Ubuntu18.04一站式部署 Python3.6.8的安装 1. 安装依赖 ~$ sudo apt install openssl* zlib* 2. 安装python3.6.8(个人建议从官 ...
- 并发容器之ConcurrentMap
一.concurentMap 1.数据结构,分段数组segment不扩容,里面的table扩容,每次翻倍,table中放的是entry链表的头地址: 2.初始化 segment和table的长度都是2 ...
- java9的JShell小工具和编译器两种自动优化
一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先 ...