Python学习之直方图均衡化原理详解

目录
  • 1.点算子
  • 2.线性灰度变换
  • 3.直方图均衡化
  • 4.代码实战

1.点算子

点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算。点算子是最简单的图像处理手段,如:亮度调整、对比度调整、颜色变换、直方图均衡化等等。

2.线性灰度变换

线性灰度变换表达为:

其中rk、sk分别为输入、输出点像素灰度值。

▲图2.1 线性灰度变换

当a>1时,输出图像像素灰度范围扩大,图像对比度增强,当a<1时反之。这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够清晰。当a=1、b≠0时,点算子使图像灰度整体上移或下移,即整体变亮或变暗。

▲图2.2 图像对比度(左为弱对比度,右为强对比度)

3.直方图均衡化

下图再次给出了关于图像对比度的例子。

▲图3.1 图像对比度示例

直方图均衡化是以累计分布函数为核心,将原始图像灰度直方图从比较集中的某个灰度区间,非线性地映射为在全部灰度范围内的较均匀分布,从而增强对比度。

下面阐述直方图均衡化的数学原理。首先作原始图像灰度的概率直方图如图。

▲图3.2 直方图均衡化原理

设输入像素灰度值为rk,累计分布函数为

其中ni为图像中灰度值为ri的像素频数,n为图像像素总数。设输出像素灰度值为sk,像素范围为smin-smax。期望输出灰度直方图是均匀分布,即

令C(sk)=C(rk),即得

所以最终直方图均衡化的点算子为

所以最终直方图均衡化的点算子为

4.代码实战

按照前文的原理编写累积分布函数计算公式,以及均衡化算子

# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()
# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')

均衡化时直接调用函数即可,下面给出完整代码

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

# 计算累计分布函数
def C(rk):
  # 读取图片灰度直方图
  # bins为直方图直方柱的取值向量
  # hist为bins各取值区间上的频数取值
  hist, bins = np.histogram(rk, 256, [0, 256])
  # 计算累计分布函数
  return hist.cumsum()

# 计算灰度均衡化映射
def T(rk):
  cdf = C(rk)
  # 均衡化
  cdf = (cdf - cdf.min()) * (255 - 0) / (cdf.max() - cdf.min()) + 0
  return cdf.astype('uint8')

# 读取图片
img = cv.imread('1.png', 0)
# 将二维数字图像矩阵转变为一维向量
rk = img.flatten()

# 原始图像灰度直方图
plt.hist(rk, 256, [0, 255], color = 'r')
cv.imshow("原图像",img)

# 直方图均衡化
imgDst = T(rk)[img]
cv.imshow("直方图均衡化后的图像",imgDst)
plt.hist(imgDst.flatten(), 256, [0, 255], color = 'b')

plt.show()

看看效果:

▲图4.1 直方图均衡化效果(灰度直方图)

▲图4.2 均衡化前

▲图4.3 均衡化后

以上就是Python学习之直方图均衡化原理详解的详细内容,更多关于Python直方图均衡化的资料请关注我们其它相关文章!

(0)

相关推荐

  • python 对一幅灰度图像进行直方图均衡化

    from PIL import Image from pylab import * from numpy import * def histeq(im,nbr_bins = 256): """对一幅灰度图像进行直方图均衡化""" #计算图像的直方图 #在numpy中,也提供了一个计算直方图的函数histogram(),第一个返回的是直方图的统计量,第二个为每个bins的中间值 imhist,bins = histogram(im.flatten(

  • Python OpenCV直方图均衡化详解

    目录 前言 灰度直方图均衡化 颜色直方图均衡化 前言 图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具,可以使用它们来完成各种计算机视觉任务.在本文中,将介绍如何使用 OpenCV 函数 cv2.equalizeHist() 执行直方图均衡,并将其应用于灰度和彩色图像,cv2.equalizeHist() 函数将亮度归一化并提高图像的对比度. 灰度直方图均衡化 使用 cv2.equalizeHist() 函数来均衡给定灰度图像的对比度: # 加载图像并转换为灰度图像 imag

  • OpenCV-Python直方图均衡化实现图像去雾

    直方图均衡化 直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像.这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(HSV)的视觉均衡. 一般来说,直方图均衡化可以达到增强图像显示效果的目的.最常用的比如去雾.下面,我们来分别实现灰度图像去雾以及彩色图像去雾. 实现灰度图像去雾 在OpenCV中,它提供了函数cv2.equalizeHist()来实现直方图均衡化,该函数的完整定义如下: def equalizeHist(src, d

  • Python cv2 图像自适应灰度直方图均衡化处理方法

    __author__ = 'Administrator' import numpy as np import cv2 mri_img = np.load('mri_img.npy') # normalization mri_max = np.amax(mri_img) mri_min = np.amin(mri_img) mri_img = ((mri_img-mri_min)/(mri_max-mri_min))*255 mri_img = mri_img.astype('uint8') r,

  • OpenCV利用python来实现图像的直方图均衡化

    1.直方图 直方图: (1) 图像中不同像素等级出现的次数 (2) 图像中具有不同等级的像素关于总像素数目的比值. 我们使用cv2.calcHist方法得到直方图 cv2.calcHist(images, channels, mask, histSize, ranges): -img: 图像 -channels: 选取图像的哪个通道 -histSize: 直方图大小 -ranges: 直方图范围 cv2.minMaxLoc: 返回直方图的最大最小值,以及他们的索引 import cv2 impo

  • 详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_histogram_equalization.html 考虑一个图像,其像素值仅限制在特定的值范围内.例如,更明亮的图像将使所有像素都限制在高值中.但是一个好的图像会有来自图像的所有区域的像素.所以你需要把这个直方图拉伸到两端(如下图所给出的),这就是直方图均衡的作用(用简单的话说).这通常会改善图像的

  • python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histogram(image,nbins=256) 在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义. 返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值 import numpy as np from s

  • Python学习之直方图均衡化原理详解

    目录 1.点算子 2.线性灰度变换 3.直方图均衡化 4.代码实战 1.点算子 点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算.点算子是最简单的图像处理手段,如:亮度调整.对比度调整.颜色变换.直方图均衡化等等. 2.线性灰度变换 线性灰度变换表达为: 其中rk.sk分别为输入.输出点像素灰度值. ▲图2.1 线性灰度变换 当a>1时,输出图像像素灰度范围扩大,图像对比度增强,当a<1时反之.这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够

  • Python深度强化学习之DQN算法原理详解

    目录 1 DQN算法简介 2 DQN算法原理 2.1 经验回放 2.2 目标网络 3 DQN算法伪代码 DQN算法是DeepMind团队提出的一种深度强化学习算法,在许多电动游戏中达到人类玩家甚至超越人类玩家的水准,本文就带领大家了解一下这个算法,论文的链接见下方. 论文:Human-level control through deep reinforcement learning | Nature 代码:后续会将代码上传到Github上... 1 DQN算法简介 Q-learning算法采用一

  • python装饰器的特性原理详解

    这篇文章主要介绍了python装饰器的特性原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天发现了装饰器的另一种用法,下面就先上代码: data_list = [] def data_item(func): data_list.append(func) return func @data_item def foo(): return 1 @data_item def foo1(): return 2 @data_item def fo

  • Python JSON编解码方式原理详解

    这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: 使用json函数 使用 JSON 函数需要导入 json 库:import json.函数含义: 源码解析: # coding= utf-8 #

  • python神经网络Batch Normalization底层原理详解

    目录 什么是Batch Normalization Batch Normalization的计算公式 Bn层的好处 为什么要引入γ和β变量 Bn层的代码实现 什么是Batch Normalization Batch Normalization是神经网络中常用的层,解决了很多深度学习中遇到的问题,我们一起来学习一哈. Batch Normalization是由google提出的一种训练优化方法.参考论文:Batch Normalization Accelerating Deep Network T

  • Python学习之字符串函数使用详解

    目录 1 搜索字符串函数 2 设置字符串格式函数 3 改变字符串大小写函数 4 选定字符串函数 5 拆分字符串函数 6 替换字符串函数 Python的友好在于提供了非常好强大的功能函数模块,对于字符串的使用,同样提供许多简单便捷的字符串函数.Python 字符串自带了很多有用的函数,在字符串函数之前先介绍一个非常实用的dir()内置函数,因为对每一个初学者还是大佬级别的python程序员,都不能完全记住所有方法.而该函数可以查看所有这些函数,可调用 dir 并将参数指定为任何字符串(如 dir(

  • Python学习之模块化程序设计示例详解

    目录 关于模块化程序设计 水果仓库功能简介 主功能实现与程序入口 实现添加功能 实现列出所有信息功能 实现查询信息功能 实现删除信息功能 完整程序如下 关于模块化程序设计 什么是模块化程序设计? 程序设计的模块化指的是在进行程序设计时,把一个大的程序功能划分为若干个小的程序模块.每一个小程序模块实现一个确定的功能,并且在这些小程序模块实现的功能之间建立必要的联系,通过各个小模块之间的互相协作完成整个大功能实现的方法. 模块化设计程序的方法? 一般在针对实现比较复杂程序的情况下,采用的是自上而下的

  • Python学习之包与模块详解

    目录 什么是 Python 的包与模块 包的身份证 如何创建包 创建包的小练习 包的导入 - import 模块的导入 - from…import 导入子包及子包函数的调用 导入主包及主包的函数调用 导入的包与子包模块之间过长如何优化 强大的第三方包 什么是第三方包 如何安装第三方包 总结 大家好,学完面向对象与异常处理机制之后,接下里我们要学习 包与模块 .首先我们要了解什么是包?什么是模块?接下来我们还要学习 如何自定义创建包.自定义创建模块以及如何导入包与模块.最后我们在学习如何使用第三方

  • Python学习之文件的读取详解

    目录 文件读取的模式 文件对象的读取方法 使用 read() 函数一次性读取文件全部内容 使用 readlines() 函数 读取文件内容 使用 readline() 函数 逐行读取文件内容 mode().name().closed() 函数演示 文件读取小实战 with open() 函数 利用with open() 函数读取文件的小实战 上一章节 我们学习了如何利用 open() 函数创建一个文件,以及如何在文件内写入内容:今天我们就来了解一下如何将文件中的内容读取出去来的方法. 文件读取的

  • Python学习之随机模块random详解

    目录 random.random() random.uniform() random.randint() random.choice() random.sample() random.randrange() random 模块 - 抽奖小案例 random 模块 - 双色球小案例 该章节我们来学习一下 Python 中非常简单但也非常有用的模块 —> random ,此模块主要用于生成随机数.接下面我们就来了解一下 random 模块中最常见的几种方法. random.random() 功能:随

随机推荐