基础篇03-图像的基本运算

news2025/2/3 11:46:12

本节将简要介绍Halcon中有关图像的两类基本运算,分别是代数运算和逻辑运算。除此之外,还介绍几种特殊的代数运算。

目录

1.引言

2. 基本运算

2.1 加法运算

2.2 减法运算

2.3 乘法运算

2.4 除法运算

2.5 综合实例

3. 逻辑运算

3.1 逻辑与运算

3.2 逻辑或运算

3.3 逻辑非运算

3.4 逻辑异或运算

3.5 综合实例

4. 特殊运算

4.1 图像反转

4.2 图像灰度缩放


1.引言

图像运算指以图像为像素为单位进行的操作(有时称为pixel-level)。具体的运算主要包括算术和逻辑运算。

  1. 算术运算:包括加、减、乘、除,以及基于四种基本运算的复合运算。
  2. 逻辑运算:包括与、或、非、同或、异或运算等等。

2. 基本运算

本节将逐一介绍上述各类基本运算的实现过程,重点介绍各类运算对应的Halcon算子。

Halcon提供的图像代数运算算子分为两类,一类是基础算子,包括“加、减、乘、除”,另一类是复合运算算子,比如线性加权运算。

为了讨论方便,本节分别用A(x,y)B(x,y)表示两幅待处理的图像,用C(x,y)表示结果图像。

2.1 加法运算

图像的加法运算可用下式表示:

C(x,y)=A(x,y)+B(x,y)

Halcon使用add_image算子实现图像相加运算,即对应位置的像素点相加。

add_image(Image1, Image2, ResultImage, Mult, Add)

参数说明:

  • Image1:输入图像 1。
  • Image2:输入图像 2。
  • ResultImage:输出图像,存储运算结果。
  • Mult:乘法因子(可选,默认为 1)。
  • Add:加法因子(可选,默认为 0)。

2.2 减法运算

图像的减法运算可用下式表示:

C(x,y)=A(x,y)-B(x,y)

Halcon使用sub_image算子实现图像相加运算,即对应位置的像素点相减。

sub_image(Image1, Image2, ResultImage, Mult, Add)

2.3 乘法运算

图像的乘法运算可用下式表示:

C(x,y)=A(x,y)\times B(x,y)

Halcon使用mult_image算子实现图像点乘运算,即对应位置的像素点相乘。

mult_image(Image1, Image2, ResultImage, Mult, Add)

2.4 除法运算

图像的除法运算可用下式表示:

C(x,y)=A(x,y)\div B(x,y)

Halcon使用div_image算子实现图像除法运算,即对应位置的像素点相除。

div_image(Image1, Image2, ResultImage, Mult, Add

    2.5 综合实例

    以下是一个完整的示例,展示如何对两幅图像进行加、减、乘、除运算:

    * 读取图像
    read_image(Image1, 'image1.png')
    read_image(Image2, 'image2.png')
    
    * 加法
    add_image(Image1, Image2, AddResult, 1, 0)
    * 减法
    sub_image(Image1, Image2, SubResult, 1, 0)
    * 乘法
    mult_image(Image1, Image2, MultResult, 1, 0)
    * 除法
    div_image(Image1, Image2, DivResult, 1, 0)
    
    * 显示结果
    dev_display(AddResult)
    dev_display(SubResult)
    dev_display(MultResult)
    dev_display(DivResult)

    下面统一说明一些注意事项:

    • 图像尺寸:参与运算的两幅图像必须具有相同的尺寸。
    • 图像类型:通常要求图像类型一致(如 byte、uint2、real 等)。
    • 溢出处理:运算结果可能会超出图像数据类型的范围,Halcon 会自动进行截断或归一化处理。

    3. 逻辑运算

    在 Halcon 中,图像的逻辑运算是对图像的像素值进行逐像素的逻辑操作(如与、或、非、异或等)。这些操作通常用于二值图像(像素值为 0 或 1),但也可以应用于多通道图像或灰度图像。

    3.1 逻辑与运算

    对两幅图像的像素值进行逐像素的逻辑与操作:

    C(x,y)=A(x,y)\cap B(x,y)

    Halcon使用bit_and算子实现图像相加运算,即对应位置的像素点取逻辑“与”运算。

    bit_and(Image1, Image2, ResultImage)

    参数说明

    • Image1:输入图像 1。
    • Image2:输入图像 2。
    • ResultImage:输出图像,存储逻辑与运算的结果。

    3.2 逻辑或运算

    对两幅图像的像素值进行逐像素的逻辑或操作:

    C(x,y)=A(x,y)\cup B(x,y)

    Halcon使用bit_or算子实现图像或运算,即对应位置的像素点取逻辑“或”运算。

    bit_or(Image1, Image2, ResultImage)

    3.3 逻辑非运算

    对图像的像素值进行逐像素的逻辑非操作(取反):

    C(x,y)=\overline{A(x,y)}

    Halcon使用bit_not算子实现图像非运算,即对应位置的像素点取逻辑“非”运算。

    bit_not(Image, ResultImage)

    3.4 逻辑异或运算

    对两幅图像的像素值进行逐像素的逻辑异或操作:

    C(x,y)=A(x,y)\bigoplus B(x,y)

    Halcon使用bit_xor算子实现图像异或运算,即对应位置的像素点取逻辑“异或”运算。

    bit_xor(Image1, Image2, ResultImage)

    3.5 综合实例

    以下是一个完整的示例,展示如何对两幅图像进行逻辑与、或、非、异或运算:

    * 读取图像
    read_image(Image1, 'image1.png')
    read_image(Image2, 'image2.png')
    
    * 逻辑与运算
    bit_and(Image1, Image2, AndResult)
    * 逻辑或运算
    bit_or(Image1, Image2, OrResult)
    * 逻辑非运算
    bit_not(Image1, NotResult)
    * 逻辑异或运算
    bit_xor(Image1, Image2, XorResult)
    
    * 显示结果
    dev_display(AndResult)
    dev_display(OrResult)
    dev_display(NotResult)
    dev_display(XorResult)

    最后,说一下注意事项

    • 图像类型:逻辑运算通常用于二值图像(像素值为 0 或 1),但也可以应用于灰度图像或多通道图像。
    • 图像尺寸:参与运算的两幅图像必须具有相同的尺寸。
    • 数据类型:如果图像不是二值图像,Halcon 会将其转换为二值图像后再进行逻辑运算。

    4. 特殊运算

    再介绍几种Halcon提供的几种特殊运算情况。

    4.1 图像反转

    Halcon中使用invert_image算子用于对图像的像素值进行反转操作。

    对于灰度图像,图像的反转运算如下:

    C(x,y)=I_{max}-A(x,y)=255-A(x,y)

    该算子的声明如下:

    invert_image(Image, ImageInvert)

    参数说明

    • Image:输入图像(可以是灰度图像或多通道图像)。
    • ImageInvert:输出图像,存储反转后的结果。

    注意事项:

    • 图像类型:invert_image 适用于灰度图像和多通道图像。
    • 数据类型:反转操作的结果与输入图像的数据类型一致(例如,8 位图像的反转结果仍然是 8 位图像)。
    • 二值图像:对于二值图像(像素值为 0 或 1),反转操作会将 0 变为 1,1 变为 0。

    以下是一个简单的示例,展示如何使用 invert_image 对图像进行反转操作:

    * 读取图像
    read_image(Image, 'example_image.png')
    
    * 对图像进行反转操作
    invert_image(Image, ImageInvert)
    
    * 显示原图和反转后的图像
    dev_display(Image)
    dev_display(ImageInvert)

    4.2 图像灰度缩放

    Halcon中使用scale_image算子用于对图像的像素值进行灰度缩放操作。

    对于灰度图像,图像的灰度缩放运算如下:

    C(x,y)=M\times A(x,y)+N

    该算子的声明如下:

    scale_image(Image, ImageScaled, Mult, Add)

    参数说明

    • Image:输入图像(可以是灰度图像或多通道图像)。
    • ImageScaled:输出图像,存储缩放和偏移后的结果。
    • Mult:缩放因子(乘法系数)。
    • Add:偏移量(加法系数)。

    以下是一个简单的示例,展示如何使用 scale_image 对图像进行缩放和偏移操作:

    * 读取图像
    read_image(Image, 'example_image.png')
    
    * 对图像进行缩放和偏移操作
    Mult := 2.0  * 缩放因子
    Add := 50    * 偏移量
    scale_image(Image, ImageScaled, Mult, Add)
    
    * 显示原图和缩放后的图像
    dev_display(Image)
    dev_display(ImageScaled)

    注意事项

    • 数据类型:scale_image 的输出图像数据类型与输入图像一致。如果缩放后的像素值超出数据类型的范围,Halcon 会自动进行截断。
    • 多通道图像:对于多通道图像(如 RGB 图像),scale_image 会对每个通道分别进行缩放和偏移操作。
    • 性能:scale_image 是一个高效的算子,适用于实时图像处理。

    (未完待续,最新更新2025-02-02)

    本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材保持一致。作为学习和实践DIP技术的入门教程。

    感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

    在专栏全部完成之前,所有内容将一直免费。

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

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

    相关文章

    工具的应用——安装copilot

    一、介绍Copilot copilot是一个AI辅助编程的助手,作为需要拥抱AI的程序员可以从此尝试进入,至于好与不好,应当是小马过河,各有各的心得。这里不做评述。重点在安装copilot的过程中遇到了一些问题,然后把它总结下&…

    Alibaba开发规范_编程规约之命名风格

    文章目录 命名风格的基本原则1. 命名不能以下划线或美元符号开始或结束2. 严禁使用拼音与英文混合或直接使用中文3. 类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等4. 方法名、参数名、成员变量、局部变量使用 low…

    MATLAB中的IIR滤波器设计

    在数字信号处理中,滤波器是消除噪声、提取特征或调整信号频率的核心工具。其中,无限脉冲响应(IIR)滤波器因其低阶数实现陡峭滚降的特性,被广泛应用于音频处理、通信系统和生物医学工程等领域。借助MATLAB强大的工具箱&…

    vector容器(详解)

    本文最后是模拟实现全部讲解,文章穿插有彩色字体,是我总结的技巧和关键 1.vector的介绍及使用 1.1 vector的介绍 https://cplusplus.com/reference/vector/vector/(vector的介绍) 了解 1. vector是表示可变大小数组的序列容器。…

    python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

    【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

    【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能

    近期在做跟毕业设计相关的数据后台管理系统,其中的列表项展示有图片展示,添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能,这里分享个人的实现过程,与大家交流谈论~ 一、准备工作 本次案例使用的…

    使用真实 Elasticsearch 进行高级集成测试

    作者:来自 Elastic Piotr Przybyl 掌握高级 Elasticsearch 集成测试:更快、更智能、更优化。 在上一篇关于集成测试的文章中,我们介绍了如何通过改变数据初始化策略来缩短依赖于真实 Elasticsearch 的集成测试的执行时间。在本期中&#xff0…

    【R语言】函数

    一、函数格式 如下所示: hello:函数名;function:定义的R对象是函数而不是其它变量;():函数的输入参数,可以为空,也可以包含参数;{}:函数体,如果…

    VSCode插件Live Server

    简介:插件Live Server能够实现当我们在VSCode编辑器里修改 HTML、CSS 或者 JavaScript 文件时,它都能自动实时地刷新浏览器页面,让我们实时看到代码变化的效果。再也不用手动刷新浏览器了,节省了大量的开发过程耗时! 1…

    50. 正点原子官方系统镜像烧写实验

    一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统,然后通过这个系统来完成烧写工作。 切记!使用OTG烧写的时候要先把SD卡拔出来&…

    扩散模型(三)

    相关阅读: 扩散模型(一) 扩散模型(二) Latent Variable Space 潜在扩散模型(LDM;龙巴赫、布拉特曼等人,2022 年)在潜在空间而非像素空间中运行扩散过程,这…

    it基础使用--5---git远程仓库

    it基础使用–5—git远程仓库 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念 -git基础使用–3—安装和基本使用 -git基础使用–4—git分支和使用 2. 什么是远程仓库 在第一篇文章中,我们已经讲过了远程仓库,每个本…

    Baklib如何改变内容管理平台的未来推动创新与效率提升

    内容概要 在信息爆炸的时代,内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容,帮助用户有效地管理信息流。随着技术的发展,传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性,这促使市场需…

    16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

    完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

    ARM嵌入式学习--第十天(UART)

    --UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用来与PC进行通信&#xff0c;包括与监控…

    Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

    详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine&#xff0c;找到 Cinemachine包&#xff0c;点击 Install按钮进行安装。 关闭窗口&#xff0c;新建一个FreeLook Camera&#xff0c;如下。 接着新建一个对象Pos&#xff0c;拖到Player下面…

    【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

    目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

    小程序-基础加强-自定义组件

    前言 这次讲自定义组件 1. 准备今天要用到的项目 2. 初步创建并使用自定义组件 这样就成功在home中引入了test组件 在json中引用了这个组件才能用这个组件 现在我们来实现全局引用组件 在app.json这样使用就可以了 3. 自定义组件的样式 发现页面里面的文本和组件里面的文…

    尝试ai生成figma设计

    当听到用ai 自动生成figma设计时&#xff0c;不免好奇这个是如何实现的。在查阅了不少资料后&#xff0c;有了一些想法。参考了&#xff1a;在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是&#xff1a;可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…

    【周易哲学】生辰八字入门讲解(八)

    &#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…