OpenCV直方图的原理与显示、掩膜、均衡化、自适应均衡化

news2024/11/22 19:45:05

直方图

在这里插入图片描述

1 灰度直方图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1直方图的绘制和计算

在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

#直接以灰度图的方式读入

img =cv.imread("lena.png",0)

#统计灰度图
histr = cv.calcHist([img],[0],None,[256],[0,256])
'''
 使用 OpenCV 的 calcHist 函数计算灰度图像的直方图。calcHist 函数接受以下参数:
[img]:需要计算直方图的图像,以列表形式传递。
[0]:指定通道的索引,因为我们处理的是灰度图像,所以只有一个通道,索引为 0。
None:用于指定掩码,通常不需要使用,所以设为 None。
[256]:指定直方图的大小,这里表示直方图有 256 个 bin,范围从 0 到 255。
[0, 256]:指定像素值的范围,这里表示所有像素值都在 0 到 255 的范围内。 
函数的返回值 histr 是一个包含直方图统计数据的数组。
'''
#绘制灰度图
plt.figure(figsize=(10,6),dpi=100)
'''指定画布的大小为 10x6 英寸,分辨率为 100dpi。'''
plt.plot(histr)
'''绘制直方图,将 histr 数组作为参数传递给 plot 函数。这将绘制一个包含灰度直方图统计数据的折线图'''
plt.grid()
'''添加网格线,提高图像的可读性'''
plt.show()

结果展示

在这里插入图片描述

2 掩膜的应用

在这里插入图片描述

2.1代码实现`

import  numpy as np
import  cv2 as cv
import  matplotlib.pyplot as plt

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#创建蒙版
mask = np.zeros(img.shape[:2],np.uint8)    #创建一个与图像大小相同的空白蒙版,数据类型为 uint8
mask[100:256,100:256]=255    #在蒙版上设置感兴趣区域,将其中的像素值设为 255。

#掩膜
mask_img = cv.bitwise_and(img ,img,mask=mask)  #函数对原图像和蒙版进行位与操作,得到掩膜后的图像
#统计掩膜后图像灰度图
mask_histr = cv.calcHist([img],[0],mask,[256],[1,256])   # 函数计算掩膜后图像的灰度直方图。这里传入了掩膜参数 mask,只统计蒙版区域内的像素

#图像显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4))
axes[0,0].imshow(img,cmap=plt.cm.gray)   #在第一个子图中展示原图像,使用灰度色彩映射 plt.cm.gray
axes[0,0].set_title("原图")

axes[0,1].imshow(mask,cmap=plt.cm.gray)
axes[0,1].set_title("蒙版数据")

axes[1,0].imshow(mask_img,cmap=plt.cm.gray)
axes[1,0].set_title("掩膜后数据")

axes[1,1].plot(mask_histr)   #在第四个子图中绘制掩膜后图像的灰度直方图
axes[1,1].grid()  #添加网格线,提高图像的可读性。
axes[1,1].set_title("灰度直方图")
plt.show()

2.2 结果展示

在这里插入图片描述

3 直方图均衡化

在这里插入图片描述
在这里插入图片描述

它通过重新分布图像的灰度级别,使得图像中各个灰度级别的像素值在整个范围内均匀分布,从而提高图像的视觉效果。

直方图均衡化的作用包括:

增强图像对比度:直方图均衡化可以拉伸原始图像中各个灰度级别的像素值,使得图像中的亮度变化更加明显,从而增强了图像的对比度。

增强细节信息:直方图均衡化能够提高图像中低对比度区域的像素值,使得细节更加清晰可见。这对于图像分析和图像识别任务非常有用。

去除背景噪声:直方图均衡化可以调整图像的灰度级别分布,使得背景噪声的影响减小。这对于一些需要提取目标物体的应用场景非常有效。

增强图像的视觉效果:直方图均衡化可以使图像的整体视觉效果更加鲜明、生动,提高图像的观赏性。

3.1代码实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

#直接以灰度图方式读入
img = cv.imread("lena.png",0)
histr_1 = cv.calcHist([img],[0],None,[256],[0,256])

#均衡化处理
dst = cv.equalizeHist(img)

histr_2 = cv.calcHist([dst],[0],None,[256],[0,256])

#显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4),dpi=100)

axes[0,0].imshow(img,cmap=plt.cm.gray)
axes[0,0].set_title("原图")
axes[0,1].plot(histr_1)
axes[0,1].grid()
axes[0,1].set_title("原图-灰度直方图")

axes[1,0].imshow(dst,cmap=plt.cm.gray)
axes[1,0].set_title("均衡化结果")
axes[1,1].plot(histr_2)
axes[1,1].grid()
axes[1,1].set_title("均衡化直方图")
plt.show()

3.2结果展示

在这里插入图片描述

4自适应均衡化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1 代码实现

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#创建一个自适应均衡化对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) #clipLimit 参数指定了对比度限制,tileGridSize 参数指定了图像划分的网格大小
cl1 = clahe.apply(img)  #将自适应均衡化应用于图像 img,并将结果保存在变量 cl1

#图像显示
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(5,4),dpi=100)
axes[0].imshow(img,cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(cl1,cmap=plt.cm.gray)
axes[1].set_title("自适应均衡化结果")
plt.show()

4.2运行结果

在这里插入图片描述

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

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

相关文章

list容器排序案例

案例描述:将Perspn自定义数据类型进行排序&#xff0c;Person中属性有姓名、年龄、身高 排序规则:按照年龄进行升序&#xff0c;如果年龄相同按照身高进行降序 代码示例 #include <iostream> #include <string.h> #include <iterator> #include <vector…

java-- 字符串+拼接详解, 性能调优 (底层原理实现)

目录 简单了解一下字符串 String类里面是如何存放字符串的? String的不可变性 字符串拼接的方法 1.使用拼接字符串 2. 使用concat 3. 使用StringBuilder 4.StringBuffer 使用字符串拼接的原理 使用concat StringBuilder 效率比较 简单了解一下字符串 字符串在java…

Flink---5、聚合算子、用户自定义函数、物理分区算子、分流、合流

星光下的赶路人star的个人主页 欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游 文章目录 1、 聚合算子1.1 按键分区&#xff08;KeyBy&#xff09;1.2 简单聚合&#xff08;Sum/Min/MinBy/MaxBy&#xff09;1.3 归约聚合&#xff08;Reduce&#xff09; 2、用户自定义函数…

redis实战-实现笔记点赞和点赞排行榜

发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等 tb_blog_comments&#xff1a;其他用户对探店笔记的评价 保存笔记service层 Overridepublic Re…

实例讲解Spring boot动态切换数据源

前言 在公司的系统里&#xff0c;由于数据量较大&#xff0c;所以配置了多个数据源&#xff0c;它会根据用户所在的地区去查询那一个数据库&#xff0c;这样就产生了动态切换数据源的场景。 今天&#xff0c;就模拟一下在主库查询订单信息查询不到的时候&#xff0c;切换数据…

什么是UWB定位技术?UWB定位的应用场景及功能介绍

说到定位我们并不陌生&#xff0c;定位技术一直与我们的生活密不可分&#xff0c;比如最常见的车辆导航。 根据使用场景&#xff0c;定位技术分为室内定位和室外定位。 室外定位主要依靠GPS&#xff0c;北斗&#xff0c;GLONASS&#xff0c;伽利略等全球卫星定位导航系统。室内…

系统集成|第十一章(笔记)

目录 第十一章 项目人力资源管理11.1 项目人力资源管理的定义及有关概念11.2 主要过程11.2.1 编制项目人力资源管理计划11.2.2 组建项目团队11.2.3 建设项目团队11.2.4 管理项目团队 11.3 现代激励理论11.4 项目经理所需具备的影响力11.5 常见问题 上篇&#xff1a;第十章、质量…

有效保护敏感数据的最佳实践

在当今数据驱动的环境中&#xff0c;数据就是力量&#xff0c;组织仍然高度关注如何利用其数据进行 BI、分析和其他业务驱动计划。 事实上&#xff0c;最近的研究表明&#xff0c;数据领导者的主要动机是对高质量分析洞察的需求&#xff0c;而不是合规性。 然而&#xff0c;…

八大排序--------(五)堆排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

如何防止商业秘密泄露(洞察眼MIT系统商业机密防泄密解决方案)

在当今的商业环境中&#xff0c;保护公司的商业秘密是至关重要的。商业秘密可能包括独特的业务流程、客户列表、研发成果、市场策略等&#xff0c;这些都是公司的核心竞争力。一旦这些信息被泄露&#xff0c;可能会对公司的生存和发展产生重大影响。本文将探讨如何通过使用洞察…

【数据结构--排序】堆排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java 项目-基于 SpringBoot+Vue的疫情网课管理系统

文章目录 第一章 简介第二章 技术栈第三章 系统分析3.4.2学生用例 第四章 系统设计第五章 系统实现5.1学生功能模块5.2管理员功能模块5.3教师功能模块 六 源码咨询 第一章 简介 疫情网课也都将通过计算机进行整体智能化操作&#xff0c;实现的功能如下。 例如 管理员&#x…

如何监控公司电脑上网记录(员工上网行为监控软件有哪些?)

在当今数字化的世界中&#xff0c;互联网已经成为企业运营的重要组成部分。然而&#xff0c;随着这一转变&#xff0c;企业也面临着新的挑战&#xff0c;尤其是关于员工上网行为监控的问题。本文旨在解释公司上网行为监控的含义&#xff0c;重要性&#xff0c;实施方法以及最佳…

msvcp100.dll丢失原因,电脑出现msvcp100.dll丢失错误的解决方法

msvcp100.dll 是一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2010 及以上版本中的一部分&#xff0c;用于支持 C 应用程序的运行。如果 msvcp100.dll 丢失或损坏&#xff…

记一次linux下pip安装包时出错及奇怪的解决过程

一、问题说明 如图&#xff0c;在使用pip安装测速工具speedtest-cli时&#xff0c;终端提示“Externally managed environment &#xff08;从外部管理的环境&#xff09;”&#xff0c;导致无法安装该库。 二、问题解决 1 尝试提示的解决方案&#xff0c;改用命令apt inst…

C++【个人笔记1】

1.C的初识 1.1 简单入门 #include<iostream> using namespace std; int main() {cout << "hello world" << endl;return 0; } #include<iostream>; 预编译指令&#xff0c;引入头文件iostream.using namespace std; 使用标准命名空间cout …

qt 打印当前路径

//当前根目录qDebug()<< QDir::currentPath();//当前exe目录qDebug()<< QCoreApplication::applicationDirPath();//当前exe路径qDebug()<< QCoreApplication::applicationFilePath();分别输出&#xff1a;

文件储存平方根

任务描述 本关任务&#xff1a;给定程序中&#xff0c;函数fun的功能是将自然数1&#xff5e;10以及它们的平方根写到名为myfile3.txt的文本文件中&#xff0c;然后再顺序读出显示在屏幕上。请不要增行或删行&#xff0c;或更改程序的结构。 相关知识 相关知识略 编程要求 …

【Android Framework系列】第17章 Android Q沙箱模式(Scoped Storage)

1 背景 上一章节【Android Framework系列】第16章 存储访问框架 (SAF) 主要分析了Android4.4引入的存储访问框架&#xff08;SAF&#xff09;&#xff0c;本章节我们对Android10&#xff08;Q&#xff09;的存储相关进行分析&#xff0c;了解下其限制存储方式。 Google为了让…

oracle19c 集群部署的问题汇总

1、互信报错 处理过程 01、发现/etc/sysctl.conf中有net.ipv4.icmp_echo_ignore_all1配置&#xff0c;注释后发现还是无法通过 02、# cat /proc/sys/net/ipv4/icmp_echo_ignore_all发现返回1&#xff0c;说明还是禁ping&#xff0c;两个节点执行# echo 0 > /proc/sys/net…