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

news2024/11/24 15:18:55

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

完成本期内容,你可以:

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

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

  • 操作系统: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.coloradmin.cn/o/566798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 结合 mybatis-plus 实现分页功能

一、分页的原理 要实现分页功能方法有很多,但最基本的实现原理都差不多,所以在实现功能之前要先把原理搞明白。正如删除有 “逻辑删除” 和 “物理删除" 之分,分页也有 “逻辑分页” 和 “物理分页”; 1、逻辑分页&…

WalMiner插件之xlog解析恢复使用教程

WalMiner插件主要有两个功能,在此记录一下第二个功能数据页挽回(坏块修复),学习一下关于这块的使用方法,方便日后回顾。 1 环境搭建 创建WalMiner的extension create extension walminer;语句解析: 该句SQL功能是安…

Linux用户管理相关命令(全)

1、Linux用户(账号)管理 查询用户(账号)信息(判断用户(账号)是否存在) id account新增用户(账号) useradd account设置用户(账号)密码 方式1: passwd account 方式2: echo 123|passwd --stdin account; #密码为123删除用户(账…

CMS 8bit单片机C语言编写指南

0 Preface/Foreword 单片机包含两部分:程序内存(Program memory space)和数据存储器(Ram memory space)。 CMS单片机堆栈深度受限,随具体的芯片而固定。 1 CMS C程序框架及数据类型 1.1 源程序基本框架 Example: 1.2 CMS C中变…

【JS】获取 Headers 头部信息

一、应用场景 当我们请求一个接口的时候,会发现 res 里面包含一个 headers 响应头信息: fetch(url, {method: GET,headers: {content-type: application/json,X-Requested-With: XMLHttpRequest,},mode: cors,credentials: include,}).then(res > {…

【算法】字符串转int类型思路及代码

文章目录 题目分析思路完整代码 题目 给你一个字符串,如何这个字符串符合日常的整形的书写规范,那么我们需要写出将其转化为int类型的方法,并且不能使用Java提供的API,比如parseInt方法。 分析 这道题考察的其实就是parseInt的…

亚马逊测评:提升产品排名、权重和销量的秘诀

亚马逊是全球最大的在线零售平台,覆盖了世界各地主要国家和地区,而随着平台商家的不断增加,为了提高自身排名,很多卖家开始寻找人员为他们的店铺和产品进行有偿评价,从而催生了亚马逊测评行业 亚马逊测评,…

笔试强训 Day6

选择题 1.十进制变量i的值为100,那么八进制的变量i的值为() A 146 B 148C 144 D 142 本题很简单:100除8,取余数,直到商为零,最后反向的串起余数即可 2.执行下面语句后的输出为(&…

从传统开发到低代码:这是一次技术革命

近年来,随着人工智能等新兴技术的快速发展,软件开发行业也在不断演变。传统的软件开发流程需要大量的编程知识和时间,而且往往需要复杂的架构和开发环境。然而,随着低/无代码平台的出现,软件开发变得更加高效、简单和普…

服务(第三十篇)elk-elasticsearch、logstash、kiabana

rsyslog 服务器较少时使用,rsyslog日志收集,统一存放在专门存放日志的收集器中; ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用…

产品经历、运营人员必看:高效产品帮助文档撰写指南

产品帮助文档是产品的重要组成部分,它对于产品的用户体验和产品的成功至关重要。帮助文档可以帮助用户更好地理解产品的功能和使用方法,提高用户的满意度和使用效率。同时,帮助文档还可以减轻客服和技术支持的工作负担,提高客服和…

Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录

Spring Boot 中如何使用 Spring Security OAuth2 来实现单点登录 简介 在现代 Web 应用程序中,单点登录(Single Sign-On,简称 SSO)是一个非常重要的功能。Spring Security OAuth2 是 Spring Security 框架的一个扩展&#xff0c…

Ubuntu宝塔显示磁盘被占满的解决方法

操作方法: 连接成功 Last login: Sat Mar 25 03:04:00 2023 from 192.168.153.1 rootubuntu:~# lvm lvm> lvextend -l 100%FREE /dev/mapper/ubuntu-vg/ubuntu-lv skip_dev_dir: Couldnt split up device name ubuntu-vg/ubuntu-lv. Size of logical volum…

Windows中的Tomcat服务器安装证书并设置强制https访问

官网参考 阿里云 华为云 获取证书 自己生成证书 这边介绍一个生产开发环境证书的方式:使用 Java 提供的工具:keytool keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "d:\tomcat.keystore" Tomcat服…

Golang变量初始

Golang变量初始 采用文章 本章使用go练习工具 https://tour.go-zh.org/welcome/13.1 为什么需要变量 3.1.1一个程序就是一个世界 3.1.2变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如一个示意图 3.2 变量的介…

专门用于管理企业与自己客户之间所有信息的客户管理系统

一、开源项目简介 关于 NXCRM NXCRM 是一套基于 Laravel 的 CRM 应用程序。它包含了一个管理中心,可以管理用户、客户、产品、订单、商机,合同,收款,附件,联系人,跟进动态,发票,业…

近年GDC服务器分享合集(二): 《太空工程师》中基于预测物理的多人游戏

客户端-服务端之间的位置同步一直是游戏开发中的一道难题,特别是还涉及到复杂的物理运动时。对于这个话题,来自《太空工程师》游戏的工程师在GDC 2023上为我们带来了他们的分享——《《太空工程师》中基于预测物理的多人游戏》(Predicted Phy…

在 openEuler 22.03 上安装 KubeSphere 实战教程

作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 导图 知识点 定级:入…

域泛化(Domain Generalization)相关知识学习

文章目录 一、域泛化综述1)Domain定义2)Domain Generalization(DG)定义3)一些相关领域与DG的区别4)领域泛化的方法表示学习领域不变表示学习①基于核的方法( kernel-based methods)②…

python自动化(一)基础能力:9.yaml文件详解

一、什么是yaml文件 yaml 是专门用来写配置文件的语言——可以用例作为自动化框架的配置文件yaml文件其实也是一种配置文件类型,后缀名是.yaml或.yml都可以个人认为比yaml比json格式更方便 二、yaml语法规则 YAML 语言(发音 /ˈjməl/ )的设…