我们之前对直方图有一个大概的了解,它可以将图像的不同颜色的像素值在坐标上表示出来,现在我们来讨论直方图的均衡化,在基本概念的基础上来进行实战化。

假设有一个图像,其像素值仅局限于某些特定范围的值。举个例子,其比较明亮的图像区域所有的像素仅局限于高值,但实际上一个好的图像,其像素会来源于图像上的所有区域。所以我们需要拉伸/伸展直方图,这也是直方图均衡化所做的。而这样的做法通常也可以优化图像的对比度:

这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。

这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

原理

现在我们拿到一个256图像,我们知道什么?

1、像素值是0-255,即能表达256种颜色.

2、我们能统计出各个像素值的像素个数.即我们知道原图的概率分布

3、我们希望生成的新图的像素值的概率分布是平均分布的.

我们要求的是一个函数T,可以使得像素分布从下面左图变成右图.其中L是像素值的最大值+1:

我们根据一道数学题来进行推导:

很简单,已知x的概率分布,及x,y的转换关系,可以求得y的概率分布。F_x(x) 就相当于已知的第二点,即原始图片的像素的概率分布,F_Y(y)就相当于已知的第三点,即转换后的图片的像素要均匀分布,现在要求的是y = T(x)的这个T是什么样的,这样就可以把原图的像素x,转换成均衡化后的图片的像素y。根据上面的数学题,我们可以继续推导,得到s和r的关系.即我们所要求的转换函数T:

以上,就是做直方图均衡化的数学原理。

OpenCV直方图均衡化

直方图均衡化的三种情况,分别是:

  • 灰度图像直方图均衡化
  • 彩色图像直方图均衡化
  • YUV 直方图均衡化

先来看灰度直方图均衡化,我们输入一个灰度图像就可以,函数原型:

dst=cv.equalizeHist(src[, dst])

参数为输入的图像。

代码:

view plaincopy to clipboardprint?
def grayequal(img):  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  dst = cv2.equalizeHist(gray)  cv2.imshow("res", gray)  cv2.imshow("dst", dst)  cv2.waitKey(0)  cv2.destroyWindow()

我们再来看看彩色图像的均值化,彩色图像的直方图均衡化和灰度图像略有不同,需要将彩色图像先用split()方法,将三个通道拆分,然后分别进行均衡化.最后使用merge()方法将均衡化之后的三个通道进行合并.操作如下:

view plaincopy to clipboardprint?
def colorequal(img):  (b, g, r) = cv2.split(img)  bH = cv2.equalizeHist(b)  gH = cv2.equalizeHist(g)  rH = cv2.equalizeHist(r)  # 合并每一个通道  result = cv2.merge((bH, gH, rH))  cv2.imshow("img",img)  cv2.imshow("dst", result)  cv2.waitKey(0)

继续看YUV图像直方图均值化:

view plaincopy to clipboardprint?
def yuvequal(img):  imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)  cv2.imshow("src", img)  channelsYUV = cv2.split(imgYUV)  channelsYUV[0] = cv2.equalizeHist(channelsYUV[0])  channels = cv2.merge(channelsYUV)  result = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)  cv2.imshow("dst", result)  cv2.waitKey(0)

自适应直方图均值化

我们刚刚看到的第一个直方图均衡化,考虑了的是图像的全局对比度。在很多情况下,这并不是一个好的处理方法。例如,下图显示了一个输入图像及其经过全局直方图均衡后的结果:

直方图均衡化后的背景对比度确实有所提高,但是让我们比较两幅图中雕像的脸,由于亮度过高,我们丢失了脸部的大部分信息。这是因为它的直方图并不像我们在前面的例子中看到的那样局限于一个特定的区域。

为了解决这一问题,我们可以采用自适应的直方图均衡化。在这个方法中,图像会被划分为称为“tiles”的小块 (在OpenCV中,tileSize默认为8x8)。然后像先前一样对每个块进行直方图均衡。

那么现在在一个小区域内,直方图会被限制在一个小区域内(排除有噪声的情况);如果有噪音,区域会被放大。为了避免这种情况,我们可以应用对比度限制 contrast limiting。

如果任何直方图中的bin 高于指定的对比度限制 (OpenCV中默认bin 为40),则可以在应用直方图均衡化之前,将这些像素剪切并均匀分布到其他bin 中。在均匀化后,再采用双线性插值bilinear interpolation 的方法来去除tiles 小块边界中的后天的人工痕迹。

我们来看代码:

view plaincopy to clipboardprint?
import numpy as np
import cv2  img = cv2.imread('tsukuba_l.png',0)  # 创建一个 CLAHE 对象 (Arguments 可写可不写)
# clipLimit颜色对比度的阈值
# titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)  cv2.imwrite('clahe_2.jpg',cl1)


可以看到,图像更加的清晰,事实上,我们称之为——图像锐化,它是由OpenCV中的直方图操作完成的。

查看文章汇总页https://blog.csdn.net/weixin_44237705/article/details/107864965
更多openvino技术信息可以入群交流~

【转载】OpenCV-Python系列之直方图均衡(三十五)相关推荐

  1. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...

  2. 【问链财经-区块链基础知识系列】 第三十五课 区块链跨境贸易完全简析

    一.跨境贸易存在的问题 在国际跨境贸易中,数据和信息无疑是贯穿整个业务流程的重要要素,数据流的打通对于国际跨境贸易至关重要.然而,恰恰是因为数据在业务中所扮演的重要角色,其对各参与方而言都是私密且重要 ...

  3. 机器学习-白板推导系列笔记(三十四)-MDP

    此文章主要是结合哔站shuhuai008大佬的白板推导视频:马尔科夫决策过程_107min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.背景介绍 Random Variable:XYX⊥YX\; ...

  4. [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. Python编程基础:第三十五节 文件删除Delete a File

    第三十五节 文件删除Delete a File 前言 实践 前言 我们这一节来介绍如何删除一个文件,这里需要用到函数os.remove(path)用于删除指定路径下的文件,os.rmdir(path) ...

  6. OpenCV python 彩色图片的三通道

    OpenCV python 彩色图片的三通道 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 目的:理解彩色图片的三 ...

  7. 软考高级系统架构设计师系列论文三十五:论企业应用集成

    软考高级系统架构设计师系列论文三十五:论企业应用集成 一.摘要 二.正文 三.总结 一.摘要 2021年4月,我参加了南京车站综合信息平台项目的开发,承担项目的方案设计任务.该项目力图通过对车站现有系 ...

  8. FreeSql (三十五)CodeFirst 自定义特性

    比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同. Q: FreeSql 实体 ...

  9. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  10. [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
  2. Spring Cloud Sleuth 服务跟踪 将跟踪信息存储到数据库
  3. mac地址修改_快速更改WiFi MAC地址
  4. Nginx —— 用HTTP proxy module配置一个反向代理服务器
  5. c++中用于字符输入的函数
  6. 什么是迭代器,JS如何实现迭代器
  7. 在python中用import或者from_[转]python基础之---import与from...import....
  8. matlab simulink笔记05 —— 积分模块
  9. 前端学习(285):移动端简单知识
  10. C语言中关于字符数组输入,scanf没执行
  11. python控制语句字符串截取_菜鸟python---流程控制语句
  12. Linux开发_WARNING: ‘aclocal-1.14‘ is missing on your system.
  13. 不会写漂亮代码不是优秀的程序员,没有钢铁侠之躯不是合格的程序员
  14. h5 bootstrap 小程序模板_教你获取小程序码或小程序H5页面路径
  15. 物联网从业者必须知道的知识:IMSI号介绍与解析
  16. 计算机考试怎么复制粘贴文件,复制粘贴,教您电脑复制粘贴不能用了怎么解决...
  17. 什么是盒子模型,盒子模型,标准盒模型,怪异盒模型,两种盒模型的区别,box-sizing属性
  18. [概念]像素,分辨率
  19. codevs 1419 藤原妹红
  20. 惠众和环宇计算机专业,计算机一级Office

热门文章

  1. 乡镇纪委干部提升能力的方法
  2. 利用C++语言和CTP 交易接口实现量化交易
  3. vue鼠标悬停事件监听
  4. 在建工程直接费用化_在建工程转固时点涉及的利息:资本化?费用化?
  5. jmeter控制请求执行顺序
  6. Python异常处理练习
  7. android 方大动画,动画 -- View动画 -- 缩放动画
  8. 评分法模型开发-WOE值计算
  9. java算法题——分数约分
  10. SQL事务回滚的两种方式