Python机器视觉--OpenCV进阶(核心)--图像直方图与掩膜直方图与直方图均衡化

news/2024/5/17 16:59:39/文章来源:https://blog.csdn.net/qq_43944517/article/details/126914714

1.图像直方图

1.1 图像直方图的基本概念

在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表.

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

1.2绘制直方图

  • 横坐标: 图像中各个像素点的灰度级.
  • 纵坐标: 具有该灰度级的像素个数.

图片来源: https://www.cambridgeincolour.com/tutorials/histograms1.htm


画出上图的直方图:

image-20211122153237404

或者以柱状图的形式:

1.3归一化直方图

  • 横坐标: 图像中各个像素点的灰度级

  • 纵坐标: 出现这个灰度级的概率

直方图术语
dims:需要统计的特征的数目。例如:dims=1,表示我们仅统计灰度值。
bins:每个特征空间子区段的数目。

range:统计灰度值的范围, 一般为[0, 255]

2.基于OpenCV的统计直方图

2.1 Opencv绘制直方图

  • calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

    • images: 原始图像
    • channels: 指定通道.
      • 需要用中括号括起来, 输入图像是灰度图像是, 值是[0], 彩色图像可以是[0], [1], [2], 分别对应B,G,R.
    • mask: 掩码图像
      • 统计整幅图像的直方图, 设为None
      • 统计图像某一部分的直方图时, 需要掩码图像.
    • histSize: BINS的数量
      • 需要用中括号括起来, 例如[256]
    • ranges: 像素值范围, 例如[0, 255]
    • accumulate: 累积标识
      • 默认值为False
      • 如果被设置为True, 则直方图在开始分配时不会被清零.
      • 该参数允许从多个对象中计算单个直方图, 或者用于实时更新直方图.
      • 多个直方图的累积结果, 用于对一组图像计算直方图.

代码实现 (统计直方图)

import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')hist = cv2.calcHist([lena], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)

代码实现(plt统计绘制直方图)

import matplotlib.pyplot as plt
### h绘制直方图
# 不使用cv2方法
img=cv2.imread('./lena.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.hist(gray.ravel(),bins=256,range=[0,255])

结果如图

在这里插入图片描述

代码实现(使用OpenCV统计绘制 直方图)

import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')histb = cv2.calcHist([lena], [0], None, [256], [0, 255])
histg = cv2.calcHist([lena], [1], None, [256], [0, 255])
histr = cv2.calcHist([lena], [2], None, [256], [0, 255])plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()

结果如图

在这里插入图片描述

2.2 使用掩膜的直方图

  • 掩膜

  • 如何生成掩膜

    • 先生成一个全黑的和原始图片大小一样大的图片. mask = np.zeros(image.shape, np.uint8)
    • 将想要的区域通过索引方式设置为255. mask[100:200, 200: 300] = 355

代码实现

import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)mask = np.zeros(gray.shape, np.uint8)
mask[200:400, 200: 400] = 255
hist_mask = cv2.calcHist([gray], [0], mask, [256], [0, 255])
hist_img = cv2.calcHist([gray], [0], None, [256], [0, 255])
plt.plot(hist_mask)
plt.plot(hist_img)cv2.imshow('mask', cv2.bitwise_and(gray, gray, mask=mask))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图

在这里插入图片描述

3.直方图均衡化原理

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

原理:

  1. 计算累计直方图
  2. 讲累计直方图进行区间转换
  3. 在累计直方图中, 概率相近的原始值, 会被处理为相同的值

  • equalizeHist(src[, dst])
    • src 原图像
    • dst 目标图像, 即处理结果

代码实现

import cv2
import matplotlib.pyplot as plt
lena = cv2.imread('./lena.png')
gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)# lena变黑
gray_dark = gray - 40
# lena变亮
gray_bright = gray + 40# 查看各自的直方图
hist_gray = cv2.calcHist([gray], [0], None, [256], [0, 255])
hist_dark = cv2.calcHist([gray_dark], [0], None, [256], [0, 255])
hist_bright = cv2.calcHist([gray_bright], [0], None, [256], [0, 255])plt.plot(hist_gray)
plt.plot(hist_dark)
plt.plot(hist_bright)# 进行均衡化处理
dark_equ = cv2.equalizeHist(gray_dark)
bright_equ = cv2.equalizeHist(gray_bright)
cv2.imshow('gray_dark', np.hstack((gray_dark, dark_equ)))
cv2.imshow('gray_bright', np.hstack((gray_bright, bright_equ)))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9611.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次关于Rank()排序函数问题

先来看应用场景吧 就是页面上有个top按钮 根据不同的top 进行筛选 比如我选择top5 那么在下方当前大区的销售额降序筛选出来最高的前五个销售员or客户这种场景 💖 问题 问题1:为什么我的这个rank排序函数 这个华南大区 不是从1开始的呢 其他大区都是正…

java毕业设计选题系统ssm实现的商城系统(电商购物项目)

🍅文末获取联系🍅 一、项目介绍 《ssm实现的商城系统》该项目采用技术:springspringMVCmybaitsEasyUIjQueryAjax等相关技术,项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 1.1 课题背景、目的及意义 当今社…

java 同学聚会AA制共享账单系统springboot 小程序022

本系统在一般同学会小程序的基础上增加了首页推送最新信息的功能方便用户快速浏览,是一个高效的、动态的、交互友好的同学会小程序。 用户在首页上会看到各类模块的推送内容,可以以最直接的方式获取信息,注册登陆后,可以对应经费信…

Unity基础笔记(5)—— Unity渲染基础与动画系统

Unity渲染基础与动画系统 Unity渲染基础 一、摄像机 1. 摄像机概念和现实中的摄像机很接近,Unity 中 Camera 组件负责将游戏画面拍摄然后投放到画面上 Camera 拍摄到的画面决定了 Game 面板的画面 创建场景的时候,Unity 会默认创建一个摄像机,所以我们点击 Game 面板才有画面…

【算法刷题】链表篇-链表的回文结构

文章目录题目要求方法1:思路代码方法2代码题目要求 链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 1 -> 2 -> 3 -> 2 -> 1 1 -> 2 -> 2 -> 1 上面两个是回文结构 方法1:思路 1.遍历链表,把结点对应的…

网络安全基础——对称加密算法和非对称加密算法(+CA数字证书)

目录 一、数据传输时的安全特性 二、对称加密算法: 三、非对称加密算法 四、对称加密和非对称加密 — 融合算法: 五、CA数字证书: 一、数据传输时的安全特性 ———————————————————————————————————…

分布式进化算法

1 多解优化问题 多解优化问题是指一类具有多个最优解的复杂优化问题。多峰优化问题和多目标优化问题都是两类典型的多解优化问题,它们之前的统一关系,即都具有多个最优解。多峰优化问题要求算法找到多个具有相同适应度值得最优解,多目标优化问…

SpringBoot的核心原理(扒笔记记录)

这一课的主要重点: 自动装配以及starterJDBC数据库连接池ORM、JPA、MyBatis、Hibernate这样相关的一些技术 从Spring到SpringBoot 我们在工作中都可能用过了SpringBoot,特别是最近几点,Java开发者大军里的一员,我们一般可能上手就…

卷积神经网络相比循环神经网络具有哪些特征

CNN卷积神经网络结构有哪些特点? 局部连接,权值共享,池化操作,多层次结构。 1、局部连接使网络可以提取数据的局部特征;2、权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个…

Docker容器互联

前言: 虽然每个docker容器之间都能通过ip来进行互联,但当容器重新启动,ip就会被重新分配给重新启动的容器,这时同个容器由于重启导致ip不一样了,这时就会导致开发和运维的困难程度大大增加,这时候就要考虑…

springboot+学生信息管理 毕业设计-附源码191219

学生信息管理的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&…

Maven下的依赖管理

依赖管理一. 使用坐标引入jar包二. 快捷方式导入jar包的坐标三. 自动导入设置四. 依赖范围一. 使用坐标引入jar包 使用坐标引入jar包的步骤: 在项目的 pom.xml 中编写 标签在 标签中 使用 引入坐标定义坐标的 groupId,artifactId,version 点…

用于文化遗产的VQA(基于ArtPedia数据集)

艺术 文化遗产领域 VQA parper 阅读 Visual Question Answering for Cultural Heritage 文章目录艺术 文化遗产领域 VQA parper 阅读前言方法visual Question Answering with visual and contextual questionsQuestion Classifier ModuleContextual Question Answering Module…

vue3 | HighCharts实战自定义封装之径向条形图

1.前言 目前正在做vue3的数据可视化项目,vue3的组合式api写法十分方便,可以有各种玩法,有兴趣的同学可以看我个人主页的其他文章。难点是在网上找了一圈的有关径向条形图的示例都没有好的解决方案,决心亲自下手,在其中…

CSP2021初赛游记

csp2022开打,把去年的游记找出来,在这里补了 CSP2021初赛游记 早上7:30去省初门口等crxis,可以和他一起做地铁去,然而最后也就3个学生,准确来说是3个学生加1个家长在等。我当时在微信里和老师说:" 老师你快点过来呀 人好多啊 一大群人在催你 浩浩荡荡 人山人海 局面…

WebKitX ActiveX 5.0.0.15221 Crack

WebKitX ActiveX 封装了 Chromium Embedded Framework (CEF3) 以用于 OLE/COM 语言。Chromium Embedded Framework 封装了 WebKit Blink HTML5 Renderer 和 Google V8 JavaScript Engine。这是一个用于商业用途的生产级稳定组件,将真正在您的桌面和终端应用程序中添…

内网渗透之Msf-Socks代理实战(CFS三层靶场渗透过程及思路)

前言 作者简介:不知名白帽,网络安全学习者。 博客主页:https://blog.csdn.net/m0_63127854?typeblog 内网渗透专栏:https://blog.csdn.net/m0_63127854/category_11885934.html 网络安全交流社区:https://bbs.csdn.ne…

【操作系统】文件系统

文章目录硬盘1 - 基本组成2 - 存储机制Linux文件系统1 - 常见文件类型2 - 文件系统的组成2.1 - 定义2.2 - 作用2.3 - 常见类型2.4 - 分配文件系统3 - 数据存储 层次3.1 - inode表3.2 - Datablock3.3 - Superblock3.4 - GDT 全局描述表4 - 虚拟文件系统 - VFS5 - 软链接与硬链接…

三十页论文与代码已更新 2022数学建模国赛C题 古代玻璃制品的成分分析与鉴别

完整文档获取方式在文章最后 完整文档获取方式在文章最后 完整文档获取方式在文章最后 问题一分析:请在观看问题一分析前先观看附件1数据集的分析与处理(在面包多附件处进行下载)。针对问题1,问题1分为三小问。 首先,需要对玻璃文物的表面风化与其玻璃类型、纹饰和颜色的…

【机器学习】最大期望算法(EM)

1. 什么是EM算法 最大期望算法(Expectation-maximization algorithm,又译为期望最大化算法),是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。 最大期望算法经过两…