Opencv——直方图、掩膜、直方图均衡化详细介绍及代码实现

news/2024/5/19 20:20:30/文章来源:https://blog.csdn.net/m0_72662900/article/details/127819746

一、图像直方图

1.1 定义:

图像直方图是图像的基本属性之一,也是反映图像像素数据分布的统计学特征,其横坐标代表了图像像素点在[0,255]范围中,纵坐标代表图像像素点出现的个数或百分比。如图:

 1.2 函数:cv2.calcHist([img1],[channels],mask,histSize,ranges)

img:输入图像

channels:通道,如果输入的是灰度图,则此参数为[0],如果是彩色图,传入参数为[0]或[1]或[2]分别对应BGR。

mask:掩膜统计整幅图的直方图就是None。如果画某一部分直方图,需要制作一个掩模图像并使用。掩模大小和img一样的np数组,需要的部分为255,不需要的部分为0.

histSize:直方图bin的数目,[0,256]所以就是256。

ranges:像素范围[0,256]顾头不顾尾啦。

1.3 代码实现:

(1)准备工作加灰度图显示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#显示图像
def cv_show(name,img):cv2.imshow(name,img)cv2.cv2.waitKey(0)cv2.destroyAllWindows()
#导入图像
img1=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
hist=cv2.calcHist([img1],[0],None,[256],[0,256])
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()

结果如图(灰度图):

 (2)彩色图三个不同的通道:

img=cv2.imread("C:/Users/bwy/Desktop/7.png")
cv_show('img',img)
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])

结果如图:

 从上面两个图我们就可发现直方图很不均匀,可以比喻成不是矮胖的,所以我们接下来进行图像直方图均衡化。但是,在此之前我们在学习一下掩膜。

二、掩膜(mask)

2.1掩模mask思想:

掩模的大小和原图像大小一致。掩模中只有两部分,0和255,掩模中白色部分覆盖到的区域保留原图,黑色部分覆盖到的区域置为0。如果我们读入彩图,在构建np数组时,需要舍弃第三个维度,即通道。保留前两个维度img.shape[:2],掩模的size和原图像相同。由于mask是一个数组,可以使用切片方法将保留的位置变成白色255。

2.2代码:

img.shape[:2]#(420, 607)
#创建mast
mask=np.zeros(img.shape[:2],np.uint8)
mask[100:300,200:400]=255
cv_show('mask',mask)

结果如图:

masked_img=cv2.bitwise_and(img1,img1,mask=mask)
cv_show('masked_img',masked_img)

 结果如图:

 2.3掩膜过程对比

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

结果如图:

三、直方图均衡化

通过改变图像的直方图,来改变图像中各像素的灰度,用于增强局部的对比度而不影响整体的对比度。这种方法对于背景和前景都太亮或者太暗的图像非常有用。

3.1对图像整体进行均衡化

(1)进行均衡化后直方图前后对比显示:

img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
plt.hist(img.ravel(),256)
plt.show()
equ=cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()

结果对比图:

          

 (2)进行均衡化后图像前后对比显示:

img=cv2.imread("C:/Users/bwy/Desktop/lena.bmp",0)
equ=cv2.equalizeHist(img)
res=np.hstack((img,equ))
cv_show('res',res)

结果如图:(明显更亮了,好漂亮(●'◡'●)) 

 但是呢,这个方法也存在微瑕,那看一下如果我用下面这张图你就会发现了:

我们会发现这个帅锅的脸太亮了,我们观察不到细节了,细节丢失了,所以这个问题我们如何解决呢? 

 3.2 自适应均衡化

1、定义:

整幅图像会被分成很多小块,然后再对每一个小块分别进行直方图均衡化缺点是:如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。

2、代码:

img2=cv2.imread("C:/Users/bwy/Desktop/1.png",0)
img2.shape#(508, 672)
img3=cv2.resize(img2,(400,300))
equ1=cv2.equalizeHist(img3)
clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
res_clahe=clahe.apply(img3)
res=np.hstack((img3,equ1,res_clahe))
cv_show('res',res)

结果如图:

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

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

相关文章

2023年前端开发趋势未来可期

☆ 对于很多质疑,很多不解,本文将从 △ 目前企业内前端开发职业的占比; △ 目前业内开发语言的受欢迎程度; △ 近期社区问答活跃度; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货,通过深入…

多层串联拼接网络

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

什么是JUC

什么是JUC JUC指的是:Java里的三个包 java.util.concurrentjava.util.concurrent.atomic:原子性java.util.concurrent.locks:lock锁回顾线程和进程 进程 程序执行的一次过程,一个进程包含一个或多个线程。进程是资源分配的单位 …

UE4 回合游戏项目 17- 进入指定区域触发战斗事件

在上一节(UE4 回合游戏项目 16- 控制玩家)基础上,增加角色走进指定区域从而触发战斗场景的功能 主要思想是添加一个碰撞区域,当玩家与该区域碰撞时,触发战斗事件 效果: 步骤: 1.新建蓝图类 选…

Allegro给各种形式的板框导弧操作指导

Allegro给各种形式的板框导弧操作指导 Allegro可以给板框导弧,让加工出来的板框更加圆滑,具体操作步骤如下 板框是line形式的 选择Manufacture-Drafting-Fillet命令 在Options里面Radius输出导弧的半径,比如78.74 框选两个线段的部分 完成后的效果如下图 框选4个角落,…

PCB Layout爬电距离、电气间隙如何确定-安规

PCB Layout爬电距离、电气间隙如何确定 爬电距离:沿绝缘表面测得的两个导电零部件之间或导电零部件与设备防护界面之间的最短路径。 电气间隙:在两个导电零部件之间或导电零部件与设备防护界面之间测得的最短空间距离。即在保证电气性能稳定和安全的情况…

用python就获取到照片拍摄时的详细位置【源码公开】

文章目录一.引言1.读取照片信息,获取坐标2.通过baidu Map的API将GPS信息转换成地址。二.源码附上!!!注意事项一.引言 先看获取到的效果 拍摄时间:2021:12:18 16:22:13 照片拍摄地址:(内蒙古自治区包头市昆都仑区, 内…

广和通5G AIoT模组引领亮相2022国际物联网展(IOTE),智赋行业数字化新价值

11月15-17日,2022国际物联网展(IOTE)于深圳盛大启幕,本届展会汇聚众多物联网行业大咖,共同展示并探讨物联网产业链的创新实践与成果。广和通以“5GAIoT深度融合,创新智造未来”为主题亮相现场。本次广和通展…

2.10.2版本的青龙升级2.10.13及2.11.3版本的教程

重要提醒: 这个教程仅限使用我下面这个命令搭建的青龙面板使用 docker run -dit \--name QL \--hostname QL \--restart always \-p 5700:5700 \-v $PWD/QL/config:/ql/config \-v $PWD/QL/log:/ql/log \-v $PWD/QL/db:/ql/db \-v $PWD/QL/scripts:/ql/scripts \-…

HTML知识点总结篇(一)

src和href的区别 作用结果不同 src用于替换当前内容href用于在引用资源和当前文档之间建立链接 请求资源类型不同 在请求src资源时,会将其指向的资源下载并应用到文档中。常用于img/iframe/input/style/scripthref常用于建立当前元素和文档之间的链接。常用的有lin…

【EC200U】GPS定位

EC200U GPS定位GNSS模块quecgnss - 内置GNSSGNSS 功能初始化GNSS 工作状态获取GNSS开关GNSS定位数据获取实测案例拓展当前互联网地图的坐标系现状地球坐标 (WGS84)火星坐标 (GCJ-02)也叫国测局坐标系百度坐标 (BD-09)coordtransform 坐标转换EC系列东西很多,网上资料…

高精度算法【加减乘除】

全文目录😍 前言😀 高精度加法🤔 操作步骤😵‍💫 代码模板😀高精度减法🤔操作步骤😵‍💫 代码模板😀高精度乘法🤔操作步骤😵‍&#x…

基于SSM花卉商城设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

记一道前端高难度面试题

目录 提问:如何让下面的这行代码成立 1.错误原因 2.思路 3.解题 4.小结 提问:如何让下面的这行代码成立 var [a,b] {a:1,b:2} 直接运行会报错,报错信息如下: Uncaught TypeError: {(intermediate value)(intermediate valu…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器,以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择,部分浏览器对CSS3的选择器支持不全&am…

【Pytorch with fastai】第 6 章 :其他计算机视觉问题

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

都说测试行业饱和了,为什么我们公司给初级测试开到了12K?

故事起因: 最近我有个刚毕业的学生问我说:我感觉现在测试行业已经饱和了,也不是说饱和了,是初级的测试根本就没有公司要,哪怕你不要工资也没公司要你,测试刚学出来,没有任何的项目经验和工作经验…

MaxViT: Multi-Axis Vision Transformer

论文:https://arxiv.org/abs/2204.01697 代码地址:https://github.com/google-research/maxvit 在本文中,介绍了一种高效且可扩展的注意力模型,称之为多轴注意力,该模型由两个方面组成:分块的局部注意力和…

笔记本电脑没有声音如何解决

​笔记本电脑没有声音的现象,也是笔记本电脑的常见运用病况之一,遇到这种情况的话,大家是否知道如何处理呢?下面小编来跟大家说说笔记本电脑没有声音解决方法,希望可以帮助到大家。 工具/原料: 系统版本:windows10系统 品牌型…

Allegro 274X格式gerber输出全流程详细介绍

Allegro 274X格式gerber输出全流程详细介绍 下面介绍Allegro gerber输出的全流程介绍 首先把光绘设置好 设置光钻孔精度 会出现对话框,勾选Enhanced Excellon format,点击close 输出钻孔文件,选择Auto Tool select,点击Drill 输出椭圆孔文件,默认设置,然后点击rout…