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

激光雕刻

  • 什么是 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://xiahunao.cn/news/3015882.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

小程序预览或上传代码时,遇到app.json未找到某个wxml文件的解决方法

uniapp小程序&#xff0c;点击预览或者是上传代码&#xff0c;遇到app.json无法找到某个wxml文件的解决方法&#xff1a;清缓存 问题&#xff1a; message&#xff1a;Error: app.json: 未找到 ["subPackages"][3]["pages"][3] 对应的 subPackages4/pages/…

PXE 批量安装部署

目录 一、PEX批量部署优点 二、PXE&#xff1a;预启动执行环境 三、搭建PXE远程服务器 要想全自动安装 接下来请看步骤&#xff1a; 一、PEX批量部署优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统 配置各种服务远程实现&#xff1a;不需要光盘&…

语音识别--光谱门控降噪

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计7267字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

FSC森林认证是什么?

FSC森林认证&#xff0c;又称木材认证&#xff0c;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。FSC森林认证包括森林经营认证&#xff08;Forest Management, FM&#xff09;和产销监管链认证&#xff08;Chain of Custody, COC&#…

使用IIS部署Vue项目

前提 使用IIS部署Vue项目&#xff0c;后端必须跨域&#xff0c;不要在Vue中用proxy跨域&#xff0c;那个只在dev环境中有用&#xff01; IIS安装&#xff0c;不用全部打勾&#xff0c;有些他默认就是方块 ■ 选择性安装的&#xff0c;就维持原样就可以。 添加网站配置 右键…

Ecovadis认证是什么?

Ecovadis认证是一种企业社会责任&#xff08;CSR&#xff09;评估和评级的认证&#xff0c;旨在衡量企业在环境、劳工和人权、道德以及可持续采购四个方面的可持续发展表现。该认证已成为全球范围内许多公司和组织的评估标准之一&#xff0c;有助于提高企业的会声誉和可持续发展…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

Pycharm无法链接服务器环境(host is unresponsived)

困扰了很久的一个问题&#xff0c;一开始是在服务器ubuntu20.04上安装pycharm community&#xff0c;直接运行服务器上的pycharm community就识别不了anaconda中的环境 后来改用pycharm professional也无法远程连接上服务器的环境&#xff0c;识别不了服务器上的环境&#xff…

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…

2024DCIC海上风电出力预测Top方案 + 光伏发电出力高分方案学习记录

海上风电出力预测 赛题数据 海上风电出力预测的用电数据分为训练组和测试组两大类&#xff0c;主要包括风电场基本信息、气象变量数据和实际功率数据三个部分。风电场基本信息主要是各风电场的装机容量等信息&#xff1b;气象变量数据是从2022年1月到2024年1月份&#xff0c;…

翻译《The Old New Thing》- Rendering menu glyphs is slightly trickier

Rendering menu glyphs is slightly trickier - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050802-13/?p34743 Raymond Chen 2005年08月02日 上次&#xff0c;我们看到了如何绘制有主题和无主题的单选按钮&#xff0c;我提到菜单位图更…

cmake进阶:目录属性说明一

一. 简介 接下来简单学习一下 cmake 中的属性相关的概念。 属性大概可以分为多种&#xff1a;全局属性、目录属性&#xff08;源码属性&#xff09;、目标属性以及其它一些分类。 二. cmake进阶&#xff1a;目录属性 cmake中的属性可以 在如下网址查询到&#xff1a; http…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train()&#xff0c;model.eval()作用&#xff1f; model.train() 和 model.eval() 是 PyTorch 中的两个方法&#xff0c;用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下&#xff0c;模型会启用 dropout 和 batch norm…

python爬虫学习------scrapy第三部分(第三十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…

Linux学习之路 -- 文件 -- 文件描述符

前面介绍了与文件相关的各种操作&#xff0c;其中的各个接口都离不开一个整数&#xff0c;那就是文件描述符&#xff0c;本文将介绍文件描述符的一些相关知识。 目录 <1>现象 <2>原理 文件fd的分配规则和利用规则实现重定向 <1>现象 我们可以先通过prin…

04_SpringCloud

文章目录 单体架构与微服务架构的介绍单体架构微服务架构 微服务的实现服务之间的调用服务注册中心Eureka 注册中心Eureka的自我保护机制Nacos注册中心 单体架构与微服务架构的介绍 单体架构 单体架构 所有的代码最终打包成一个文件(jar包)&#xff0c;整个系统的所有功能单元…