【halcon】write_image 图片保存

news2024/11/15 13:53:23

前言

write_image 是一个可以用来保存图片的算子,可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。
在这里插入图片描述

正文

参数:

  1. Image(输入对象): 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cyclic、int1、complex、int2、uint2、vector_field、int4、int8和real。

  2. Format(输入控制): 要保存图像的图形格式。支持的格式包括:

    • ‘tiff’,‘bigtiff’:TIFF格式。
    • ‘bmp’:Windows-BMP格式。
    • ‘jpeg’:JPEG格式。
    • ‘jp2’:JPEG-2000格式。
    • ‘jpegxr’:JPEG-XR格式。
    • ‘png’:PNG格式。
    • ‘hobj’:HALCON Iconic Object(HOBJ)格式。
    • ‘ima’:HALCON格式。
  3. FillColor(输入控制): 不属于图像域(区域)的像素的填充灰度值。对于灰度值图像,必须传递0(黑色)到255(白色)之间的值。对于RGB彩色图像,RGB值可以直接传递为十六进制值,例如,对于黄色背景,可以传递0xffff00(红=255,绿=255,蓝=0)。

  4. FileName(输入控制): 图像文件的名称,包括文件扩展名。具体的扩展名取决于所选择的图形格式。

支持的格式:

  • TIFF格式:

    • 支持所有HALCON像素类型。
    • 可以使用’deflate [num]'、‘jpeg [num]’、'lzw’和’packbits’进行压缩。
    • 可以将图像域以压缩形式存储为’mask’(默认设置)或作为附加的alpha通道存储为’alpha’。
  • BMP格式:

    • 仅支持像素类型为byte的图像。
    • 仅支持包含一个通道(灰度值图像)或三个通道(RGB图像)的图像。
  • JPEG格式:

    • 仅支持像素类型为byte的图像。
    • 可以指定质量值确定的压缩率,例如,‘jpeg 30’。
  • JPEG-2000格式:

    • 支持lossless和lossy压缩。
    • 可以指定决定压缩率的质量值,例如,‘jp2 40’。
  • JPEG-XR格式:

    • 支持lossless和lossy压缩。
    • 可以指定决定压缩率的质量值,例如,‘jpegxr 30’。
  • PNG格式:

    • 支持lossless压缩。
    • 可以指定0到9的压缩级别,或使用字符串’best’、'fastest’和’none’进行选择。
  • HALCON Iconic Object(HOBJ)格式:

    • 支持所有HALCON图像类型。
  • HALCON格式:

    • 现在是遗留的格式,建议使用HOBJ格式。

执行信息:

  • 多线程类型: 可重入(可以与非独占操作同时运行)。
  • 多线程范围: 全局(可以从任何线程调用)。
  • 自动并行化: 在元组级别上自动并行化。

返回结果:

如果参数值正确,write_image 操作符将返回值2(H_MSG_TRUE)。否则,将引发异常。

问答环节

如果我想保存成png格式如何实现压缩?

要将图像保存为PNG格式并实现压缩,你可以在 write_image 操作符的 Format 参数中指定压缩级别。压缩级别可以是介于0和9之间的整数,其中0表示无压缩,9表示最佳压缩。此外,你还可以使用一些字符串来选择压缩级别,如’best’表示最佳压缩,'fastest’表示最快速度,'none’表示无压缩。

以下是将图像保存为PNG格式并进行压缩的示例:

// 将图像保存为PNG格式并设置压缩级别
write_image(Image, 'png 5', 0, 'output.png');

在上述示例中,'png 5' 指定了压缩级别为5。你可以根据需要调整压缩级别。如果你希望实现最佳压缩,可以将字符串设置为 'png best'

// 将图像保存为PNG格式并使用最佳压缩级别
write_image(Image, 'png best', 0, 'output.png');

请注意,使用更高的压缩级别可能会导致保存过程变慢,因此你可能需要权衡压缩率和性能。

JPEG 如何保存呢?

当你想将图像保存成 JPEG 格式时,可以使用 write_image 操作符,并设置格式参数为 'jpeg',同时可以通过指定质量参数来调整 JPEG 的压缩质量。以下是详细介绍:

操作符签名

write_image(Image, 'jpeg [quality]', FillColor, 'output.jpg');
  • Image: 待保存的图像或图像数组。
  • ‘jpeg [quality]’: JPEG 格式字符串,quality 参数可选,用于指定压缩质量。quality 的范围一般为 0 到 100,值越大表示质量越高,文件大小越大。例如,‘jpeg 90’ 表示压缩质量为 90。
  • FillColor: 用于指定图像外部区域的填充颜色。对于 JPEG,这通常不太影响,可以设置为 0。
  • ‘output.jpg’: 输出文件的名称和路径。

示例

// 保存为 JPEG 格式,压缩质量为 90
write_image(Image, 'jpeg 90', 0, 'output.jpg');

注意事项

  1. 压缩质量: 质量设置为 100 表示最高质量,0 表示最低质量。适当的质量设置可以在保持图像质量的同时减小文件大小。
  2. 压缩速度和文件大小: 选择较高的质量通常会导致较大的文件大小,同时保存时间可能稍长。在速度和文件大小之间需要平衡,具体取决于应用需求。
  3. 颜色损失: JPEG 是有损压缩格式,会引入一定程度的颜色损失。这种损失在较高的质量设置下会减小,但不会完全消除。

根据你的具体需求,可以根据测试和实验来选择合适的质量参数和其他选项。

哪一种保存的时间比较快呢?

这里我写了一个程序进行测试:

 HObject img;
 HOperatorSet.ReadImage(out img, "1.tif");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "png fastest", 0, "p1");
 stopwatch.Stop();
 Debug.WriteLine($"png fastest: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "png bset", 0, "p2");
 stopwatch.Stop();
 Debug.WriteLine($"png bset: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "tiff", 0, "t"); 
 stopwatch.Stop();
 Debug.WriteLine($"tiff: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "bmp", 0, "b"); 
 stopwatch.Stop();
 Debug.WriteLine($"bmp: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "jpeg", 0, "j1");
 stopwatch.Stop();
 Debug.WriteLine($"jpeg: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "jpeg 30", 0, "j2");
 stopwatch.Stop();
 Debug.WriteLine($"jpeg 30: {stopwatch.ElapsedMilliseconds}");

 stopwatch.Restart();
 HOperatorSet.WriteImage(img, "jpeg 90", 0, "j3");
 stopwatch.Stop();
 Debug.WriteLine($"jpeg 90: {stopwatch.ElapsedMilliseconds}");

读取的是一张56M图片,是黑白的,执行结果如下(单位ms):

png fastest: 1247
png bset: 3421
tiff: 144
bmp: 179
jpeg: 126
jpeg 30: 100
jpeg 90: 183

最快的是 jpeg 压缩质量为30的时候。虽然质量只有30,但一眼看上去也没啥区别,不过大小是小的真的多(不愧是是有损压缩!)。

在这里插入图片描述
当然还有其他格式,我没有一一去测试,大家可以自行尝试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1436517.html

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

相关文章

opencv c++ (6):直方图

1. 绘制直方图 api不在做详细介绍&#xff0c;具体看以下代码例子 #include <iostream> #include<opencv.hpp> #include<opencv2\highgui\highgui.hpp>using namespace std; using namespace cv;int main() {Mat src imread("src.jpg");if (src…

Qt 常见容器类用法(二)

目录 QList类 QLinkedList类 QList类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T是一个指针类型或指针大小的基本数据类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>…

python 爬虫安装http请求库

我的是window环境&#xff0c;安装的python3&#xff0c;如果再linux环境&#xff1a;pip install requests 开始&#xff1a; 上面我们成功发送请求并获取到响应&#xff0c;现在需要解析html或xml获取数据&#xff0c;因此我使用现成的工具库Beautiful Soup

期末账项调整

目录 一. 概念二. 期末账项调整的种类及应用三. 基本调整事项3.1 应计项目3.2 递延项目 四. 估计项目的调整 \quad 一. 概念 \quad 在会计期末对一些没有明显经济业务发生(没有原始凭证)&#xff0c;但按照权责发生制要求&#xff0c;却影响本会计期间收益的一些隐含事项进行调…

windows+vscode配置远程Linux开发环境

1.Linux运行sshd服务 安装openssh-server sudo apt install openssh-server 开启服务 sudo service ssh start 检查sshd是否开启 sudo ps -aux | grep sshd 2.vscode上安装RemoteDevelopment插件 其他依赖性会自动安装 3.配置远程Linux主机信息 Linux主机ip 4.在vscode…

必看!第六版CCF(中国计算机学会)推荐B类国际学术会议!

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示&#xff1a; 可以看到题目提示为&#xff1a; 密钥什么的&#xff0c;就不要放在前端了 然后我们打开题目链接&#xff1a; 然后我们查看网页源代码&#xff1a; 可以发现有用的内容全在网页源代码里。 前端验证…

NLP_词的向量表示Word2Vec 和 Embedding

文章目录 词向量Word2Vec&#xff1a;CBOW模型和Skip-Gram模型通过nn.Embedding来实现词嵌入Word2Vec小结 词向量 下面这张图就形象地呈现了词向量的内涵:把词转化为向量&#xff0c;从而捕捉词与词之间的语义和句法关系&#xff0c;使得具有相似含义或相关性的词语在向量空间…

掌握Linux du命令:高效查看文件和目录大小

今天我们在生产环境中的服务器上收到了有关/var磁盘目录使用率较高的警报。为了解决这一问题&#xff0c;我们进行了/var目录下一些大文件的清理和转移操作。在查找那些占用磁盘空间较多的文件时&#xff0c;我们频繁使用了du命令。在Linux系统中&#xff0c;du命令是一款功能强…

选择低代码应该注意什么?如何选择?

我查看了几乎所有的介绍低代码的总结和分析报告&#xff0c;几乎都没有把低代码最底层的产品逻辑说清楚。今天我尝试不用复杂的技术名词&#xff0c;也不用代码&#xff0c;把这个事儿给大家说明白&#xff0c;低代码到底怎么回事儿&#xff01;&#xff08;人云亦云那些&#…

Flink cdc debug调试动态变更表结构

文章目录 前言调试流程1. 拉取代码本地打包2. 配置启动参数3. 日志配置4. 启动验证5. 断点验证 问题1. Cannot find factory with identifier "mysql" in the classpath.2.JsonFactory异常3. NoSuchMethodError异常其他 结尾 前言 接着上一篇Flink cdc3.0动态变更表…

大数据分析|大数据分析的十大应用领域

有许多技术可用于分析大数据。这项工作介绍了BDA适用的各种分析技术领域如下。 &#xff08;1&#xff09;社会分析 社交分析是实时数据分析中一个重要且不断发展的分析方法。它分为社交网络(例如&#xff0c;Facebook和LinkedIn)&#xff0c;博客(例如&#xff0c;Blogger和W…

Three.js学习6:透视相机和正交相机

一、相机 相机 camera&#xff0c;可以理解为摄像机。在拍影视剧的时候&#xff0c;最终用户看到的画面都是相机拍出来的内容。 Three.js 里&#xff0c;相机 camera 里的内容就是用户能看到的内容。从这个角度来看&#xff0c;相机其实就是用户的视野&#xff0c;就像用户的眼…

STM32中断优先级原理及应用

STM32中断优先级配置详解 在STM32微控制器中&#xff0c;中断优先级的配置对于系统的稳定性和可靠性至关重要。正确地配置中断优先级可以确保重要中断的及时响应&#xff0c;提高系统的性能。本文将介绍STM32中断优先级配置的方法&#xff0c;帮助初学者轻松上手。 1. 中断优…

C++ | vector二维数组的初始化与行、列数的获取

如果直接使用vector<int,vector<int> > v;创建二维数组&#xff0c;那么就会得到一个空的容器&#xff0c;这样再通过push_back赋值是非常麻烦的。 初始化二维数组 在此介绍二维数组初始化的一般操作。 首先看一维数组的初始化示例&#xff1a; 定义一个长度为n&a…

聊聊需求评审与验收测试

这是鼎叔的第八十六篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版&#xff08;机械工业出版社&…

【3D分割】GARField: 辐射场的物体分组

题目&#xff1a;GARField: Group Anything with Radiance Fields 来源&#xff1a;UC Berkeley 和 Luma AI 项目&#xff1a; https://www.garfield.studio/ 文章目录 摘要一、前言二、相关工作2.1 层次分组2.2 NeRF的分割2.3 3D 特征场 三、method3.1 2D Mask 生成3.2 Scale-…

2.6两个线程实现同步代码示例

#include<myhead.h> //1、定义无名信号量 sem_t sem; //定义生产者线程 void *task1(void *arg) {int num 5;while(num--){sleep(1);printf("我生产了一辆飞机\n");//4、释放资源sem_post(&sem);}//退出线程pthread_exit(NULL); } //定义消费者线程 void …

电机粘性阻尼系数D

P31-电机粘性阻尼系数D P43-电机粘性阻尼系数D P47-电机粘性阻尼系数D

SQLite database实现加密

注意&#xff1a;以下操作以VS2022为开发工具&#xff0c;以C#为开发语言。 数据加密原因 软件在使用的各个场景&#xff0c;很多都需要数据具有保密性&#xff0c;于是对于数据库就需要加密。特别是在某些特定领域或存储敏感数据尤其如此。 SQLite加密实现 SQLite加密有两种…