基础篇05-直方图操作

news/2025/2/6 17:34:00/

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

目录

1. 引言

2. 获取并显示直方图

2.1 获取(灰度)直方图

2.2 显示直方图

3. 直方图操作

3.1 直方图均衡


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 获取(灰度)直方图

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

算子声明

gray_histogram(Image : : : AbsoluteHisto, RelativeHisto)

参数说明

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

注意事项

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

2.2 显示直方图

在Halcon中使用create_histo2d算子将直方图转换为图像形式进行显示。

算子声明

create_histo2d(HistogramData : HistogramImage : XScale, YScale : )

参数说明

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

一般步骤

  1. 读取图像:使用 read_image 读取图像。
  2. 转换为灰度图像:如果图像是彩色的,使用 rgb1_to_gray 将其转换为灰度图像。
  3. 计算直方图:使用 gray_histogram 计算图像的绝对直方图和归一化直方图。
  4. 获取灰度值范围:使用 get_grayval_range 获取图像的最小和最大灰度值。
  5. 创建直方图图像:使用 create_histo2d 将直方图数据转换为图像形式。
  6. 设置显示窗口:使用 dev_open_window 和 dev_set_window 设置显示窗口。
  7. 显示原图和直方图:使用 dev_display 分别显示原图和直方图。

以下是一个完整的Halcon代码示例,展示如何获取图像的直方图并绘制结果。

* 读取图像
read_image(Image, 'example_image.jpg')* 将图像转换为灰度图像(如果图像是彩色的)
rgb1_to_gray(Image, GrayImage)* 计算图像的直方图
gray_histogram(GrayImage, AbsoluteHisto, RelativeHisto)* 获取图像的灰度值范围
get_grayval_range(GrayImage, MinGray, MaxGray)* 创建直方图的可视化图像
create_histo2d(AbsoluteHisto, HistogramImage, 1, 1)* 设置显示窗口
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_set_window(WindowHandle)* 显示原图
dev_display(GrayImage)* 显示直方图
dev_open_window(0, 512, 512, 512, 'black', HistogramWindowHandle)
dev_set_window(HistogramWindowHandle)
dev_display(HistogramImage)

注意事项

  • 如果输入图像是彩色的,需要先转换为灰度图像。
  • 使用get_grayval_range算子获取图像的最小和最大灰度值。
  • 如果要显示直方图,需要使用create_histo2d算子将直方图转换为图像的函数,方便可视化。

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)* 对图像进行直方图均衡化
equ_histo_image(GrayImage, ImageEquHisto)* 设置显示窗口
dev_open_window(0, 0, 512, 512, 'black', WindowHandle1)
dev_set_window(WindowHandle1)
dev_display(GrayImage)
dev_open_window(512, 0, 512, 512, 'black', WindowHandle2)
dev_set_window(WindowHandle2)
dev_display(ImageEquHisto)* 显示消息
disp_message(WindowHandle1, 'Original Image', 'window', 12, 12, 'black', 'true')
disp_message(WindowHandle2, 'Histogram Equalized Image', 'window', 12, 12, 'black', 'true')

注意事项

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

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

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

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

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


http://www.ppmy.cn/news/1569853.html

相关文章

毕业设计--具有车流量检测功能的智能交通灯设计

摘要: 随着21世纪机动车保有量的持续增加,城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题,本文设计了一款智能交通灯系统,利用车流量检测功能和先进的算法实现了…

JVM方法区

一、栈、堆、方法区的交互关系 二、方法区的理解: 尽管所有的方法区在逻辑上属于堆的一部分,但是一些简单的实现可能不会去进行垃圾收集或者进行压缩,方法区可以看作是一块独立于Java堆的内存空间。 方法区(Method Area)与Java堆一样,是各个…

ExternalName Service 针对的是k8s集群外部有api服务的场景?

是的,**ExternalName Service 正是专门用于将 Kubernetes 集群内部的应用请求代理到外部服务(如 API、数据库等)的场景**。以下是详细说明: --- ### **ExternalName Service 的核心作用** ExternalName Service 通过 **DNS CNAM…

GAN(生成对抗网络,Generative Adversarial Network)

https://www.bilibili.com/video/BV1mp4y187dm/?spm_id_from333.788.recommend_more_video.2&vd_source35b06c13f470dff84c947fa3045bafc3

JDK9新特性

文章目录 新特性:1.模块化系统使用模块化module-info.java:exports:opens:requires:provides:uses: 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量:/var…

基于ArcGIS的SWAT模型+CENTURY模型模拟流域生态系统水-碳-氮耦合过程研究

流域是一个相对独立的自然地理单元,它是以水系为纽带,将系统内各自然地理要素连结成一个不可分割的整体。碳和氮是陆地生态系统中最重要的两种化学元素,而在流域系统内,水-碳-氮是相互联动、不可分割的耦合体。随着流域内人类活动…

复制粘贴小工具——Ditto

在日常工作中,复制粘贴是常见的操作,但Windows系统自带的剪贴板功能较为有限,只能保存最近一次的复制记录,这对于需要频繁复制粘贴的用户来说不太方便。今天,我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…

华为OD机试E卷 --快递投放问题 --24年OD统一考试(Java JS Python C C++)

文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码题目描述 有N个快递站点用字符串标识,某些站点之间有道路连接。 每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站Q会导致部分货物无法通行,计算哪些货物无法正…