基础篇05-图像直方图操作

本节将简要介绍Halcon中有关图像直方图操作的算子,重点介绍直方图获取和显示两类算子,以及直方图均衡化处理算子。

目录

1. 引言

2. 获取并显示直方图

2.1 获取(灰度)直方图

(1) gray_histo算子

(2) gray_histo_abs算子

(3) gray_histo_range算子

(4) histo_2dim

2.2 显示直方图

(1) gen_region_histo算子

(2) get_grayval_range算子

3. 直方图操作

3.1 直方图均衡

3.2 计算直方图的统计特性

1. 引言

图像直方图Histogram)是反映图像像素分布的统计表,记为ℎ(𝑘),横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数(对应普通直方图)或者所占的百分比(对应归一化直方图)。

归一化直方图Uniform Histogram)是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的发生的概率,记为𝑝(𝑘),它可以ℎ(𝑘)用得到。

累计分布直方图Cumulitive Distribution Histogram),简称累计直方图,代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,记为𝑐(𝑘),它也可以用ℎ(𝑘)得到。

以下是三种直方图的定义:

h(k)=n_k,\quad p(k)=\frac{n_k}{N},\quad c=\frac{1}{N} \sum_{i=0}^{k}n_i,\quad k=0,1,\cdots,L-1

式中,𝑘是图像灰度级的取值,n_k表示取值为𝑘的像素点数目,N是图像内像素点的总数。

下图是多幅图像及其对应的直方图情况,不难看出,灰度直方图反映了图像中的灰度分布规律,直观地表现了图像中各灰度级的占比,很好地体现出图像的亮度和对比度信息:

  • 灰度图分布居中说明亮度正常,偏左说明亮度较暗,偏右表明亮度较高;
  • 狭窄陡峭表明对比度降低,宽泛平缓表明对比度较高。

(从左至右分别是较暗、较亮、较黯淡,以及高对比度图像及其直方图示例)

2. 获取并显示直方图

2.1 获取(灰度)直方图

(1) gray_histo算子

在Halcon中使用gray_histo算子获取图像的直方图。该算子计算图像的灰度值分布,并返回直方图的频数。根据参数设置不同,可以获取普通直方图和归一化直方图

算子声明

gray_histo(Image : : : AbsoluteHisto, RelativeHisto)

参数说明

  • Image:输入图像。
  • AbsoluteHisto:绝对直方图,表示每个灰度值的像素数量。
  • RelativeHisto:归一化直方图,表示每个灰度值的像素比例(概率)。

注意事项

  • 如果输入图像是彩色的,需要先转换为灰度图像。
  • 如果要显示直方图,需要使用gen_region_histo算子将直方图转换为图像的函数,方便可视化。

(2) gray_histo_abs算子

除了计算全局直方图信息外,Halcon还提供了gray_histo_abs算子用于获取图像局部区域的直方图信息,非常方便。在此列出该算子的声明和参数说明。

算子声明

gray_histo_abs(Region, Image : Histogram : : )

参数说明

  1. Region: 输入区域,指定要计算直方图的图像区域。
  2. Image: 输入图像,灰度图像。
  3. Histogram: 输出直方图,返回一个包含灰度值分布的数组。

(3) gray_histo_range算子

Halcon使用gray_histo_range算子用于计算图像中指定区域内灰度值在某个范围内的直方图信息。与 gray_histo_abs 不同,gray_histo_range 允许用户指定一个灰度值范围,并仅计算该范围内的像素分布。

算子声明

gray_histo_range(Region, Image : Histogram : MinGray, MaxGray, NumBins : )

参数说明

  1. Region: 输入区域,指定要计算直方图的图像区域。
  2. Image: 输入图像,灰度图像。
  3. Histogram: 输出直方图,返回一个数组,表示指定灰度范围内的像素分布。
  4. MinGray: 输入参数,指定灰度范围的最小值。
  5. MaxGray: 输入参数,指定灰度范围的最大值。
  6. NumBins: 输入参数,指定直方图的区间数(即将灰度范围分成多少个区间)。

(4) histo_2dim

Halcon使用histo_2dim算子计算双通道灰度值图像的直方图,即构建二维直方图。

算子声明

histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )

参数说明

  • Regions:输入区域,在此区域内计算直方图。这些区域通常是从图像中分割出来的一部分或多部分,即感兴趣区域(ROI)。
  • ImageCol:多通道图像的第一个通道,其数据将被用于计算直方图的第一维。
  • ImageRow:多通道图像的第二个通道,其数据将被用于计算直方图的第二维。
  • Histo2Dim:计算得出的二维直方图。输出是一个整数类型的图像,其中的每个像素值代表了对应灰度级组合出现的频率。

使用说明:

  • histo_2dim算子计算的是输入区域Regions内,由ImageCol和ImageRow两个通道构成的二维特征空间的直方图。
  • 在这个二维特征空间中,ImageCol的灰度值被解释为行索引,ImageRow的灰度值被解释为列索引。
  • 输出图像Histo2Dim中的每个点P(g1,g2)的灰度值表示(g1,g2)灰度值组合的频率,其中g1表示行索引,g2表示列索引。

注意事项

  1. 在使用histo_2dim算子时,需要确保输入图像的两个通道具有相同的尺寸和数据类型。

2.2 显示直方图

(1) gen_region_histo算子

    Halcon使用gen_region_histo算子用于根据直方图生成一个区域(Region)。该算子将直方图的灰度值分布转换为一个区域,通常用于可视化直方图或基于直方图的分析。

    算子声明

    gen_region_histo(Histogram : Region : Row, Column, Scale : )

    参数说明

    • Histogram: 输入直方图,通常是一个数组,表示灰度值的分布。
    • Region: 输出区域,生成的区域表示直方图的形状。
    • Row: 输入参数,指定生成区域的起始行坐标。
    • Column: 输入参数,指定生成区域的起始列坐标。
    • Scale: 输入参数,指定直方图的缩放比例。

    使用方法

    1. 计算直方图: 使用 gray_histo 或 gray_histo_range 等算子计算图像的直方图。
    2. 设置起始坐标: 指定生成区域的起始位置(Row 和 Column)。
    3. 设置缩放比例: 指定直方图的缩放比例(Scale),用于调整生成区域的大小。
    4. 生成区域: 使用 gen_region_histo 将直方图转换为区域。
    5. 可视化或进一步处理: 对生成的区域进行显示或进一步分析。

    实例:

    * 读取图像
    read_image(Image, 'example_image.png')* 转换为灰度图像
    rgb1_to_gray(Image, GrayImage)* 计算灰度直方图
    gray_histo(GrayImage, GrayImage, Histogram)* 定义直方图的起始位置和缩放因子
    Row := 100
    Column := 100
    Scale := 1.0* 生成基于直方图的区域
    gen_region_histo(RegionHisto, Histogram, Row, Column, Scale)* 显示生成的区域
    dev_display(GrayImage)
    dev_display(RegionHisto)

    注意事项

    • 直方图数据:确保输入的直方图数据是有效的数组。如果直方图数据为空或无效,生成的区域可能为空。
    • 起始坐标:确保 Row 和 Column 在图像范围内,否则生成的区域可能不可见。
    • 缩放比例:缩放比例 Scale 影响生成区域的大小。较大的缩放比例会生成较大的区域。

    (2) get_grayval_range算子

    在显示直方图信息时,Halcon使用了get_grayval_range算子用于获取图像中灰度值的范围(最小值和最大值)。这个算子对于分析图像的灰度分布非常有用,尤其是在直方图计算和图像增强等操作中。

    算子声明

    get_grayval_range(Image : : : MinGray, MaxGray)

    参数说明

    • Image:输入图像(可以是灰度图像或多通道图像)。
    • MinGray:图像中灰度值的最小值。
    • MaxGray:图像中灰度值的最大值。

      3. 直方图操作

      在Halcon中提供的直方图操作主要是两种,直方图均衡和直方图规定化。两者都能实现特定的图像增强目的,但又有区别。

      3.1 直方图均衡

      直方图均衡化Histogram Equalization,简称直方图均衡,HE)是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。

      直方图均衡的基本思想是对图像中占比大的灰度级进行展宽,而对占比小的灰度级进行压缩,使图像的直方图分布较为均匀,扩大灰度值差别的动态范围,从而增强图像整体的对比度。

      Halcon提供了equ_histo_image算子来实现直方图均衡化。

      算子声明

      equ_histo_image(Image : ImageEquHisto : : )

      参数说明

      • Image(输入):输入图像(通常是灰度图像)。
      • ImageEquHisto(输出):直方图均衡化后的图像。

      以下是一个完整的Halcon代码示例,展示如何实现直方图均衡化。

      * 读取图像
      read_image(Image, 'example_image.jpg')* 将图像转换为灰度图像
      rgb1_to_gray(Image, GrayImage)* 显示原始图像
      dev_display(GrayImage)
      dev_set_window(0)
      set_display_font(16, 'mono', 'true', 'false')
      disp_message(0, 'Original Image', 'window', 12, 12, 'black', 'true')
      dev_open_window(0, 512, 512, 512, 'black', WindowHandle1)
      dev_set_window(WindowHandle1)
      disp_message(WindowHandle1, 'Original Histogram', 'window', 12, 12, 'black', 'true')* 计算并显示原始图像的直方图
      gray_histo(GrayImage, GrayImage, AbsoluteHisto, RelativeHisto)
      dev_display(GrayImage)
      dev_set_window(WindowHandle1)
      disp_histogram(AbsoluteHisto, 512, 512, 1, 1, 'absolute', 'true')* 进行直方图均衡化
      equ_histo_image(GrayImage, EquImage)* 显示均衡化后的图像
      dev_open_window(512, 0, 512, 512, 'black', WindowHandle2)
      dev_set_window(WindowHandle2)
      dev_display(EquImage)
      disp_message(WindowHandle2, 'Equalized Image', 'window', 12, 12, 'black', 'true')* 计算并显示均衡化后的直方图
      gray_histo(EquImage, EquImage, AbsoluteHistoEqu, RelativeHistoEqu)
      dev_open_window(512, 512, 512, 512, 'black', WindowHandle3)
      dev_set_window(WindowHandle3)
      disp_message(WindowHandle3, 'Equalized Histogram', 'window', 12, 12, 'black', 'true')
      disp_histogram(AbsoluteHistoEqu, 512, 512, 1, 1, 'absolute', 'true')

      注意事项

      • 输入图像:equ_histo_image 适用于灰度图像。如果输入是彩色图像,需要先转换为灰度图像。

      3.2 计算直方图的统计特性

      除了直方图均衡化处理之外,在计算视觉特征时,还需要计算一些基于直方图的统计特性。Halcon中并没有提供计算这些统计特征量的算子。

      附录:算子列表

      1. gray_histo:计算直方图
      2. gray_histo_abs:计算灰度值分布
      3. equ_histo_image:直方图均衡化
      4. histo_2dim:计算量通道灰度图像的直方图
      5. gen_region_histo:将直方图转换为一个区域,用于展示直方图

      (初稿完成,最新更新2025-02-08)

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

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

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

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

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

      相关文章

      MySQL | Navicat安装教程

      MySQL | Navicat安装教程 🪄个人博客:https://vite.xingji.fun 简介 Navicat 是一款流行的 图形化数据库管理工具,由 PremiumSoft 公司开发,支持多种主流数据库系统(如 MySQL、MariaDB、SQL Server、Oracle、Postgre…

      硬件实现I2C案例(寄存器实现)

      一、需求分析 二、硬件电路设计 本次案例需求与前面软件模拟案例一致,这里不再赘述,不清楚可参见下面文章:软件模拟I2C案例(寄存器实现)-CSDN博客 值得注意的是,前面是软件模拟I2C,所以并没有…

      基于SpringBoot养老院平台系统功能实现六

      一、前言介绍: 1.1 项目摘要 随着全球人口老龄化的不断加剧,养老服务需求日益增长。特别是在中国,随着经济的快速发展和人民生活水平的提高,老年人口数量不断增加,对养老服务的质量和效率提出了更高的要求。传统的养…

      matlab simulink 汽车四分之一模型轮胎带阻尼

      1、内容简介 略 matlab simulink121-汽车四分之一模型轮胎带阻尼 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

      w196Spring Boot高校教师科研管理系统设计与实现

      🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

      数据分析:企业数字化转型的金钥匙

      引言:数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下,有研究表明,只有不到30%的企业能够充分利用手中掌握的数据,这是否让人深思?数据已然成为企业最为宝贵的资产之一。然而,企业是否真正准备好从数…

      Vue 入门到实战 八

      第8章 组合API与响应性 目录 8.1 响应性 8.1.1 什么是响应性 8.1.2 响应性原理 8.2 为什么使用组合API 8.3 setup组件选项 8.3.1 setup函数的参数 8.3.2 setup函数的返回值 8.3.3 使用ref创建响应式引用 8.3.4 setup内部调用生命周期钩子函数 8.4 提供/注入 8.4.1 …

      Java使用aspose实现pdf转word

      Java使用aspose实现pdf转word 一、下载aspose-pdf-21.6.jar包【下载地址】&#xff0c;存放目录结构如图&#xff1b;配置pom.xml。 <!--pdf to word--> <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId>…

      使用Node.js搭配express框架快速构建后端业务接口模块Demo

      使用Node.js搭配express框架快速构建后端业务接口模块Demo&#xff01;实际开发中&#xff0c;有很多项目&#xff0c;其实都是可以使用node.js来完成对接mysql数据库的&#xff0c;express确实使用起来非常简单&#xff0c;入手快&#xff0c;效率非常高。下面是一个简单的案例…

      Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)

      一、协程 1.1、协程 协程&#xff0c;Coroutines&#xff0c;也叫作纤程(Fiber) 协程&#xff0c;全称是“协同程序”&#xff0c;用来实现任务协作。是一种在线程中&#xff0c;比线程更加轻量级的存在&#xff0c;由程序员自己写程序来管理。 当出现IO阻塞时&#xff0c;…

      Unity 加载OSGB(webgl直接加载,无需转换格式!)

      Unity webgl加载倾斜摄影数据 前言效果图后续不足 前言 Unity加载倾斜摄影数据&#xff0c;有很多的插件方便好用&#xff0c;但是发布到网页端均失败&#xff0c;因为webgl 的限制&#xff0c;IO读取失效。 前不久发现一个开源项目: UnityOSGB-main 通过两种方式在 Unity 中…

      【Block总结】PSA,金字塔挤压注意力,解决传统注意力机制在捕获多尺度特征时的局限性

      论文信息 标题: EPSANet: An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network论文链接: arXivGitHub链接: https://github.com/murufeng/EPSANet 创新点 EPSANet提出了一种新颖的金字塔挤压注意力&#xff08;PSA&#xff09;模块&#xff0c;旨…

      【重新认识C语言----结构体篇】

      目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体&#xff1f; 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…

      如何在Vscode中接入Deepseek

      一、获取Deepseek APIKEY 首先&#xff0c;登录Deepseek官网的开放平台&#xff1a;DeepSeek 选择API开放平台&#xff0c;然后登录Deepseek后台。 点击左侧菜单栏“API keys”&#xff0c;并创建API key。 需要注意的是&#xff0c;生成API key复制保存到本地&#xff0c;丢失…

      电脑开机提示按f1原因分析及终极解决方法来了

      经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…

      【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

      【简介】除了单位用户以外&#xff0c;大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙&#xff0c;固件无法达到目前最高版本7.6&#xff0c;这里以最常用的60E为例&#xff0c;演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多&#xff0c;文章分上、下…

      Qt之设置QToolBar上的按钮样式

      通常给QAction设置icon后,菜单栏的菜单项和工具栏(QToolBar)上对应的按钮会同时显示该icon。工具栏还可以使用setToolButtonStyle函数设置按钮样式,其参数为枚举值: enum ToolButtonStyle {ToolButtonIconOnly,ToolButtonTextOnly,ToolButtonTextBesideIcon,ToolButtonTe…

      【从零开始系列】DeepSeek-R1:(本地部署使用)思维链推理大模型,开源的神!——Windows/Linux本地环境测试 + vLLM远程部署服务

      目录 一、环境配置 1.硬件设备评估 2.基础环境安装 3.模型参数下载 (1) huggingface镜像源下载 (2) modelscope魔搭社区下载 &#xff08;推荐&#xff09; 二、基础使用&#xff08;Linux、Window兼容&#xff09; 1.Transformers库自编代码 三、进阶使用&#xff08;仅Lin…

      0207作业

      思维导图 服务器 enum Type{TYPE_REGIST,TYPE_LOGIN };typedef struct Pack{int size;enum Type type;char buf[2048];}pack_t;typedef struct list{union Data{struct List* tail;char str[64];}data;struct List* next;struct List* prev; }List;List* create_node(){List* …

      RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

      #作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…