【数字图像处理】直方图均衡化

news2025/1/17 18:00:27

文章目录

  • 1. 算法原理
  • 2. 算法缺陷及改进
    • 2.1 缺陷
    • 2.2 改进
  • 3. 实现
    • 3.1 调包侠版本
    • 3.2 自由发挥版本

1. 算法原理

直方图均衡化是一种常见的图像增强方法,可以增强图像的对比度。其数学原理如下:

首先,我们需要了解直方图的概念。直方图是对图像像素分布的一种统计,它将每个像素值出现的次数记录下来,并以图形的方式呈现出来。在一幅图像中,像素值的范围通常是有限的。例如,对于一个 8 位灰度图像,像素值的范围是 0 到 255。

直方图均衡化的目的是将一幅图像的直方图变成一个均匀分布的直方图,从而增强图像的对比度。具体来说,直方图均衡化的步骤如下:

  1. 统计原始图像的直方图。我们可以计算每个像素值出现的次数,然后将它们归一化,得到每个像素值的频率。

  2. 计算累计分布函数(CDF)。CDF 是对频率分布函数(PDF)的积分,它表示每个像素值在原始图像中出现的概率。CDF 可以通过对 PDF 进行累加计算得到。对于一个灰度值 i,CDF 的计算公式如下:
    在这里插入图片描述
    其中, P ( j ) P(j) P(j) 表示灰度值为 j j j 的像素在图像中出现的频率。

  3. 计算均衡化后的像素值。我们需要将原始图像中的每个像素值映射到一个新的像素值,使得均衡化后的直方图近似为一个均匀分布的直方图。这个映射函数可以通过以下公式计算:
    在这里插入图片描述
    其中, H ( i ) H(i) H(i) 表示映射后的像素值, M M M N N N 分别表示图像的宽度和高度, L L L 表示像素值的范围, m i n min min 表示原始图像中的最小像素值。

  4. 将原始图像中的像素值替换为映射后的像素值。这样就完成了直方图均衡化的过程。

总的来说,直方图均衡化的数学原理就是通过对原始图像的直方图进行变换,将其变成一个均匀分布的直方图,从而增强图像的对比度。

2. 算法缺陷及改进

2.1 缺陷

尽管直方图均衡化是一种简单且有效的图像增强算法,但它也存在一些缺陷:

  1. 全局变换:直方图均衡化是一种全局变换方法,它将整个图像的直方图都变成了均匀分布的直方图,这可能会导致一些像素值的细节信息丢失或被模糊化。

  2. 非线性变换:直方图均衡化的映射函数是非线性的,这意味着它会改变像素值之间的距离,从而可能导致一些图像特征的失真。

  3. 计算复杂度:直方图均衡化需要计算原始图像的直方图和累计分布函数,这可能会增加算法的计算复杂度,尤其是对于大型图像。

  4. 对噪声敏感:由于直方图均衡化是一种全局变换,它对图像中的噪声也会进行增强,可能会使噪声更加明显。

因此,在实际应用中,直方图均衡化算法可能需要结合其他方法进行优化或改进,以克服其缺陷。例如,可以使用局部直方图均衡化等技术来改进算法的局限性。

2.2 改进

限制对比度自适应直方图均衡化(CLAHE)是一种改进的直方图均衡化算法,它通过在图像的局部区域内进行直方图均衡化,以保留图像的局部细节信息。

CLAHE 的基本原理如下:

  1. 将原始图像分成许多小块(或称为子图像),每个小块大小为 N × N N \times N N×N

  2. 对于每个小块,计算其直方图,并将直方图进行均衡化,得到映射函数。

  3. 对于每个小块,使用对应的映射函数对其像素值进行变换。

  4. 由于像素值在小块之间可能存在不连续的变化,因此需要进行插值处理,以使得整个图像的对比度保持连续。

CLAHE 的优点如下:

  1. 保留了图像的局部细节信息,不会将整个图像都变成均匀分布的直方图。

  2. 具有自适应性,可以根据图像的局部特征来调整直方图均衡化的参数。

  3. 通过限制对比度,可以有效地减少直方图均衡化算法对噪声的敏感性。

CLAHE 的缺点如下:

  1. 对计算资源的要求较高,需要对整个图像进行分块、直方图均衡化和插值处理,因此计算量较大。

  2. 对算法的参数设置较为敏感,需要合理地设置参数,以获得良好的增强效果。

  3. 由于对比度的限制,可能会导致一些像素值的变化受到限制,从而降低图像的视觉效果。

综上所述,CLAHE 是一种比较优秀的图像增强算法,可以有效地保留图像的局部细节信息,但其计算量较大,对算法的参数设置较为敏感,需要进行合理的参数设置和优化。

3. 实现

3.1 调包侠版本

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取原始图像
img = cv2.imread('example.jpg', 0)

# 判断图像是否为灰度图
if len(img.shape) == 2:
    print('The image is a grayscale image.')
else:
    # 将RGB图像转换为灰度图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    print('The image is a RGB image. Converting to grayscale...')

# 降低图像的对比度
img = img.astype(np.float32) / 255.0
img_low_contrast = np.power(img, 2.2) * 255.0

# 将图像转换为uint8
img_low_contrast = np.uint8(img_low_contrast)
# 进行直方图均衡化
img_he = cv2.equalizeHist(img_low_contrast)
# 进行自适应直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_clahe = clahe.apply(img_low_contrast)

# 显示原始图像、降低对比度后的图像和均衡化后的图像
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(img_low_contrast, cmap='gray')
plt.title('Low Contrast Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_he, cmap='gray')
plt.title('Equalized Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_clahe, cmap='gray')
plt.title('Adaptive Equalized Image'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

3.2 自由发挥版本

TODO

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

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

相关文章

Bezier Curve 贝塞尔曲线 - 在Unity中实现路径编辑

文章目录简介一阶贝塞尔曲线二阶贝塞尔曲线三阶贝塞尔曲线图形理解 Bezier Curve一阶贝塞尔曲线二阶贝塞尔曲线三阶贝塞尔曲线应用Bezier CurveSimpleBezierCurvePathSimpleBezierCurvePathAlonger简介 贝塞尔曲线(Bezier Curve),又称贝兹曲…

人工智能概述

一、人工智能发展必备三要素 算法 数据 算力 CPU、GPU、TPU 计算力之CPU、GPU对比: CPU主要适合I\O密集型任务GPU主要适合计算密集型任务 什么样的程序适合在GPU上运行? 计算密集型的程序 所谓计算密集型(Compute-intensive)的程序,就是…

【K8S系列】深入解析无状态服务

目录 序言 1. 无服务介绍 1.1 优点 1.2 使用场景 1.3 资源类型 1.4 总结 2 使用介绍 2.1 Deployment 使用场景: 2.2 ReplicaSet 使用场景 2.3 pod Pod 资源定义示例 2.4 service 创建一个Deployment: 创建一个Service: 总结…

前置知识——Linux网络虚拟化

Linux网络虚拟化 信息是如何通过网络传输被另一个程序接收到的? 我们讨论的虚拟化网络是狭义的,它指容器间网络。 好了,下面我们就从 Linux 下网络通信的协议栈模型,以及程序如何干涉在协议栈中流动的信息来开始了解吧。 Linux…

基于飞桨实现的特定领域知识图谱融合方案:ERNIE-Gram文本匹配算法

文本匹配任务在自然语言处理领域中是非常重要的基础任务,一般用于研究两段文本之间的关系。文本匹配任务存在很多应用场景,如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重、文本相似度计算、自然语言推理、问答系统、信息检索等&…

【MySQL】了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/

目录 ID select_type 查询类型 table 表名 type 关联类型/访问类型 possible_keys MySQL觉得可能要用到的索引 key 实际用到的索引 key_len 用到的索引的长度(比如可用于判断使用了联合索引中的哪几个) ref 表查找值所用的列(表名.字…

Transformer在计算机视觉中的应用-VIT、TNT模型

上期介绍了Transformer的结构、特点和作用等方面的知识,回头看下来这一模型并不难,依旧是传统机器翻译模型中常见的seq2seq网络,里面加入了注意力机制,QKV矩阵的运算使得计算并行。 当然,最大的重点不是矩阵运算&…

行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)

摘要:行人车辆检测与计数系统用于交通路口行人及车辆检测计数,道路人流量、车流量智能监测,方便记录、显示、查看和保存检测结果。本文详细介绍行人车辆检测,在介绍算法原理的同时,给出Python的实现代码、PyQt的UI界面…

【并发编程Python】一文详解Python并发编程,协程、线程、进程

并发编程简介和一些前缀知识 并发编程是使得程序大幅度提速的。在并发编程中,程序可以同一时间执行多个任务,这有助于提高程序的吞吐量和响应时间。并发编程设计的主要概念包括线程、锁、同步、信号量、进程间通信等。 前缀知识: IO&#x…

Linux中shell内外命令讲解(上)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 前言 本章Linuxshell讲解,感谢观看,干货满满。 目录…

在windows内使用virtualbox搭建安卓x86,以及所遇到的问题解决--2.virtualbox上安卓x86的配置

目录: 简要说明: 1.配置vesa驱动: 2.启用网络连接并配置adb: 3.增强性能的方法: 简要说明: 先进行说明一点个人直接通过vbox VMware这些软件,并不能超越专业的安卓模拟器,大部分模拟器实际…

使用Pytorch实现对比学习SimCLR 进行自监督预训练

SimCLR(Simple Framework for Contrastive Learning of Representations)是一种学习图像表示的自监督技术。 与传统的监督学习方法不同,SimCLR 不依赖标记数据来学习有用的表示。 它利用对比学习框架来学习一组有用的特征,这些特征…

【创作赢红包】Java Web 实战 18 - 计算机网络之网络层协议 and 数据链路层协议

文章目录网络层协议1. IP 协议1.1 报头结构1.2 IP 协议的地址管理动态分配 IP 地址 (DHCP)IP 地址转换 (NAT)IPv61.3 IP 地址的组成2. 路由选择数据链路层1. 以太网协议2. 以太网帧格式2.1 mac 地址2.2 两个特殊的以太网数据帧DNS 域名解析系统六 . 经典面试题 : 从浏览器中输入…

微信小程序 | 基于ChatGPT实现模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网…

小白学Pytorch系列--Torch API (7)

小白学Pytorch系列–Torch API (7) Comparison Ops allclose 此函数检查输入和其他是否满足条件: >>> torch.allclose(torch.tensor([10000., 1e-07]), torch.tensor([10000.1, 1e-08])) False >>> torch.allclose(torch.tensor([10000., 1e-…

MATLAB | 如何自然好看的从图片中提取颜色并制作色卡

在这里研究了一下各种排序算法,写一篇如何由图片一键生成颜色条的方法。 1 关于大量颜色排序 假设有大量颜色怎么对其进行排序呢,首先想到的最简单方法就是将其按照RGB值的大小进行排序,为了方便展示颜色条,这里编写了一个颜色条…

【Pytorch】 理解张量Tensor

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录张量Tensor是什么?张量的创建为什么要用张量Tensor呢?总结张量Tensor是什么? 在深度学习中,我们经常会遇到一个概念&#xff…

初探Redis整体架构

文章目录1、Redis为什么选择单线程2、逐步加入多线程3、Redis采用IO多路复用---epoll和Reactor架构4、Redis6/7默认是否开启了多线程?1、Redis为什么选择单线程 这种问法其实并不严谨,为啥这么说呢? Redis几个里程碑式的重要版本 理清一个事实&#…

一文带你安装opencv和常用库(保姆级教程少走80%的弯路)

0.导语 离上一个opencv安装保姆级教程发布已经过去了快一年了,这一年来我收到了来自很多C友的鼓励。打算学opencv的各位朋友都会在安装opencv和各种库过程中浪费掉60%的时间和精力;博主在这一年来尝试各种各样的安装方法,全网搜集各种资料总…

[ 云计算 | Azure ] Chapter 05 | 核心体系结构之管理组、订阅、资源和资源组以及层次关系

本文主要对如下内容进行讲解:Azure云计算的核心体系结构组件中的:资源、订阅和资源组,以及了解 Azure 资源管理器 (ARM) 如何部署资源。 本系列已经更新文章列表: [ 云计算 | Azure ] Chapter 03 | 描述云计算运营中的 CapEx 与…