day18 - 使用直方图提高图像对比度

news/2024/11/21 1:35:32/

本期将使用图像直方图的相关知识来提高图像对比度,对图像进行优化,从而提高图像清晰度。

完成本期内容,你可以:

  • 了解图像直方图的定义和计算方法
  • 了解直方图均衡化的原理
  • 学会使用直方图均衡化优化图像

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


图像直方图

图像直方图是用一表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布的直方图。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。计算机视觉邻域常借助图像直方图来实现图像的二值化。

灰度直方图是一幅图像中个像素灰度值出现次数或频数的统计结果,它只反映该图像中灰度值出现的频率,而未反映某一灰度值像素所在的位置。也就是说,它只包含了该图像中某个灰度值的像素出现的概率,而丢失了其所在的位置的信息。

任一幅图像,都能唯一地算出一幅与它对应的直方图。但不同的图像,可能有相同的直方图。即图像与直方图之间是多对一的映射关系。

直方图意义:

  1. 直方图是图像中像素强度分布的图形表达方式。
  2. 直方图统计了每一个强度值所具有的像素个数。

直方图广泛应用于许多计算机视觉应用中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。通过在每个兴趣点设置一个有相近特征的直方图所构成的标签,用以确定图像中的兴趣点。边缘、色彩、角度等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图还可以用来识别网络视频是否被复制等。直方图是计算机视觉中最经典的工具之一,也是一个很好的图像特征表示手段。

OpenCV中提供了cv2.calcHist()函数可以通过计算图像的统计直方图,其语法格式如下:

函数原型:hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )

contours为返回的轮廓。hierarchy为返回的图像的拓扑信息(轮廓层次)。

参数描述如下:

  • hist:返回的统计直方图,是一个一维数组,数组内是各个灰度级的像素个数。
  • images:原始图像,图像需要使用“[ ]”括起来使用。
  • channels:指定通道编号。
  • mask:掩码图像。
  • histSize:BINS的数量,该值需要用中括号括起来。
  • ranges:像素值范围RANGE。
  • accumulate:累计(累积、叠加)标识,默认值为False。

图像直方图均衡化

直方图均衡化是通过拉伸像素强度的分布范围,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

OpenCV中提供了cv2.equalizeHist()函数来实现直方图均衡化。

函数原型:dst = cv2.equalizeHist(src)

dst为直方图均衡化处理结果

参数描述如下:

  • src:8位单通道原始图像

具体步骤

步骤一:创建项目结构

创建项目名为使用直方图提高图像对比度,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用直方图提高图像对比度                   # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

步骤二:读取图像绘制图像直方图

  1. code文件夹下,新建 contrast.py 文件;
  2. 导入所需模块:OpenCV、matplotlib ;
  3. 读取dataset文件夹下的doll.png 图片;
  4. 依次计算B G R 三个通道的图像直方图;
  5. 将三个通道的直方图绘制到一张画布中;

代码实现

# 导入所需模块 OpenCV、matplotlib
import cv2
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread("../dataset/doll.png")# 统计整幅图像B G R 三个通道的直方图,BINS值为256,像素值范围为[0,255]
histb = cv2.calcHist([img],[0],None,[256],[0,255])
histg = cv2.calcHist([img],[1],None,[256],[0,255])
histr = cv2.calcHist([img],[2],None,[256],[0,255])
plt.figure()
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()

效果展示:

请添加图片描述

步骤三:直方图均衡化

  1. 拆分图像通道;
  2. 分别对三个通道进行直方图均衡化;
  3. 将三通道按照B G R的顺序合成;
  4. 显示直方图均衡化后的图像;

代码实现

# 进行直方图均衡化
# 通道分解
(b, g, r) = cv2.split(img)
b = cv2.equalizeHist(b)
g = cv2.equalizeHist(g)
r = cv2.equalizeHist(r)
# 通道合成
result = cv2.merge((b, g, r))
# 显示图片
cv2.imshow("origin image", img)
cv2.imshow("histogram equalization", result)
cv2.waitKey(0)

效果展示:

请添加图片描述

步骤四:绘制均衡化后图像直方图

  1. 依次计算结果图像B G R 三个通道的图像直方图;
  2. 将三个通道的直方图绘制到一张画布中;

代码实现

# 统计整幅图像B G R 三个通道的直方图,BINS值为256,像素值范围为[0,255]
histb = cv2.calcHist([result],[0],None,[256],[0,255])
histg = cv2.calcHist([result],[1],None,[256],[0,255])
histr = cv2.calcHist([result],[2],None,[256],[0,255])
plt.figure()
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()

请添加图片描述

图像进行直方图均衡化以后,图像中像素分布更均匀,图像的对比度提高,从而清晰度也就提高了。

点击下载源码


http://www.ppmy.cn/news/81961.html

相关文章

快手新财报:曙光就在冲刺路上?

自短视频爆火以来,短视频行业的头部玩家——抖音和快手就迎来了飞速发展,甚至一度成为了国民“杀时间利器”。然而,随着互联网红利逐渐见顶,短视频行业竞争加剧,哪怕作为头部玩家,快手的日子也并不好过。 …

随想011:关于编程

1945 年时,刚开始有计算机,那时候使用二进制数编程到了40年代末期,出现了汇编器,可以自动将汇编程序转换为二进制数序列1951 年 Grace Hopper 发明了编译器1957 年,Fortran,第一个高级语言,首次…

Flutter 笔记 | Flutter 布局组件

布局类组件都会包含一个或多个子组件,布局类组件都是直接或间接继承SingleChildRenderObjectWidget 和MultiChildRenderObjectWidget的Widget,它们一般都会有一个child或children属性用于接收子 Widget。 不同的布局类组件对子组件排列(layo…

项目风险管理的四个阶段,你了解多少?

项目风险管理是项目管理的一部分,目的是保证项目总目标的实现。 风险管理包括风险识别、风险估计、风险解决和风险监控。风险管理贯穿在项目中的每个环节,在项目的生命周期中监控风险是非常重要的手段。 风险管理包含四个阶段: 1、风险识别…

开源云原生数仓引擎ByConity 存储计算分离架构和优势

供稿 | ByConity技术团队 出品 | CSDN 云计算 ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是采用存储计算分离的架构,实现了读写分离和弹性扩缩容。这种架构确保读操作和写操作不会相互影响,使得计算资源和存储资源解耦,…

zabbix监控系统

一、Zabbix概述 1、使用zabbix的原因 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进…

【5.21】六、自动化测试—常用工具

目录 6.3 自动化测试常用工具 1. Selenium 2. Katalon Studio 3. UFT 6.3 自动化测试常用工具 常见的自动化测试工具: 1. Selenium Selenium是当前针对Web系统的最受欢迎的开源免费的自动化工具,它提供了一系列函数支持Web自动化测试,这些函数非常…

Java 与排序算法(1):冒泡排序

一、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它的基本思想是通过不断交换相邻两个元素的位置,使得较大的元素逐渐往后移动,直到最后一个元素为止。冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)&…