基于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 ...
随机推荐
- javascript,html,正则表达式,邮箱密码验证
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- adobe cc 系列产品更改默认安装路径方法
通过Adobe Creative Cloud 修改 1.在开始菜单中找到图下程序点开,并进行如下操作: 2.点击Apps位置 等待加载出软件,如图下所示. 点击右上角图标,会弹出以下窗口,点击首选项 ...
- 通俗易懂理解——dijkstra算法求最短路径
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 ###基本思想 通过Dij ...
- redisson 分布式加锁
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- vue+cesium初探(一) 加载cesium
参考文章1:https://www.cnblogs.com/laixiangran/p/4984522.html 参考文章2:https://blog.csdn.net/weixin_41940497 ...
- 利用maven构建一个spring mvc的helloworld实例
刚开始学习maven和spring mvc,学的云里雾里的 这里提供一个hello world实例,记录自己的学习之路 首先看maven官网的介绍 Apache Maven is a software ...
- C++ 子类调用父类的方法,静态方法的调用
#include <iostream> class A { public: A(); ~ A(); virtualvoid say() { std::cout << &quo ...
- 【IDE】WebStorm常用快捷键
WebStorm常用快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件. 2. ctrl + j: 输出模板 3. ctrl + b: 跳到变量申明 ...
- JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...
- opencv入门系列教学(四)处理鼠标事件
一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...