hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...

本文主要介绍一些opencv关于直方图的一些知识运用,直方图是非常常用的图像处理方法,有时候在很多图像预处理中能起到特别好的效果,大家可以一起来学习探讨~


目录

  • 直方图
  • 计算直方图
  • 直方图均衡化
  • CLAHE 自适应均衡化
  • 2D直方图
  • 直方图反射投影

直方图

✏️ 问:什么是直方图?

️ 答:直方图是可以对整幅图的灰度分布进行整体了解的图示,通过直方图我们可以对图像的对比度、亮度和灰度分布等有一个直观了解。

计算直方图

  • 使用opencv的函数cv2.calcHist(images, channels, mask, histSize, ranges):
    • 参数1:要计算的原图,以方括号的传入,如:[img]。
    • 参数2:类似前面提到的dims,灰度图写[0]就行,彩色图B/G/R分别传入[0]/[1]/[2]。
    • 参数3:要计算的区域ROI,计算整幅图的话,写None。
    • 参数4:也叫bins,子区段数目,如果我们统计0-255每个像素值,bins=256;如果划分区间,比如0-15, 16-31…240-255这样16个区间,bins=16。
    • 参数5:range,要计算的像素值范围,一般为[0,256)。
hist = cv2.calcHist([img], [0], None, [256], [0, 256])  # 性能:0.025288 s
  • 使用numpy的函数 np.bincount():
    • 用Numpy的函数计算,其中ravel()函数将二维矩阵展平变成一维数组.
hist = np.bincount(img.ravel(), minlength=256)  # 性能:0.003163 s
  • 绘制直方图使用Matplotlib自带的绘制工具plt.hist()绘制。
plt.hist(img.ravel(), 256, [0, 256])

✔️ 当然,也可以用前面计算出来的结果绘制:

plt.plot(hist)
2cef7916f508d83018f8bec775d0f54a.png

✔️ 当然,也可以绘制出r,g,b不同通道的直方图

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg')color = ('b','g','r')for i,col in enumerate(color):    histr = cv.calcHist([img],[i],None,[256],[0,256])    plt.plot(histr,color = col)    plt.xlim([0,256])plt.show()
e8958550521844242dec0988213cc37c.png

r,g,b通道的直方图

✔️ 当然,也可以绘制出ROI的直方图

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('../data/home.jpg',0)mask = np.zeros(img.shape[:2], np.uint8)mask[100:300, 100:400] = 255mask_img = cv.bitwise_and(img, img , mask = mask)hist_full = cv.calcHist([img],[0],None,[256],[0,256])hist_mask = cv.calcHist([img],[0],mask,[256],[0,256])cv.imshow('fd', mask_img)cv.waitKey(0)plt.subplot(221), plt.imshow(img, 'gray')plt.subplot(222), plt.imshow(mask,'gray')plt.subplot(223), plt.imshow(mask_img, 'gray')plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)plt.xlim([0,256])plt.show()
796049c3b479653152df45a9a540caf3.png

ROI的直方图

直方图均衡化

⛳️ 一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度。

9d3e0756ca87907928b06635a24f872b.png

直方图均衡化

OpenCV中用cv2.equalizeHist() 实现均衡化:

1️⃣ 灰度图均衡,直接使用cv2.equalizeHist(gray)

2️⃣ 彩色图均衡,分别在不同的通道均衡后合并

import cv2import numpy as npimg = cv2.imread("girl.jpg", 1)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 灰度图均衡化equ = cv2.equalizeHist(gray)# 水平拼接原图和均衡图result1 = np.hstack((gray, equ))# 彩色图像均衡化,需要分解通道 对每一个通道均衡化(b, g, r) = cv2.split(img)bH = cv2.equalizeHist(b)gH = cv2.equalizeHist(g)rH = cv2.equalizeHist(r)# 合并每一个通道equ2 = cv2.merge((bH, gH, rH))# 水平拼接原图和均衡图result2 = np.hstack((img,equ2))
ca8f1a18dc6857aab49c78ac4832cb7b.png

灰度均衡化

02ca70a755caa9d6cd64631fce8d3cb7.png

彩色均衡化

CLAHE 自适应均衡化

  1. 直方图均衡化是应用于整幅图片的,会导致一些图片部位太亮,导致大部分细节丢失,因此引入自适应均衡来解决这个问题。
  2. 它在每一个小区域内(默认8×8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域内的对比度进行了限制。
  3. 彩色图同样需要split为r,g,b后均衡,然后merge。
# 自适应均衡化,参数可选clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl1 = clahe.apply(img)
2ba3b16221a679874031c32cc1b50efa.png

2D直方图

⛳️ 2D直方图通常需要考虑每个颜色(Hue)和饱和度(Saturation)。

✔️ 同样适用cv2.calcHist()函数计算直方图

✔️ 参数修改:

  • channels=[0,1] 因为我们需要同时处理 H 和 S 两个通道。
  • bins=[180,256] H通道为180,S通道为256。
  • range=[0,180,0,256] H 的取值范围在0到180, S的取值范围在0到256。
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('home.jpg')hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)hist = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )plt.imshow(hist,interpolation = 'nearest')plt.show()
c6ae30c44e02f21bfcd2874efd7a45cd.png

2D直方图

直方图反射投影

  • 反向投影可以用来做图像分割,寻找感兴趣区间。它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标。
  • 直方图投影经常与camshift(追踪算法)算法一起使用。
  • 过程:首先要为包含我们感兴趣区域的图像建立直方图。被查找的对象最好是占据整个图像(图像里全是对象),最好使用颜色直方图,物体的颜色信息比灰度图像更容易被分割和识别。再将颜色直方图投影到输入图像查找目标,也就是找到输入图像中每一个像素点的像素值在直方图中对应的概率,这样就得到一个概率图像,最后设置适当的阈值对概率图像进行二值化。

⛳️ Opencv函数 cv2.calcBackProject()直接实现反向投影,参数与cv2.calcHist() 基本一致。其中一个参数是要查找的目标的直方图。在使用目标直方图反向投影前应该进行归一化处理。返回结果是一个概率图像,然后进行圆盘形状卷积操作,再二值化。

import cv2import numpy as np# 想要寻找的roi图片roi = cv2.imread('roi.png')hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# 目标搜索图片target = cv2.imread('football.png')hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)# 计算roi直方图roihist = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])# 归一化,参数为原图像和输出图像,归一化后值全部在0到255范围# cv2.NORM_MINMAX 对数组的所有值进行转化,使它们线性映射到最小值和最大值之  间cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)dst = cv2.calcBackProject([hsvt], [0,1],roihist, [0, 180, 0, 256], 1)# 此处卷积可以把分散的点连在一起disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))dst = cv2.filter2D(dst, -1, disc)ret, thresh = cv2.threshold(dst, 50, 255, 0)#使用merge变成通道图像thresh = cv2.merge((thresh,thresh,thresh))# 按位操作res = cv2.bitwise_and(target, thresh)res = np.hstack((target, thresh, res))cv2.imwrite('res.jpg', res)# 显示图像cv2.imshow('1', res)cv2.waitKey(0)cv2.destroyAllWindows()
4a71b30c58eb0928f3f8fa07ebb031e2.png

roi图片

0509dcf300171cee7a88bc732b6798e5.png

目标图

7865b789ebda4f6de8450d467b0a8b9b.png

查询结果

未完待续~

------------------------------------可爱の分割线------------------------------------

更多Opencv教程将后续发布,欢迎关注哟~❤️❤️❤️

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

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

相关文章

浙江嘉兴计算机学校排名,嘉兴计算机考研线上课程实力排名

嘉兴计算机考研线上课程实力排名冲刺分清主次现在各科的复习已经进入**后的收尾工作了,现在基本上就是扫除知识盲区,进行知识点的查缺补漏非法学法律硕士考研报考条件而且,妥协次就会有第二次,所以一开始就不要下载那些APP&#x…

b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树

其实平衡二叉树的代码实现已经挺复杂的了,但是一山更比一山高,B树算法的原理和代码实现都比平衡二叉树要更为复杂。我没有让大家知难而退的意思,面试的时候肯定不会让你写B树这么复杂的算法,大家先听我讲讲B树这种数据结构的思想吧…

计算机技术如何设计酶,百人学者Nature Chemical Biology发文,发现一种设计酶的新方法...

生物通报道:中科院微生物研究所,荷兰格罗宁根大学的研究人员发表了题为“Computational redesign of enzymes for regio- and enantioselective hydroamination”的文章,利用计算机方法重新设计了天冬氨酸酶,将其转化为不对称加氢…

全国计算机二级哪几门比较热,【热】全国计算机二级office难吗

摘要: 【热】全国计算机二级office难吗为你介绍计算机二级office难吗 计算机二级office比较难,计算机二级office考试通过率大致在22%左右,具有一定难度。想要通过考试,需要多刷计算机二级office真题。 计算机二级office考试难度对…

word总页数不包含封面_6个实用的word模板,让你快速制作表格和目录

Word是我们日常办公经常用到的一款软件,word中自带了一些常用操作的模板,可以方便我们快速实现相应的需求,而且颜值也会提升一个档次,但是不过我们很多朋友都不太知道,今天就给大家盘点一些word中都有哪些好用的模板&a…

前端面试技巧和注意事项_前端面试百分之九十九过的技巧

2020最全的前端面试指南,一个多月 1.8w 字的面试经验积累,凭借它最终成功入职大厂……今年的金三银四刚好赶上疫情,很多大公司都停止招聘甚至裁员,想跳槽的小伙伴被打的措手不及。需求减少要求肯定随之提高,谨以此面经…

node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?

刚开始,先抛出一个问题:你知道你们生产环境的 Node 服务平时占用内存多少吗?或者说是多少量级?山月在面试 Node 候选人时,这个问题足够筛掉一半的自称Node精通者,不过没有回答上来,我往往会再补…

调python返回图片_三个好习惯,帮你写好Python里的异常处理

如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在。打个比方,当你在脚本执行时按 ctrlc 退出,解释器就会产生一个 KeyboardInterrupt 异常。而 KeyError、 ValueError、 TypeError 等更是日常编程里随处可…

如何调位置_如何知道手表是偷停还是真没动力了?看完之后你在家也能测

导读:石英表如果出现偷停情况,通常是这几个地方出现问题:一、线路板接触不良;二、电池未安装到位;三、电池电量不足;四、受力导致的电池接触不良等;解决方案:一、修复或更换线路板&a…

怎么安装aptdaemon模块_自己开发一个React Native 模块

大纲为什么需要 React Native Module如何创建一个 React Native的模块编写 Android Toast 功能模块如何调试 React Native 模块---------官方文档中未提及或者我没有找到,这里是我自己探索的npm 发布一个 React Native 模块(外链接)为什么需要…

语言ppt课件猜拳_八年级语文上册第22课 孟子三章讲解及课件下载

八年级语文上册【第一单元】八年级语文上册第1课《消息二则》讲解及PPT课件下载八年级语文上册第2课《首届诺贝尔奖颁发》讲解及PPT课件下载八年级语文上册第3课《“飞天”凌空》讲解及PPT课件下载八年级语文上册第4课《一着惊海天》讲解及PPT课件下载八年级语文上册第5课《国行…

读取txt原理_Mysql客户端任意文件读取学习

前言最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞。漏洞形成原因此漏洞形成的主要原因在于 LOAD DATA INFILE这个语法上。在官方文档中的介绍为:该L…

jar包 jdk 停_一文读懂jar包的小秘密

简介java程序员每天不是在创建jar包就是在创建jar包的路上,并且各种依赖引用都是以jar包的形式展示的。但是随着现代IDE的出现,我想很多程序员已经基本上很少直接和jar包打交道了。换句话说,他们已经不认识jar包了。那么jar包到底是什么呢&am…

逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门

Hello World!我是老乔,欢迎来到超智星球。在这里,每篇都学一个小知识。微号:超智星球 网站:http://chaozhixingqiu.com这期呢,还是计算机原理系列,上期最后讲到了自动制表机和IBM。本期接着讲计算机历史。#…

文本标点英文对齐_电脑健盘中的所有英文组合意思超值解释建议收藏

电脑键盘上所有英文键的意思1、Esc :取消和退出键2、Tab :表格键切换键3、Caps Lock :字母大小写切换键4、Shift :转换键5、Ctrl: 控制键,需要配合其他键或鼠标使用, 例如复制CtrIC6、Alt: 可选(切换)键,-般与其它键组合使用, 例如…

众辰变频器参数设定_变频器被加密了怎么办?这20个品牌都可以解密

1、西门子6SE70书本型变频器:设定密码打不开时,将P358和P359中数据改为相同即可。2、ABBACS600变频器:在16.03参数中输入密码“23032”,102.01参数设置为false,可以进入设定所有主控板参数。3、三菱740系列变频器&…

怎么实现注解_通透!一口气搞懂注解到底怎么用

日志脱敏场景简介在日志里我们的日志一般打印的是 model 的 Json string,比如有以下 model 类public class Request { /** * 用户姓名 */ private String name; /** * 身份证 */ private String idcard; /** * 手机号 *…

嵌套饼图_你真的了解matplotlib吗?---环形图

环形图简介环形图是饼图衍生出来的统计图形,可以看作是两个以上饼图的叠合。环形图与饼图类似,其实是有差别的。饼图是用圆形及圆内扇形的面积来表示数值大小的图形,主要用于表示总体中各组成部分所占的比例。与之对比,环形图中间…

JAVA入门级教学之(零基础了解计算机)

JAVA小白入门级教学(零基础了解计算机基础知识) 多动手自己操作,一点一点积累 首先我们了解一下计算机的基础知识 1.计算机构成(基础): 硬件:CPU、内存、硬盘、鼠标、显示器、鼠标等&#x…

JAVA入门级教学之(JAVA程序的加载和运行)

JAVA程序的加载和运行 多思考多动脑(边参考文章最后的示意图,边按步骤理解) 1.JAVA程序的加载和运行包括两个非常重要的阶段: 编译阶段运行阶段 2.我们先来了解一下什么是编译阶段: 首先,我们自己动手敲…