热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonopencv直方图均衡_Python+OpenCV:全局直方图均衡化、局部直方图自适应均衡化、直方图比较(Python版)...

1.全局直方图均衡化cv2.equalizeHist(src,dstNone)函数只能处理单通道的数据,src为输入图像对象矩阵,必须为单通道的uint8类型的矩阵

1. 全局直方图均衡化

cv2.equalizeHist(src, dst=None)函数只能处理单通道的数据,src为输入图像对象矩阵,必须为单通道的uint8类型的矩阵数据。直方图均衡化可以看作是图像增强的一个手段,示例代码如下:

import cv2 as cv

src = cv.imread("D:/Open CV/opencv/sources/samples/data/rice_01.jpg")

# 1. 全局直方图均衡化

def globalEqualHist(image):

# 如果想要对图片做均衡化,必须将图片转换为灰度图像

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

dst = cv.equalizeHist(gray) # 在说明文档中有相关的注释与例子

# equalizeHist(src, dst=None)函数只能处理单通道的数据,src为输入图像对象矩阵,必须为单通道的uint8类型的矩阵数据

# dst: 输出图像矩阵(src的shape一样)

cv.imshow("global equalizeHist", dst)

# print(len(image.shape)) # 彩色图像的shape长度为3

# print(len(gray.shape)) # 灰度图像的shape长度为2

# print(gray.shape) # 灰度图像只有高、宽

globalEqualHist(src)

cv.imshow("original image", src)

cv.waitKey(0)

cv.destroyAllWindows()

运行效果如下:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqeTEyMzA3OF96ank=,size_16,color_FFFFFF,t_70#pic_center

由运行的效果图,我们可以看出经过equalizeHist()函数的处理,图像的对比度在全局上已经得到了增强。但是如果选择其他的图像,采用全局直方图均衡化的函数就不一定能够得到很好地效果了,例如,选择一张帅哥的图像做全局直方图均衡化处理:

import cv2 as cv

import numpy as np

src = cv.imread("./images/handsomeboy01.jpg")

# 1. 全局直方图均衡化

def globalEqualHist(image):

# 如果想要对图片做均衡化,必须将图片转换为灰度图像

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

dst = cv.equalizeHist(gray) # 在说明文档中有相关的注释与例子

# dst: 输出图像矩阵(src的shape一样)

cv.imshow("global equalizeHist", dst)

globalEqualHist(src)

cv.imshow("original image", src)

cv.waitKey(0)

cv.destroyAllWindows()

运行效果如下:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqeTEyMzA3OF96ank=,size_16,color_FFFFFF,t_70#pic_center

很明显,这种情况下经过全局的均衡化处理之后反而不是我们想要得到的图像,因为它将图像的关键部分处理的相当不清楚。所以此时,就不能利用全局均衡化了,而需要使用局部直方图自适应均衡化。

2. 局部直方图自适应均衡化

相比全局直方图均衡化,自适应直方图均衡化将图像划分为不重叠的小块,在每一块进行直方图均衡化,如果小块内有噪声,则影响就会很大,需要通过限制对比度来进行抑制。即通过对比度自适应直方图均衡化。如果限制对比度的阈值设置为40,那么在图像中像素值出现次数大于40的次数就会将大于40的部分像素点去掉,平均成其它的像素点。

示例代码如下:

import cv2 as cv

import numpy as np

src = cv.imread("./images/handsomeboy01.jpg")

def localEqualHist(image):

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

clahe = cv.createCLAHE(clipLimit=5, tileGridSize=(7,7))

dst = clahe.apply(gray)

cv.imshow("clahe image", dst)

globalEqualHist(src)

cv.imshow("original image", src)

cv.waitKey(0)

cv.destroyAllWindows()

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqeTEyMzA3OF96ank=,size_16,color_FFFFFF,t_70#pic_center

此时如果选择我们刚才的那张帅哥的图片的话,就会出现以下效果:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqeTEyMzA3OF96ank=,size_16,color_FFFFFF,t_70#pic_center

此时的效果就非常的好了。

3. 直方图比较

直方图比较可以通过cv2中的API: cv2.HISTCMP_BHATTACHARYYA()计算两张图像的巴氏距离;cv2.HISTCMP_CORREL()计算图像之间的相关性;cv2.HISTCMP_CHISQR()计算卡方。

# 直方图比较

def create_rgb_hist(image):

h, w, c = image.shape

rgbHist = np.zeros([16*16*16, 1], np.float32)

bsize = 256/16

# enumerate() 函数可以永健一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据以及对应的下标,一般用在for循环中。

# range()函数用于创建一个整数列表

for row in range(h):

for col in range(w):

b = image[row, col, 0]

g = image[row, col, 1]

r = image[row, col, 2]

index = np.int((b/bsize)/16*16 + (g/bsize)*16 + (r/bsize))

rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0] + 1

return rgbHist

def hist_compare(image1, image2):

hist1 = create_rgb_hist(image1)

hist2 = create_rgb_hist(image2)

match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)

match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)

match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)

print("巴氏距离: %s, 相关性: %s, 卡方: %s"%(match1, match2, match3))

cv.imshow("image1", image1)

cv.imshow("image2", image2)

image1 = cv.imread("./images/raindropGirl.jpg")

image2 = cv.imread("./images/raindropGirl01.jpg")

hist_compare(image1, image2)

cv.waitKey(0)

cv.destroyAllWindows()

运行结果如下:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqeTEyMzA3OF96ank=,size_16,color_FFFFFF,t_70#pic_center

20200424154505827.png#pic_center

通过巴氏距离就可以看出二者的相似度还是非常大的。巴氏距离越小,代表图像越相似。



推荐阅读
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Python进阶笔记:深入理解装饰器、生成器与迭代器的应用
    本文深入探讨了Python中的装饰器、生成器和迭代器的应用。装饰器本质上是一个函数,用于在不修改原函数代码和调用方式的前提下为其添加额外功能。实现装饰器需要掌握闭包、高阶函数等基础知识。生成器通过 `yield` 语句提供了一种高效生成和处理大量数据的方法,而迭代器则是一种可以逐个访问集合中元素的对象。文章详细解析了这些概念的原理和实际应用案例,帮助读者更好地理解和使用这些高级特性。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 利用 Python 中的 Altair 库实现数据抖动的水平剥离分析 ... [详细]
  • 优化后的标题:数据网格视图(DataGridView)在应用程序中的高效应用与优化策略
    在应用程序中,数据网格视图(DataGridView)的高效应用与优化策略至关重要。本文探讨了多种优化方法,包括但不限于:1)通过合理的数据绑定提升性能;2)利用虚拟模式处理大量数据,减少内存占用;3)在格式化单元格内容时,推荐使用CellParsing事件,以确保数据的准确性和一致性。此外,还介绍了如何通过自定义列类型和优化渲染过程,进一步提升用户体验和系统响应速度。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 在单个图表中实现饼图与条形图的精准对齐 ... [详细]
  • 利用GDAL库在Python中高效读取与处理栅格数据的详细指南 ... [详细]
author-avatar
拍友2502899521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有