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,一经查实,立即删除!

相关文章

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-傅里叶变化

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

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

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

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

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

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

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

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

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

19-Harris角点检测

角点检测顾名思义,就是对类似顶点的检测,与边缘有所区别 边缘可能在某一方向上变化不是特别明显,但角点在任何方向上变换都很明显 cv2.cornerHarris(img,blockSize,ksize,k) cv2.cornerHarris(gray,2,3,0.04) 参数一:img&#xff…

微机原理——指令系统——算数运算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD调整)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 算数运算指令1、加减法指令ADD、ADC 、SUB 、SBB 和增量减量指令INC、DEC、NEGADD…

20-SIFT算法

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/cfx.png) gray cv2.cvtColor(img,cv2.COL…

mysql 迁移 nosql_从关系型Mysql到Nosql HBase的迁移实践

2013年11月22-23日,作为国内唯一专注于hadoop技术与应用分享的大规模行业盛会,2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒店隆重举行。来自国内外各行业领域的近千名CIO、CTO、架构师、IT经理、咨询顾问、工程师、Hadoop…

21-特征匹配方法(Brute-Force蛮力匹配)

Brute-Force蛮力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示两个特征点相互匹配 例如A中的第i个特征点与B中的第j个特征点最近,并且B中的第j个特征点到A中的第i个特征点也是 NORM_L2:归一化数组的(欧几里得距离),如果其他特征计算…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换【1】几何变换(空间变换)简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换(不做展示)1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线Y…

probuffer java_Protocol Buffer的使用

Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同:一个是数据结构化,一个是数据序列化。这里的数据结构化…

22-随机抽样一致算法RANSAC

随机抽样一致算法(Random sample consensus,RANSAC) 看似复杂,其基本思想就是:随机选取俩点,然后连接,给定一个容忍范围,在这个范围内的点越多越好,然后不断的迭代进行找两点之间容忍范围内点最…

23-背景建模

帧差法 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标&#xf…

DB2 9 运用开辟(733 考试)认证指南,第 3 部门: XML 数据独霸(4)

议决运用顺序存储和检索 XMLXML 编码字符编码在汗青上,术语 字符集、字符编码 和 码页 都有雷同的意义:一个字符集和一个二进制码集,其中每个码示意一个字符。(码页是来自 IBM 的一个术语,示意一个大型主机或 IBM PC 上…

Opencv——霍夫变换以及遇到的一些问题

目录问题1 :颜色空间转换函数参数问题:CV_BGR2GRAY vs CV_GRAY2BGR问题2:cvRound()、cvFloor()、cvCeil()函数用法霍夫变换的含义标准霍夫直线变换霍夫线变换函数参数讲解累计概率霍夫变换霍夫变换圆变换原理和算法步骤:霍夫圆变换…

java ssm如何上传图片_ssm整合-图片上传功能(转)

本文介绍 ssm (SpringSpringMVCMybatis)实现上传功能。以一个添加用户的案例介绍(主要是将上传文件)。一、需求介绍我们要实现添加用户的时候上传图片(其实任何文件都可以)。文件名:以 博客名日期的年月日时分秒毫秒形式命名如 言曌博客2017082516403213.png路径&am…