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

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日

相关文章

  • 掌握C++编程中反斜杠续行符的使用方法

    掌握C++编程中反斜杠续行符的使用方法非常重要。它可以帮助我们避免代码行过长,提高代码可读性和可维护性。下面是针对这个问题的完整攻略,包括定义、使用方法和2个示例。 什么是反斜杠续行符? 反斜杠续行符是 C++ 语言提供的一种机制,它允许在代码行末尾使用反斜杠字符 \ 来表示下一行代码的延续。这样可以将一行代码分割成多行的形式,使得代码更加清晰、易读和维护。…

    人工智能概览 2023年5月25日
    00
  • Android开发教程之获取系统输入法高度的正确姿势

    Android开发教程之获取系统输入法高度的正确姿势 在Android开发中,有时候需要获取系统输入法的高度,以便处理界面上控件的布局。但是由于不同版本的系统输入法可能存在差异,因此需要采用正确的方法获取系统输入法的高度。 使用ViewTreeObserver实时监听输入法高度变化 在Activity的onCreate方法中可以通过ViewTreeObser…

    人工智能概览 2023年5月25日
    00
  • PHP中的mongodb group操作实例

    下面是详细讲解PHP中的Mongodb group操作实例的攻略: 简介 Mongodb是一个高性能、高可用、分布式的面向文档型数据库,具有多种查询接口,其中group操作可用于数据分组、聚合等操作。 在PHP中,我们可以通过MongoDB官方提供的MongoDB PHP driver扩展进行Mongodb操作。 安装MongoDB PHP驱动 首先,我们需…

    人工智能概论 2023年5月25日
    00
  • Django框架实现分页显示内容的方法详解

    Django框架实现分页显示内容的方法详解 在网页开发中,经常需要对数据进行分页显示,Django框架也提供了非常便捷的分页功能,本文将详细介绍Django框架实现分页显示内容的方法。 一、分页原理 分页实质是对数据进行分段显示。对于数据量大的应用,直接将所有数据渲染在一个页面会导致加载过慢,加载时间长,用户体验度下降等问题,因此需要将数据进行分页显示。 D…

    人工智能概论 2023年5月25日
    00
  • SQLite3的绑定函数族使用与其注意事项详解

    SQLite3的绑定函数族使用与其注意事项详解 什么是SQLite3的绑定函数族? 这里所谓的“绑定函数族”,是指在使用SQLite3进行编程的过程中,使用的与SQLite3直接交互的函数家族。这些函数用于与SQLite3数据库进行通讯及传值。另外,SQLite3绑定函数族还提供了一些额外的操作,如事务处理等。 SQLite3的绑定函数族由C函数库提供支持,…

    人工智能概论 2023年5月25日
    00
  • ubuntu下没有中文输入法的解决办法

    当在Ubuntu系统下要输入中文时,通常需要借助中文输入法。但是,很多人会发现他们的Ubuntu系统里没有自带中文输入法或者安装中文输入法后无法正常使用。接下来,就让我来为大家提供一份完整的攻略,教大家如何在Ubuntu下解决没有中文输入法的问题。 步骤1:安装IBus-pinyin IBus-pinyin是一款能够使用拼音输入方法的输入法引擎,在Ubunt…

    人工智能概览 2023年5月25日
    00
  • Node.js连接MongoDB数据库产生的问题

    连接MongoDB数据库是Node.js开发的重要环节之一。下面我们将详细讲解在连接MongoDB数据库时可能会出现的问题及其解决办法,供开发者参考。 问题一:安装MongoDB驱动 在使用Node.js连接MongoDB数据库前,需要先安装MongoDB的驱动模块。可以使用npm install mongodb命令进行安装。同时,还需注意模块版本与Mong…

    人工智能概论 2023年5月25日
    00
  • Python六大开源框架对比

    Python六大开源框架对比 Python是一种流行的编程语言,因为它简单易学,拥有强大而灵活的功能。在Python中,有许多开源框架可供选择,可以轻松地构建出高效且高性能的应用程序。本文将介绍Python的六个流行的开源框架:Django、Flask、Pyramid、Web2Py、Bottle和CherryPy,并进行详细的比较和说明,以帮助你选择适合你的…

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