OpenCV 直方图均衡化的实现原理解析

yizhihongxing

OpenCV 直方图均衡化的实现原理解析

前言

图像处理涉及到众多的算法和方法,而图像增强是其中一大类。在这类算法中,直方图均衡化(Histogram Equalization)被广泛应用。该算法背后的原理是调整图像的灰度级使其均匀分布,从而增强图像的对比度。

直方图均衡化的实现原理

在 OpenCV 中,直方图均衡化是通过 cv2.equalizeHist() 函数实现的。该函数接受单通道图像作为输入,并返回均衡化后的图像。

直方图均衡化的实现过程如下:

  1. 计算输入图像的像素直方图
  2. 计算归一化累计直方图
  3. 计算输出像素值
  4. 将输出像素值映射回图像中

计算输入图像的像素直方图

像素直方图是图像中各个像素值的出现次数统计图。它可以指导我们了解图像亮度的分布状况。在计算过程中,我们需要遍历图像中的每个像素并计算它的像素值。最后,我们将它们计算到直方图中。

以下是一个计算像素直方图的 OpenCV 示例代码:

import cv2
import numpy as np

img = cv2.imread('image.png', 0)

hist = cv2.calcHist([img], [0], None, [256], [0, 256])

在这段代码中,使用 cv2.imread() 函数读入一张灰度图像,并使用 cv2.calcHist() 函数计算直方图。我们可以将 hist 打印到屏幕上了解到图像的灰度级分布情况。

计算归一化累计直方图

归一化累计直方图是在像素直方图的基础上得出来的。它除了考虑像素值外,还将其乘以间隔宽度,这一步被称为归一化。这种方式不同的灰度值之间的权重,可以在均衡化过程中发挥作用。计算后即可获得归一化的累计直方图。

OpenCV 中 cv2.equalizeHist() 函数所用的累计直方图是归一化的。以下是一个计算归一化累计直方图的 OpenCV 示例代码:

import cv2
import numpy as np

img = cv2.imread('image.png', 0)

hist, bins = np.histogram(img.flatten(), 256, [0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()

plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(), 256, [0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

计算输出像素值

当前的像素值不能作为最终的输出值,需要计算一个新的像素值来实现均衡化。新的像素值是归一化累积直方图的插值结果。,通过统计累计直方图,我们可以得到灰度级映射表。新的像素值即为以当前像素值为下标的累积分布函数值。在 OpenCV 中,相应的代码如下:

import cv2
import numpy as np

img = cv2.imread('image.png', 0)

hist, bins = np.histogram(img.flatten(), 256, [0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()

cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')

img2 = cdf[img]

在这段代码中,我们通过计算 cdf 来获取灰度级映射表,并将其应用到原始图像 img 中,从而获得均衡化后的图像 img2

将输出像素值映射回图像中

通过上面的步骤,我们已经得到了均衡化后的图像 img2 。现在,将其重新映射回原始的灰度级,我们就可以获取到最终的均衡化图像了。在 OpenCV 中,相应的代码如下:

import cv2
import numpy as np

img = cv2.imread('image.png', 0)

hist, bins = np.histogram(img.flatten(), 256, [0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()

cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')

img2 = cdf[img]

cv2.imshow('Original Image', img)
cv2.imshow('Equalized Image', img2)

cv2.waitKey(0)
cv2.destroyAllWindows()

总结

直方图均衡化是一种常见的图像增强方法,是所有图像处理人员必须掌握的技能之一。通过本文的讲解,您已经掌握了 OpenCV 中直方图均衡化的实现原理和应用方法。希望您能够在今后的工作中熟练地应用这一技能,并取得更好的图像增强效果。

参考

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV 直方图均衡化的实现原理解析 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • FastDFS安装和配置整合Nginx-1.13.3的方法

    下面我来为您详细讲解如何安装和配置FastDFS,并整合Nginx-1.13.3的方法。 一、FastDFS安装 首先进入FastDFS官网http://fastdfs.org/下载解压缩包,然后进入FastDFS目录下,执行以下命令安装FastDFS: ./make.sh && ./make.sh install 安装完成后,我们需要修改f…

    人工智能概览 2023年5月25日
    00
  • PyTorch加载自己的数据集实例详解

    下面我将详细讲解“PyTorch加载自己的数据集实例详解”的完整攻略。 1. 准备数据集 首先,我们需要准备好自己的数据集。数据集可以包含多个文件,但一般来说都会有一些通用的文件,如图片文件和标注文件。在准备数据集时需要注意以下几点: 数据集应该遵循一定的规范,如文件命名、文件格式等。 数据集应该包含训练集、验证集和测试集,且每个集合中的数据应该尽量均匀分布…

    人工智能概论 2023年5月25日
    00
  • jenkins自动构建发布vue项目的方法步骤

    下面是Jenkins自动构建发布Vue项目的方法步骤的完整攻略: 1. 环境准备 在开始构建前,需要确保系统中已经安装好以下环境: Jenkins 服务端 Node.js 运行环境 Vue CLI 脚手架工具 2. 创建 Jenkins 的 Pipeline 在 Jenkins 的管理界面点击“新建 Item”按钮,选择“Pipeline”类型,设置好名称和…

    人工智能概论 2023年5月25日
    00
  • python实现健康码查验系统

    Python实现健康码查验系统的攻略 随着新冠疫情的持续发展,健康码已经成为了人们出行的必备证件。因此,实现一个健康码查验系统也就显得非常有必要了。Python作为一种高效、灵活的编程语言,可以帮助我们实现这样一个系统。以下是实现该系统的详细攻略: 1. 确定需求 健康码查验系统的需求主要包括如下几个方面: 读取健康码二维码图片; 解析二维码中的信息(解码算…

    人工智能概览 2023年5月25日
    00
  • 使用PM2+nginx部署python项目的方法示例

    我将为您提供一份“使用PM2+nginx部署python项目的方法示例”的完整攻略,其中包含了详细的步骤说明和两个示例。 前置条件 在开始前,请确保您的环境已经安装好了以下软件: Node.js PM2 Nginx 同时,您也需要一份 Python 项目代码。 步骤一:安装配置PM2 在命令行中执行以下命令安装 PM2: npm install pm2 -g…

    人工智能概览 2023年5月25日
    00
  • Django基于Token的验证使用的实现

    Django基于Token的验证是一种常用的认证方式,它可以完美地支持RESTful API的认证,以及Web页面的认证,也具有较好的安全性。下面将介绍Django基于Token的验证的实现步骤。 1. 安装Django Rest Framework 首先需要在Django项目中安装Django Rest Framework,它是Django中一个流行的RE…

    人工智能概论 2023年5月25日
    00
  • 扫描仪一点通

    “扫描仪一点通”完整攻略 简介 “扫描仪一点通”是一款针对Windows系统的扫描仪驱动管理软件,主要作用是为电脑上安装的扫描仪设备提供最新的驱动程序和管理工具,方便用户管理使用扫描仪。本攻略主要介绍该软件的安装和使用方法,以及常见问题的解决办法。 安装步骤 步骤1:下载安装程序 访问”扫描仪一点通”官方网站(http://www.scanok.com/),…

    人工智能概览 2023年5月25日
    00
  • Django中使用pillow实现登录验证码功能(带刷新验证码功能)

    以下是详细讲解“Django中使用pillow实现登录验证码功能(带刷新验证码功能)”的完整攻略,包含两条示例说明: 1. 安装pillow库 在Django中使用pillow来生成验证码实现登录验证功能,首先需要安装pillow库。可以通过以下命令在终端中安装: pip install pillow 2. 修改app.views.py文件 在app.vie…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部