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()

运行效果如下:

由运行的效果图,我们可以看出经过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()

运行效果如下:

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

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()

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

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

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()

运行结果如下:

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

python opencv 直方图均衡_Python+OpenCV:全局直方图均衡化、局部直方图自适应均衡化、直方图比较(Python版)...相关推荐

  1. opencv python是什么_Python+OpenCV 十几行代码模仿世界名画

    现在很多人都喜欢拍照(自拍).有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma.versa 等,可以把你的照片变成梵高.毕加索.蒙克等大师的风格. 这种功能 ...

  2. python数据挖掘视频_python+opencv实时视频目标检测

    python+opencv实时视频目标检测 opencv环境 1.访问Python Extension Packages for Windows,下载python对应版本的opencv. 比如小编下载 ...

  3. python 拉普拉斯锐化_Python+OpenCV拉普拉斯图像锐化

    **Python实现基于OpenCV的拉普拉斯图像锐化** 研一学习数字图像处理(刚萨雷斯版),导师让我用 Python 编写基于拉普拉斯算子的图像锐化,并且是在不直接调用OpenCV的情况下,由于现 ...

  4. python opencv 教程_python OpenCV 入门教程

    虽然python 很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV 来讲,OpenCV更加强大, 可以做更多更复杂的应用,比如人脸识别等.跟很多开源软件一样OpenCV 也提供了完善的p ...

  5. python compare函数_Python Opencv中用compareHist函数进行直方图比较对比图片

    图像直方图 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图像是由像素 ...

  6. python图像检测_Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简 ...

  7. python皮同_Python OpenCV 图像的双线性插值算法,全网最细致的算法说明_橡皮擦,一个逗趣的互联网高级网虫-CSDN博客...

    原文作者:梦想橡皮擦 原文标题:Python OpenCV 图像的双线性插值算法,全网最细致的算法说明 发布时间:2021-02-17 20:55:32 Python OpenCV 365 天学习计划 ...

  8. python图像边缘检测_python opencv实现图像边缘检测

    本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的 ...

  9. python人头识别_python+opencv实现人头检测

    python+opencv实现人头检测 python+opencv实现人头检测 前段时间琢磨了下人头检测这个功能,现在有了初步的认知和体会,下面开始讲下我在实现人头检测过程中遇到的坑和解决方法. 环境 ...

最新文章

  1. 中国工商银行已使用OceanBase!
  2. Android Touch事件传递机制解析 (推荐)
  3. 限制ALV报表的导出权限
  4. C:如何分解整数(从末位往前取以及从首位往后取)
  5. 操作系统饥饿现象_操作系统复习
  6. OpenCV探索之路(六):图像变换——霍夫变换
  7. NHibernate官方文档中文版——批量插入(Batch inserts)
  8. 48. PHP 页面静态化(1)
  9. xmapp phpstorm xdebug安装
  10. 使用VMware10虚拟机安装Linux系统(能力工场)
  11. DSP28377S_CAN通信
  12. 请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。
  13. 上海区域赛Unlock the Cell Phone
  14. 【砸壳STEP2】使用cycript查看并修改微信UI界面
  15. Tableau学习笔记⑦(数据分层、数据组、数据集)
  16. 文末送书 | 李航老师新作!机器学习经典著作《统计学习方法》全新升级
  17. 地下水情监测仪应用库区安全行业
  18. 失去jQuery Bloat ­ —使用NodeList.js进行DOM操作
  19. 基于python和TensorFlow的电影推荐系统
  20. C#第七课文字游戏2.0版本

热门文章

  1. 【Adams-Car】专栏目录汇总
  2. 双翌视觉LaserKnights视觉定位激光打标案例
  3. 学习PS好处都有哪些?
  4. 用类求长方体的体积和面积
  5. c# 中崎_C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)...
  6. 微信公众号开发相关功能
  7. movielens数据集搭建电影推荐系统(CB、CF、HOT)
  8. TPS63020DSJR(LDO)NCP51200MNTXG IC REG 稳压器参数
  9. js根据后缀名判断文件的类型
  10. 【软件测试】功能测试的测试工作流程