热门标签 | 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

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



推荐阅读
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
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社区 版权所有