opencv图像直方图

news2024/11/19 5:53:08

灰度直方图从数学上来说,图像直方图是描述图像的各个灰度级的统计特性,它是图像灰度值的函数,统计图像中各个灰度级出现的次数或频率从图像上来说,灰度直方图是一个二维图像,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的次数和频率

直方图均衡化是指通过某种灰度映射(如:非线性拉伸)使原始图像的直方图变换为在整个灰度范围内均匀分布。

直方图规定化就是要调整原始图像的直方图去逼近规定的目标直方图。有选择地增强某个灰度范围内的对比度或使图像灰度值满足某种特定的分布。

归一化直方图:各个灰度级出现的次数除以图像的像素总数,即得到各个灰度级出现的概率,从而得到归一化直方图。

统计直方图

通过直方图可以很好的对整幅图像的灰度分布有一个整体的了解,直方图的x轴是灰度值(0~255),y轴是图片中具有同一个灰度值的点的数目。

cv2.calcHist(images,channels,mask,histSize,ranges)

 images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如果你想统图像某一分的直方图的你就制作一个掩模图像并使用它。
histSize:BIN 的数目。也应用中括号括来

直方图的绘制

 

import  cv2
from matplotlib import pyplot as plt
img = cv2.imread('./img1.png')
color = ('b', 'g', 'r')
for i, col in enumerate(color):
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(histr, color=col)
    plt.xlim([0, 256])
plt.show()

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./img1.png', 0)
# img.ravel() 将图像转成一维数组   没有中括号
plt.hist(img.ravel(), 256, [0, 256])
plt.show()

 

局部区域的直方图。首先定义一个掩膜,局部区域全部为1,不感兴趣的区域置为0

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('./img1.png', 0)

# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

 

 直方图均衡化

1.统计每个灰度值的个数
2.找出累积分布函数
3.得到累积分布函数最小值cdfmin
4.根据直方图均衡化算式计算均衡化的灰度值
5.得到均衡化后的图像  

图像处理 直方图均衡化_纯菜鸟123456的博客-CSDN博客_图像处理直方图均衡化 

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./img1.png', 0)
equ = cv2.equalizeHist(img)
hist1=cv2.calcHist([img], [0], None, [256], [0, 256])
hist2=cv2.calcHist([equ], [0], None, [256], [0, 256])
# res = np.hstack((img, equ)) # stacking images side-by-side
# cv2.imshow('img',res)
# cv2.waitKey()
# cv2.imwrite('res.png', res)
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(equ, 'gray')
plt.subplot(223), plt.plot(hist1)
plt.subplot(224), plt.plot(hist2)
plt.xlim([0, 256])
plt.show()

 

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

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

相关文章

git stash命令用法详解(临时存储代码)

1、需求背景 有时候在开发过程中,在一个分支上(dev1)已经写了一部分代码,但是需要紧急切换到别的分支(dev2)上修改某个代码,这时候不能直接从dev1分支上切换到dev2分支上,提示你需要保存代码。此时dev1分支…

Linux内存模型

sparse内存模型前言1.SPARSEMEM原理:2.vmemmap在虚拟地址空间位置3.virt,phys,page,pfn之间的转换关系3.1内核态虚拟地址和物理内存地址转换关系3.2页帧pfn、物理内存的page指针的关系3.3其他快捷的转换总结前言 Linux中的物理内存被按页框划…

408 考研《操作系统》第二章第五节:信号量机制和用信号量机制实现进程互斥、同步、前驱关系

文章目录教程1. 信号量机制1.1 概念1.2 信号量机制——整型信号量1.3 信号量机制——记录型信号量(important)1.4 总结2. 用信号量机制实现进程互斥、同步、前驱关系2.1 信号量机制实现进程互斥(important)2.2 信号量机制实现进程…

java基于SpringBoot的在线答疑系统的研究与实现-计算机毕业设计

项目介绍 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大师生的喜爱,也逐渐进入了每个学生的使用。互联网具有便利性,速度快,效率高,成本低等优点。 因此,构建符合…

【matplotlib】2-使用统计函数绘制简单图形

文章目录使用统计函数绘制简单图形1.函数bar()--用于绘制柱状图2.函数barh()--用于绘制条形图3.函数hist()--用于绘制条形图4.函数pie()--用于绘制饼图5.函数polar()--用于绘制极线图6.函数scatter()--用于绘制气泡图7.函数stem()--用于绘制棉棒图8.函数boxplot()--用于绘制箱线…

openGauss洗冤录 之 copy from

openGauss洗冤录 之 copy from 引子 之前一篇《测评报告:文件导入哪家强?》关于openGauss性能与预期不符的问题留下了个坑,今天回来填坑。 前文提到使用openGauss的copy from导入csv文件耗时是mysql的2倍,是PostgreSQL的6倍&#…

下载nacos-server-1.1.4安装包,使用mvn打包

git官方地址下载nacos-server-1.1.4.zip速度太慢,码云上下载地址没有安装包。采用从码云上下载源码,自行打包。(https://gitee.com/mirrors/Nacos/tree/1.1.4)下载完成之后,进入项目目录如图 下载源码后 ,解压 本地在本文件夹 在d…

这十套练习,教你如何用Pandas做数据分析(03)

练习3-数据分组 探索酒类消费数据 步骤1 导入必要的库 运行以下代码 import pandas as pd 步骤2 从以下地址导入数据 运行以下代码 path3 ‘…/input/pandas_exercise/pandas_exercise/exercise_data/drinks.csv’ #‘drinks.csv’ 步骤3 将数据框命名为drinks 运行以下代…

SpringBoot+Vue实现前后端分离的航空售票管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

JavaScript(一):编写位置、输入输出语句

JavaScript入门一、 JavaScript编写位置二、输入输出语句一、 JavaScript编写位置 (1)编写到script标签中 控制浏览器弹出一个警告框 alert("警告内容")让计算机在页面中输出一个内容 document.write() /*可以向body中输出一个内容*/向控制…

基于java+springboot+mybatis+vue+mysql的自媒体社区平台

项目介绍 近几年来自媒体平台的发展越来越迅猛,并逐渐成为新闻信息传播的主流模式,自媒体平台的内容构成没有主要的核心,新闻信息的探讨和传播环境比较自由,与此同时自媒体平台概念的应用与发展,赋予了普通民众发表自己感想的权利…

OneUI 5.5.0 for HTML/PHP/VueJS

OneUI 是一个高度通用的 Bootstrap 管理仪表板模板和 UI 框架,支持 Laravel,可让您以相同的速度和稳健的布局创建各种网站。它是使用 Sass 和 ECMAScript 6 (ES6) 开发的,并为开发人员提供了各种智能工具,如 webpack5、Babel 7、G…

如何避免SCI写作中的中式思维以及无处不在的Chinglish

现在随着全球经济的下行,很多小伙伴都选择了延时就业,因此更多的人开始考研和考博。新东方大学生学习与发展中心发布的《新东方2023考研报告》预测:2023考研报名将超过520万人。俗话说(我道听途说的):一入科…

一文教你数据结构体栈和队列的实现

前言: 关于c语言的学习已经差不多更新完毕,如果发现个别知识点,我还会继续更新,但目前已经准备往c和数据结构的重心挪动,这篇文章就是向大家讲述数据结构中栈和队列的实现。 💞 💞 欢迎来到小…

VoIP通话-基于SIP协议的Asterisk(一)-实现流程

文章首发及后续更新:https://mwhls.top/4122.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! VoIP通话-基于SIP协议的Asterisk该篇仅包含实现流程&#…

实验12 动态查找2022

A. DS二叉排序树之创建和插入 给出一个数据序列,建立二叉排序树,并实现插入功能 对二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第…

Vue 基础详解 | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Vue 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答…

spring——AOP面向切面编程—— 自动代理——根据 Bean 名称创建代理对象根据切面中信息创建代理对象...

自动代理 在前面的案例中,所有目标对象(Target Bean)的代理对象(Proxy Bean)都是在 XML 配置中通过 ProxyFactoryBean 创建的。 但在实际开发中,一个项目中往往包含非常多的 Bean, 如果每个 Bean 都通过 ProxyFactoryBean 创建,那…

MySQL~InnoDB关键特性(插入缓存、俩次写、自适应哈希索引、异步IO

一般情况下,主键是行唯一的标识符。通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。因为,对于此类情况下的插入,速度还是非常快的。 如果索引…

Selenium4+Python3系列 - 测试框架的设计与开发

框架搭建 整个框架的实现,大约也就1.5天,关于框架的开发并不是很难,主要难在测试报告增加失败自动截图功能和echart的饼子图统计功能,两者的整合花了近半天的时间吧。 效果: 1、核心思想 延续使用Page Object和Page …