17-直方图

直方图

何为直方图?没那么高大上,其实就是二维统计图。每个照片都是有像素点所组成,当然也是[0,255],直方图就是统计每个值所对应的像素点有几个。
直方图横坐标表示0-255这些像素点值;纵坐标表示对应像素点值的个数有多少个,例如:像素为55的像素点有多少个
cv2.calcHist(images,channels,mask,histSize,ranges)
cv2.calcHist([img],[0],None,[256],[0,256])

参数一:images:原图像格式为uint8或float32;当传入函数时应该用中括号括住,通常情况下都是输入的是灰度图
参数二:同样用中括号括起来,它会告诉函数我们图像的直方图;如果输入图像时灰度图它的值就是[0];如果时彩色图像传入的参数可以是[0][1][2],分别对应BGR
参数三:掩模图像,说白了就是取部分图像而已;统计整个图像的直方图时就把它设置为None;当然也可以通过掩模来统计图像的某部分的直方图
参数四:BIN的数目,也就是横坐标的总量程而已,一般都是256,也就是0-255这256个像素点值,也需要用中括号括起来
参数五:像素值的范围,一般设置为[0,256]
import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)#这里的参数0表示以灰度图进行读取
hist = cv2.calcHist([img],[0],None,[256],[0,256])#当然由于是灰度图通道数也只有一个即参数二[0];参数三None表示没有使用掩模直接输出整体图像的直方图;参数四[256]直方图的横坐标量程;参数五[0,256]像素值的范围
hist.shape#结果为:(256, 1) 其中256表示这个图像中有0-255这256个取值,1表示得到的直方图是二维的,即每个像素出现多少个plt.hist(img.ravel(),256)
plt.show()img = cv2.imread('E:\Jupyter_workspace\study\data/cat.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()

原图:
在这里插入图片描述
原图对应的灰度图的直方图:
在这里插入图片描述
原图的BGR直方图:
在这里插入图片描述

掩模mask

np.zeros(img.shape[:2],np.uint8)
上面的函数中有掩模的操作,接下来介绍一下掩模mask的定义的操作

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#创建mast,掩模是由黑白两部分组成的,然后与原图重叠,掩模白色区域对应原图区域不变,黑色区域对应原图区域变黑
mask = np.zeros(img.shape[:2],np.uint8)#这里面的掩码实际上就是边缘黑中间白,此时的mask就和原图片大小相同,uint8表示无符号八位整数0-255之间
print(mask.shape)#结果为:(321, 287)
mask[50:200,50:200] = 255#要保存的东西是白色的,白色区域为要保存的地方,所以将选取地方置为255
show_photo('mask',mask)img = cv2.imread('E:\Jupyter_workspace\study\data/cat.png',0)#灰度图读取照片
print(img.shape)#结果为:(321, 287)
show_photo('img',img)masked_img = cv2.bitwise_and(img,img,mask=mask)#与操作,也就是有0则0,黑色为0所以说掩码黑色地区都为黑;参数一表示原图像,参数三表示掩模图像
show_photo('masked_img',masked_img)hist_full = cv2.calcHist([img],[0],None,[256],[0,256])#不带掩模的图像进行统计直方图
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])#带掩模mask的时候统计图像的部分掩模区域的直方图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()

掩模图像:
在这里插入图片描述
原图:
在这里插入图片描述
掩模操作后的图像:
在这里插入图片描述
上一:原图
上二:自定义的掩模
下一:掩模对应的原图部分
下二:蓝线对应原图的直方图,橙线对应掩模处理的部分原图的直方图
在这里插入图片描述

直方图均衡化

假设某图片部分像素值为:

25512820050
5020025550
255200128128
20020025550

下面表格中的函数映射中(255-0)表示设置的横轴的量程这里设置的是0-255

灰度值像素个数概率累积概率根据函数映射后灰度值取整
5044/16 = 0.250.250.25*(255-0)=63.7564
12833/16 = 0.18750.25+0.1875=0.43750.4375*(255-0)=111.5625112
20055/16 = 0.31250.25+0.1875+0.3125=0.750.75*(255-0)=191.25191
25544/16 = 0.250.25+0.1875+0.3125+0.25=11*(255-0)=255255

均衡化后的像素值为:

25511219164
6419125564
255191112112
192191255255

均衡化之后发现了这16个数相差的并不是特别大了

cv2.equalizeHist(img)
传入图像对象名称即可进行整体均衡化

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/people.jpg',0)
plt.hist(img.ravel(),256)#原图像的直方图
plt.show()equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)#均衡化后的直方图
plt.show()res = np.hstack((img,equ))
show_photo('img_equ',res)#显示原图和均衡化后的图片

原图直方图:
在这里插入图片描述
均衡化后的直方图:
在这里插入图片描述
原图和均衡化后的图片对比:
在这里插入图片描述

均衡化后的图像脸上的细节变得更加模糊了,尴尬不???
这时候就需要自定义均衡化

自定义均衡化

直方图的均衡化也就是整体的均衡化,其他像素点值大的地方给平均给其他地方了导致一下细节会丢失
若将原图分成块进行均衡化,每块进行自己块的均衡化效果会比全局整体均衡化更好些
当然,若图像里面噪音太大,局部反而没有整体均衡化好,需要自己事先去衡量一下
cv2.createCLAHE(clipLimit = 2.0,tileGridSize = (8,8))
(8,8)表示分块均衡化中块的大小

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/people.jpg',0)
plt.hist(img.ravel(),256)#原图像的直方图equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)#均衡化后的直方图clahe = cv2.createCLAHE(clipLimit = 2.0,tileGridSize = (8,8))#自定义均衡化,每8*8分成块,按块进行均衡化
res_clahe = clahe.apply(img)res = np.hstack((img,equ,res_clahe))
show_photo('img_equ_clahe',res)

原图-整体均衡化-自定义均衡化
在这里插入图片描述

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

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

相关文章

java求水电费_java水电费管理系统

每天记录学习,每天会有好心情。*^_^*今天和一个朋友共同完成了一个基于web的java水电费管理系统项目,我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限,只会这个框架,哈哈,都是为了方便他。和往常一样…

zemax微透镜阵列示例_阵列反向! Ruby中的示例方法

zemax微透镜阵列示例阵列反向! 方法 (Array reverse! Method) In this article, we will study about Array.reverse! method. You all must be thinking the method must be doing something related to reversing certain elements as we have done in the case o…

Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)

步骤: 1、利用Opencv自带的分类器检测人脸 预备知识:Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 Haar特征分类器存放地址: (找自己的安装…

【黑马甄选离线数仓day10_会员主题域开发_DWS和ADS层】

day10_会员主题域开发 会员主题_DWS和ADS层 DWS层开发 门店会员分类天表: 维度指标: 指标:新增注册会员数、累计注册会员数、新增消费会员数、累计消费会员数、新增复购会员数、累计复购会员数、活跃会员数、沉睡会员数、会员消费金额 维度: 时间维度&#xff08…

iPad和iPhone的app图标尺寸、用途、设置方法

下面是在iPhone专用程序、iPad专用程序和通用程序中使用图标文件的指导,由译言网翻译自苹果官方文档。原文 http://article.yeeyan.org/view/395/100567 注意:图标是你的程序包所必需的组成部分。如果你没有提供程 序所需的各种尺寸的图标,系…

18-傅里叶变化

以时间为参照就是时域分析,当然时间是动态变化的 而傅里叶变换是以频域为基准的,不用关心动态变化,只关心做了多少次而已,次数,频率 傅里叶说过,任何一个周期函数都可以用正弦函数堆叠起来形成。强吧&#…

java中访问修饰符_Java中的非访问修饰符是什么?

java中访问修饰符Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name of these non-access modifiers are given below, Java中有7个非访问修饰符 。 这些非访问修饰符的名称如下所示: native 本机 synchronized 已同…

mui实现分享功能_MUI 分享功能(微信、QQ 、朋友圈)

配置文件:manifest.jsonplus ->plugins 下边"share": {/*配置应用使用分享功能,参考http://ask.dcloud.net.cn/article/27*/"qq": {"appid": "",/*腾讯QQ开放平台申请应用的AppID值*/"description"…

Java 注解学习笔记

转自:http://wanqiufeng.blog.51cto.com/409430/458883 一、什么是java注解 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。 Java注解又叫java标注…

Prime Palindromes

博客园速度非常不稳定,可能要考虑换地方了。虽然我非常喜欢博客园的模板和气氛。 这个题早就知道是怎么做的了。先求出回文数在再判断是不是素数。关键是不知道区间,那就把所有的全部求出来。虽然可能会超时,但是如果使用点技巧的话还是没问题…

Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)

DFT原理:(单变量离散傅里叶变换) 数学基础: 任何一个函数都可以转换成无数个正弦和余弦函数的和的形式。 通常观察傅里叶变换后的频域函数可以获得两个重要的信息:幅频曲线和相频曲线。 在数字图像处理中的作用&#…

python方法items_Python字典items()方法与示例

python方法items字典items()方法 (Dictionary items() Method) items() method is used to get the all items as a view object, the view object represents the key-value pair of the dictionary. items()方法用于获取所有项目作为视图对象,该视图对象表示字典的…

基于(Python下的OpenCV)图像处理的喷墨墨滴形状规范检测

通过图像处理,分析数码印花的喷头所喷出来的墨滴形状,与标准墨滴形状对比分析,来判断墨水及其喷头设备的状态,由两部分构成 PS:获取墨滴形状照片和标准墨滴形状照片都是手绘的,将就的看吧,主要…

const_iterator,const 迭代器

const 迭代器:是迭代器产量,该迭代器的值不能被修改,且需要初始化,初始化之后不能指向其他元素。const_iterator:当我们对const_iterator类型解引用时,返回一个const值,所以只能读,不能写。它是一种迭代器…

临时禁止令:诺西购摩托罗拉面临流产窘境?

近日,美国伊利诺伊州北区法院就中国华为起诉摩托罗拉公司和诺西一案作出初步裁决,禁止摩托罗拉解决方案公司(Motorola Solutions)向诺西披露华为的机密资料。此判决一出,各方评论纷沓而来。笔者认为,从诺西12以美元并购摩托罗拉部…

mysql replace into 语法_mysql Replace into与Insert update

Replace intoreplace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。2. 否则,直接插入新数…

微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176 传送类指令1&…

lastindexof方法_Java Vector lastIndexOf()方法与示例

lastindexof方法向量类别的lastIndexOf()方法 (Vector Class lastIndexOf() method) Syntax: 句法: public int lastIndexOf (Object ob);public int lastIndexOf (Object ob, int indices);lastIndexOf() method is available in java.util package. lastIndexOf(…

李开复:微博的价值在哪里

导读:微博可以改变社会现象,可以传播信息,可以帮助你成长,可以发出你的声音。它让我们能够人人成为记者,让每一个转发的人都变成了一个编辑 很多人问微博是抢了谁的生意,开心网还是人人网?其实它…

mysql 任务计划 /etc/cron.d_Linux /etc/cron.d增加定时任务

一般情况下我们添加计划任务时,都是直接修改/etc/crontab。但是,不建议这样做,/etc/cron.d目录就是为了分项目设置计划任务而创建的。例如,增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新…