当前位置: 首页 > article >正文

基础篇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.kler.cn/a/536272.html

      相关文章:

    • 8. k8s二进制集群之Kubectl部署
    • 【Leetcode 每日一题】47. 全排列 II
    • GPU-Z重磅更新,Blackwell架构全面支持
    • HTML 复习
    • 基于HTML生成网页有什么优势
    • DeepSeek各版本说明与优缺点分析
    • OpenHarmony上运行Ollama玩转本地大模型
    • React 与 Next.js
    • D. CGCDSSQ
    • 十三、Dockerfile 常用镜像创建
    • RabbitMQ业务场景面试题
    • yum 安装mysql
    • VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理
    • 如何使用iframe来渲染ThingsBoard仪表盘
    • LabVIEW与PLC交互
    • 【Spring】什么是Spring?
    • SAP物料账未分配差异-采购发票数量大于库存数量
    • 多无人机--强化学习
    • 20.责任链模式(Chain of Responsibility Pattern)
    • 搜索+图论1 练习答案+思路
    • 蓝桥算法基础2
    • EtherCAT帧捕获与帧结构分析
    • 基于Bootstrap + Java + Oracle实现的电商平台
    • DeepSeek图解10页PDF
    • STM32自学记录(八)
    • 【ArcGIS Pro 简介1】