激光雕刻优化:利用RLE压缩技术提高雕刻效率与节省能源成本

news/2024/5/20 8:27:25

激光雕刻

  • 什么是 RLE ?
  • RLE 在激光雕刻应用
  • 实现代码:
  • 总结

什么是 RLE ?

RLE 是 Run-Length Encoding(游程长度编码)的缩写。这是一种数据压缩技术,它通过减少连续重复的数据来减小文件的大小。RLE 在图像处理、无损压缩和数据传输等领域中都有广泛应用。基本上,RLE 将连续相同的数据值(或称为“游程”)替换为一个值和一个计数值的组合。这样的编码在一些情况下非常有效,特别是当数据中存在大量重复的连续值时。

在图像处理和存储中,RLE 可以用于将图像数据编码为更紧凑的格式,从而节省存储空间并加快数据传输速度。

例如,考虑一个简单的黑白图像,其中大部分区域都是连续的白色像素。在没有压缩的情况下,每个像素都需要单独存储其值,这会占用大量空间。但是,如果使用 RLE,可以将连续的白色像素游程编码为一个值(表示白色)和一个计数值(表示连续的像素数量),从而实现数据压缩。

假设有一行像素数据:FFFFFFBBBBBFFFFFFFFF. 在 RLE 编码下,这行像素可以表示为 6F5B10F,其中 6F 表示连续的六个白色像素,5B 表示连续的五个黑色像素,10F 表示连续的十个白色像素。

通过这种方式,可以大大减小图像的存储空间,特别是对于包含大量相同值的图像。在传输或存储图像时,RLE 编码可以在保持图像质量的同时显著减少所需的存储空间或传输带宽。

RLE 在激光雕刻应用

在激光雕刻应用中,RLE(Run-Length Encoding)可以用于优化图像或矢量图形的数据传输和处理。激光雕刻通常需要将图像或图形转换为适合激光刻录机的指令,这些指令通常以一种称为 G-code 的格式表示。

RLE 可以在以下方面对激光雕刻应用进行优化:

  1. 数据压缩:原始图像或图形可能包含大量相同或类似的连续像素或路径。使用 RLE 可以将这些连续的像素或路径编码为游程,并用更简洁的方式表示,从而减小传输或存储的数据量。
  2. 路径优化:在将图像转换为激光刻录机的指令时,RLE 可以帮助优化路径。通过识别和合并相邻的线段或轮廓,可以减少激光头在工作区域内的移动次数,从而提高雕刻效率并减少制作时间。
  3. 减少机器负载:在处理大型图像或复杂图形时,RLE 可以减少激光刻录机的负载。通过减少传输到激光刻录机的指令数量,可以降低激光刻录机的计算和执行负荷,提高整体效率和性能。

实现代码:

CMakeLists.txt

cmake_minimum_required(VERSION 3.28)
project(rle)set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/execution-charset:utf-8>")add_executable(rle main.cpp)target_precompile_headers(untitled1 PRIVATE <vector> <print>)

main.cpp

#include <vector>
#include <print>struct RLE {int pos;    // 位置int value;  // 像素的值int length; // 像素长度
};// LeftToRight
std::vector<RLE> buildRLELTR(const std::vector<int> &input) {std::vector<RLE> rle;int count = 1;for (int i = 0; i < input.size(); ++i) {if (i + 1 < input.size() && input[i] == input[i + 1]) {++count;} else {RLE rleElement;rleElement.pos = i - count + 1;rleElement.value = input[i];rleElement.length = count;rle.push_back(rleElement);count = 1;}}return rle;
}// RightToLeft
std::vector<RLE> buildRLERTL(const std::vector<int> &input) {std::vector<RLE> rle;int count = 1;for (int i = input.size() - 1; i >= 0; --i) {if (i - 1 >= 0 && input[i] == input[i - 1]) {++count;} else {RLE rleElement;rleElement.pos = i + 1;rleElement.value = input[i];rleElement.length = count;rle.push_back(rleElement);count = 1;}}return rle;
}std::vector<RLE> buildRLE(const std::vector<int> &input, bool rightToLeft = false) {std::vector<RLE> rle;int count = 1;int start = rightToLeft ? input.size() - 1 : 0;int end = rightToLeft ? -1 : input.size();int step = rightToLeft ? -1 : 1;for (int i = start; i != end; i += step) {if ((i + step >= 0 && i + step < input.size()) && input[i] == input[i + step]) {++count;} else {RLE rleElement;rleElement.pos = i - (rightToLeft ? count - 1 : count) * step + 1;rleElement.value = input[i];rleElement.length = count;if (rightToLeft) {rle.insert(rle.begin(), rleElement);} else {rle.push_back(rleElement);}count = 1;}}return rle;
}bool buildRLELTR(const std::vector<int> &input, int &i, RLE &rle) {int count = 1;for (; i < input.size(); ++i) {if (i + 1 < input.size() && input[i] == input[i + 1]) {++count;} else {rle.pos = i - count + 1;rle.value = input[i];rle.length = count;++i;return true;}}return false;
}bool buildRLERTL(const std::vector<int> &input, int &i, RLE &rle) {int count = 1;for (; i >= 0; --i) {if (i - 1 >= 0 && input[i] == input[i - 1]) {++count;} else {rle.pos = i;rle.value = input[i];rle.length = count;i--;return true;}}return false;
}int main() {// clang-format off// 假设以下二维数组是灰度图像预处理后的激光强度映射,通过构建 RLE 数据结构,最后根据 RLE 生成 GCode 文本,可以实现数据压缩效果。using grayline = std::vector<int>;std::vector<grayline> array = {{925, 925, 925, 921, 917, 917, 898, 902, 906, 917},{917, 917, 917, 898, 890, 902, 902, 914, 925, 921},{914, 921, 925, 906, 898, 902, 902, 906, 910, 914},{910, 906, 902, 898, 886, 875, 917, 921, 906, 914},{914, 898, 906, 910, 898, 890, 894, 886, 882, 878},{914, 898, 906, 910, 898, 890, 894, 886, 882, 878},// 001, 002, 003, 004, 005, 006, 007, 008, 009, 010},};// clang-format onint i;RLE rle;i = 0;while (1) {auto ret = buildRLELTR(array[0], i, rle);if (ret) {// toCode// X{rle.pos+rle.length} S{rle.value}std::println("# {:3} {:3} {:3}", rle.pos, rle.value, rle.length);} else {break;}}std::println("");i = array[1].size() - 1;;while (1) {auto ret = buildRLERTL(array[1], i, rle);if (ret) {std::println("# {:3} {:3} {:3}", rle.pos, rle.value, rle.length);} else {break;}}std::println("==========================");{std::vector<RLE> rle = buildRLE(array[0], false);// left to right buildfor (const RLE &element: rle) {std::println("{:3} {:3} {:3}", element.pos, element.value, element.length);}}std::println("");{std::vector<RLE> rle = buildRLE(array[1], true);// implment right to left buildfor (const RLE &element: rle) {std::println("{:3} {:3} {:3}", element.pos, element.value, element.length);}}return 0;
}

总结

综上所述,RLE 在激光雕刻应用中可以通过数据压缩、路径优化和减少机器负载等方式提高效率并降低成本。


http://www.mrgr.cn/p/53872182

相关文章

【重塑世界的火种】制造业:从匠人之心到智能未来之旅

在人类文明的宏伟乐章中&#xff0c;有一段旋律始终激昂&#xff0c;它既古老又现代&#xff0c;既是力量的象征&#xff0c;也是智慧的结晶——这就是制造业&#xff0c;一个将梦想变为现实&#xff0c;将创意铸就为生活的神奇领域。今天&#xff0c;让我们一起走进这个塑造世…

【触想智能】工业级平板电脑五大特征与应用领域分析

工业级平板电脑是专供工业环境使用的工业控制计算机,也被称为工控一体机。工业级平板电脑基本性能及兼容性与商用平板电脑几乎相同,但是工业级平板电脑更注重在不同环境下的稳定性能,因此,工业级平板电脑与普通的商用平板电脑存在一定的区别。一、工业级平板电脑的五大特征…

2024软件测试自动化面试题(含答案)

1.如何把自动化测试在公司中实施并推广起来的&#xff1f; 选择长期的有稳定模块的项目 项目组调研选择自动化工具并开会演示demo案例&#xff0c;我们主要是演示selenium和robot framework两种。 搭建自动化测试框架&#xff0c;在项目中逐步开展自动化。 把该项目的自动化…

58微聊消息自动回复 – 58微聊自动回复机器人 – 浏览器插件

58同城上发布了产品,有咨询客户通过微聊联系我们,我们插件可以实现自动回复消息效果演示 58微聊消息自动回复,浏览器插件实现 #自动回复 #58同城 #58 – 抖音 (douyin.com) 功能列表关键词自动回复AI知识库自动回复下载插件 请联系微信:llike620 付费获取浏览器插件 原文地…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

黑马点评项目总结

登录 基于session登录 短信验证码登录 配置登录拦截器 向 Spring MVC 框架中添加拦截器&#xff0c;LoginInterceptor 是一个自定义的拦截器&#xff0c;用于拦截用户的登录请求。 excludePathPatterns这一句是设置拦截器需要放行的请求路径列表。 "/user/code", …

新版宝塔加密数据解密

宝塔更新了数据存储的方式,PanelForensics会尽快支持最近啊,fic中出现了宝塔,结果PanelForensics居然没有梭哈,这怎么行?? 于是我就一通分析,发现这个版本更新了架构,并且对密码的加解密是通过调用二进制依赖进行实现的 我这里就以mysql的密码为例,在新版本中,mysql的…

【挑战30天首通《谷粒商城》】-【第一天】03、简介-分布式基础概念

文章目录 课程介绍 ( 本章了解即可&#xff0c;可以略过)1、微服务简而言之: 2、集群&分布式&节点2.1、定义2.2、示例 3、远程调用4、负载均衡常见的负裁均衡算法: 5、服务注册/发现&注册中心6、配置中心7、服务熔断&服务降级7.1、服务熔断7.2、服务降级 8、AP…

数据库(MySQL)—— DML语句

数据库&#xff08;MySQL&#xff09;—— DML语句 什么是DML语句添加数据给全部字段添加数据批量添加数据 修改数据删除数据 什么是DML语句 在MySQL中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;语句主要用于对数据库中的数…

MongoDB索引

MongoDB索引 概述 索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常…

Vue2工程化介绍

Vue2项目[基于vue-cli]工程化 【一】环境搭建06-Vue-cli - 刘清政 - 博客园 (cnblogs.com)安装node 使用npm/cnpm npm换源:npm config set registry https://registry.npmmirror.com 安装vue-cli cnpm install -g @vue/cli# 安装脚手架 cnpm install -g @vue/cli # 切换目录,…

jmeter以命令行模式运行:非GUI界面

* `-n`:表示非GUI模式运行:命令行模式运行jmeter脚本 * `-t`:要执行的jmeter脚本(JMX):a.默认执行当前路径下的脚本,b.或执行指定路径下的脚本 * `-l`:生成结果文件(JTL):a.默认在当前路径下生成JTL文件,b.或在指定路径下生成JTL文件 * `-e`:生成HTML报告 * `-o`…

音视频开发3 视频基础,图片基础

图片像素&#xff08;Pixel&#xff09; 一张图片是由多少个 像素 构成的。 例如一张图片是由60x50组成的。 位深度 bit depth RGB表示法 红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff09;、蓝&#xff08;Blue&#xff09; 除了24bit&#xff0c;常见的位深…

【强训笔记】day15

NO.1 代码实现&#xff1a; #include<iostream> #include<cmath>using namespace std; typedef long long ll;int main() {ll x;cin>>x;ll asqrt(x);ll x1a*a,x2(a1)*(a1);if(x-x1<x2-x) cout<<x1<<endl;else cout<<x2<<endl;r…

79. 单词搜索-c++

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。…

直播产品实习生实习体验报告,笔灵AI生成模版分享

实习体验报告&#xff1a;直播产品实习生 如果有不同的岗位需要写的话可以去笔灵生成一下 网址&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 一、实习背景我是XXX&#xff0c;作为一名直播产品实习生&#xff0c;我在XX公司进行了为期X个月的实习。在这段时间里&…

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习 1、 for i in range(3):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()3、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()4、 for…

RocketMQ 事件驱动:云时代的事件驱动有啥不同?

本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。前言: 从初代开源消息队…

wangEditor富文本编辑器与layui图片上传

记录&#xff1a;js 显示默认的wangEditor富文本编辑器内容和图片 <style>body {background-color: #ffffff;}.layui-form-select dl{z-index:100000;} </style> <div class"layui-form layuimini-form"><div class"layui-form-item"…

rust将json字符串直接转为map对象或者hashmap对象

有些时候我们还真的不清楚返回的json数据里面到底有哪些数据&#xff0c;数据类型是什么等&#xff0c;这个时候就可以使用批处理的方式将json字符串转为一个对象&#xff0c;然后通过这个对象的get方法来获取json里面的数据。 pub async fn test_json(&self) {let json_st…