直方图均衡化实现

news/2024/7/21 6:12:56 标签: 计算机视觉, 人工智能, 图像处理

一 直方图均衡化的概念

直方图均衡化(Histogram Equalization)是一种**增强图像对比度**(Image Contrast)的方法,其主要思想是将一副图像的**灰度直方图分布**通过**累积分布函数**变成**近似均匀分布**(直观上在某个灰阶范围内像素值保持一致 ),从而增强图像的对比度。为了将原图像的亮度范围进行扩展, 需要一个映射函数, 将原图像的像素值均衡映射到新直方图中。

问题1:为什么选择累计分布函数?

均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是8位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

问题2:为什么使用累积分布函数处理后像素值会均匀分布?

对于概率分布函数和累积分布函数,前者的二维图像的灰度直方图是参差不齐的,后者因为人眼视觉系统(HVS),会将小范围内的像素值认为是同一个像素值,即在某个灰阶范围内像素值保持一致,故后者的二维图像的灰度直方图呈现均匀分布;

二 直方图均衡化的原理

假设图像中像素的总数是 N,图像的灰度级数是 L,灰度级空间是[0, L-1],用𝑛_𝑘表示第 k 级灰度(第 k 个灰度级,像素值为 k)在图像内的像素点个数,那么该图像中灰度级为𝑟_𝑘(第 k 个灰度级)出现的概率为:

image

根据灰度级概率,对其进行均衡化处理的计算公式为:

image

式中,k∑j=0Pr(rj)表示累计概率,将该值与灰度级的最大值L−1相乘即得到均衡化后的新灰度级(像素值)式中,∑�=0���(��)表示累计概率,将该值与灰度级的最大值�−1相乘即得到均衡化后的新灰度级(像素值)

三 直方图均衡化的求解过程

求解步骤:

  1. 求输入图像的灰度直方图
  2. 对灰度直方图进行归一化,即概率直方图
  3. 求累计概率直方图(累计分布函数),记作 Trans
  4. 通过 均衡化原理 将 源输入图像的像素值 映射到 均衡化后的图像像素值中去

参考链接:直方图均衡化的原理及实现_直方图均衡化原理-CSDN博客,注:求出Trans后,将图像映射到8位位图(0~255),是 Trans * 255

image

四 直方图均衡化的代码及结果分析

核心代码:

def histCalc(img):
    """
    灰度直方图统计
    :param img: 灰度图
    :return: 直方图
    """
    hist = np.zeros(256)
    rows = img.shape[0]
    cols = img.shape[1]
    for i in range(rows):
        for j in range(cols):
            tmp = img[i][j]
            hist[tmp] = hist[tmp] + 1
    print(hist.shape)
    return hist

def histEqualize(img):
    """
    直方图均衡化
    :param img: 灰度图
    :return: 均衡化的图像
    """
    hist = histCalc(img)
    imgH, imgW = img.shape[0], img.shape[1]
    allPixel = imgH * imgW

    # 计算累计分布函数(变换函数)
    trans = hist / allPixel * 255
    for i in range(1, len(trans)):
        trans[i] = trans[i] + trans[i-1]

    # 均衡化后的图像
    imageEqualize = img.copy()
    for i in range(imgH):
        for j in range(imgW):
            imageEqualize[i][j] = trans[img[i][j]]

    return imageEqualize

运行结果:

image


http://www.niftyadmin.cn/n/5231250.html

相关文章

LangChain(0.0.339)官方文档三:Prompts上(自定义提示模板、使用实时特征或少量示例创建提示模板)

文章目录 一、 Prompt templates1.1 langchain_core.prompts1.2 PromptTemplate1.2.1 简介1.2.2 ICEL 1.3 ChatPromptTemplate1.3.1 使用role创建1.3.2 使用MessagePromptTemplate创建1.3.3 自定义MessagePromptTemplate1.3.3.1 自定义消息角色名1.3.3.2 自定义消息 1.3.4 LCEL…

15.oracle的 listagg() WITHIN GROUP () 行转列函数使用

1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO 20 ; 效果: 2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较常用) SELECT T .DEPTNO, listagg (T .ENAME, ,) WIT…

.netcore 操作aspose.words导出pdf

个人重点关注的是生成曲线图的部分,浪费了我很多时间 chart.Legend.Position LegendPosition.Top; 控制图形的显示位置,这个地方好像必须要选一个位置,否则会内容显示不全,我开始用的LegendPosition.None,他就显示…

19.OpenCV Mat的位操作

OpenCV Mat的位操作 文章目录 OpenCV Mat的位操作bitwise_orbitwise_andbitwise_xorbitwise_notreference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 bitwise_or 对Mat中的数据按位取或,也就是取不为0的部分。 对于单通…

SkyWalking9.x搭建

简介 Skywalking是一款分布式的系统 性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是一款 观察性的分析平台和应用性能管理系统,提供了 分布式追踪、性能指标分析、应用服务依赖分析、可视化一体化等解决方…

IDEA2023.2.3 servlet.java中import com.alibaba.fastjson.JSONObject;标红问题解决

IDEA提示 java: 程序包com.alibaba.fastjson不存在_mob64ca12e98e58的技术博客_51CTO博客 2023/12/1 域名小李

Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)

文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 01 简介 在使用python开发的过程中,有时需要一些简单的数据库操作,而Peewee正是理想的选择,它是一个小巧而灵活的 Python ORM(对…

R语言中的机器学习

转载自 R中文论坛(http://rbbs.biosino.org/Rbbs/posts/list/192.page) Machine Learning & Statistical Learning (机器学习 & 统计学习) 网址:http://cran.r-project.org/web/views/MachineLearning.html维护人员:To…