Opencv+Python笔记(十)灰度直方图、直方图均衡化、掩模的应用

news/2024/11/19 6:41:18/

目录

    • 一、灰度直方图
    • 二、图像掩模的应用
    • 三、直方图均衡化
      • 1.直方图均衡化
      • 2.自适应的直方图均衡化

一、灰度直方图

概念:
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。(百度百科)

灰度直方图即对图像中的所有像素点灰度值大小频率的统计

部分定义:
1.dims:需要统计的特征数目。若为灰度图 dims = 1;若为BGR三色 dims = 3;
2.bins:每个特征空间子区段的数目。即直方图中竖条的个数;
3.range:统计特征的取值范围,一般来说是 [0, 256] 表示左闭右开

直方图的意义:
直方图能直观表现图像中像素强度分布:
低灰度级集中,则表示比较暗。
高灰度级集中,则表示比较亮。
中灰度级集中,动态范围不足,对比度比较差。
均衡分布的图像,从低到高,像素占据比较均衡。

Opencv API:

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

参数:
img:原图像 注意:传入该函数时要加中括号即 [img]
channels:如果入图像是灰度图它的值就是[0] ,如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask:掩模图像。要统计整幅图像的直方图就把它设为None。若想统计图像某一部分的直方图的话则引用该掩模。
histSize:histSize:bins的数目。也应该用中括号括起来,例如:[256]。
ranges:像素值范围。通常为[0,256]。左闭右开

代码:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)greyScale_map = cv2.calcHist([gray], [0], None, [256], [0, 256])plt.plot(greyScale_map)  #函数plt.plot()绘制曲线图
plt.grid()  #函数plt.grid()打开绘图网线 使图片背景为网格状
plt.show()

在这里插入图片描述

二、图像掩模的应用

定义:
掩模也叫做掩码,在程序中用二值图像来表示,0值区域标识被遮盖的部分,255值区域表示被暴露的部分。

掩模的用途:
1.掩模可以提取图像中感兴趣的区域即ROI区域
2.掩模可以将图像中的某些部分屏蔽掉

一般通过numpy库中的函数建立掩模,然后通过图像与运算来求得ROI区域或屏蔽其他区域

代码:

#创建掩模 img.shape[:2]即仅引用img.shape的前两个参数(第三个参数为颜色通道, 前两个为长宽)
img_copy = img.copy()
mask = np.zeros(img.shape[:2], np.uint8)mask[200:300, 300:500] = 255  #划定感兴趣区域  做与运算时屏蔽区域为0感兴趣区域为255mask_copy = cv2.bitwise_and(img_copy, img_copy, mask = mask)

在这里插入图片描述

三、直方图均衡化

1.直方图均衡化

直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。灰度分布集中在较窄的区间往往会导致图像的不清晰,直方图均衡化即通过对直方图中像素灰度值的展宽来实现增强图像对比度。

Opencv API:

img_equal = cv2.equalizeHist(img)

在这里插入图片描述

2.自适应的直方图均衡化

原理:
将整幅图像分成很多小块,对每一个小块分别进行直方图均衡化,再使用双线性差值去除每个小块之间的边界,对每一小块进行拼接得到最终直方图均衡化的图像。
但是如果有噪声的话,噪声会被放大。所以为了避免这种情况的出现就要使用对比度限制。

Opencv API:

clahe = cv2.createCLAHE(clipLimit, tileGridSize)
dst = clahe.apply(img)

参数:
clipLimit:颜色对比度的阈值,可选项,默认值 40
tileGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值 (8,8)

代码:

clahe = cv2.createCLAHE(4.0, (8, 8))
img_eq_2 = clahe.apply(img)

在这里插入图片描述


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

相关文章

FFmpeg开发笔记(三)FFmpeg的可执行程序介绍

外界对于FFmpeg主要有两种使用途径,一种是在命令行运行FFmpeg的可执行程序,该方式适合没什么特殊要求的普通场景;另一种是通过代码调用FFmpeg的动态链接库,由于开发者可以在C代码中编排个性化的逻辑,因此该方式适合厂商…

WPF教程(九)--数据绑定(2)--绑定模式

一、绑定模式 绑定模式以及模式的使用效果。 示例如下是根据ListBox中的选中项,去改变TextBlock的背景色。将 TextBlock 的背景色绑定到在 ListBox 中选择的颜色。在下面的代码中针对TextBlock的 Background 属性使用绑定语法绑定从 ListBox 中选择的值。代码如下。…

Java中的Unsafe类详解

Java中的Unsafe类详解 什么是Unsafe类 在Java中,Unsafe类是一个位于sun.misc包下的类,提供了一些比较底层的方法,能够访问一些更加接近操作系统底层的资源,例如内存资源、CPU指令等等。通过这些方法,我们能够完成一些…

诊断CAPL自动化(1)—— CANoe自带的诊断工程分析

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 📘前言 🍅 学习CANoe,官方的实例工程就是最好的学习模板,对于初学者,…

lab5:深入理解进程切换

Linux中的进程切换由context_switch函数完成,该函数位于源代码目录的kernel/sched/core.c 中,代码如下: context_switch函数 /** context_switch - switch to the new MM and the new threads register state.*/ static __always_inline st…

Linux网络编程TCP粘包问题解析及解决方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一次发送多个数据实验二、导致问题的原因三、解决方案之一:延时发送四、知识点补充发送缓冲区和接收缓冲区五、解决方法总结 前言 本篇文章将引…

Qt Quick - Container

Qt Quick - Container使用总结 一、概述二、使用容器三、管理当前索引四、容器实现 一、概述 Container 提供容器通用功能的抽象基类。Container是类容器用户界面控件的基本类型,允许动态插入和删除Item。DialogButtonBox, MenuBar, SwipeView, 和 TabBar 都是继承…

【移动端网页布局】移动端网页布局基础概念 ② ( 视口 | 布局视口 | 视觉视口 | 理想视口 )

文章目录 一、视口1、布局视口 ( 网页大小 | 网页大小 > 设备大小 )2、视觉视口 ( 设备大小 | 网页大小 > 设备大小 )3、理想视口 ( 网页大小 设备大小 ) 一、视口 浏览器 显示 网页页面内容 的 屏幕区域 被称为 " 视口 " ; 视口分为以下几个大类 : 布局视口…