基于Python的Opencv学习

基于Python的Opencv学习第十四天

今天介绍一下直方图的知识点,来看看把。

一.直方图基本概念

直方图,众所周知类似于我们在小学就见过的柱形图,直方图有两个坐标,分别为横坐标和纵坐标。

**横坐标:图像中各个像素点的灰度级
(灰度级:就是图像中像素的值,如8位灰度图中,灰度级范围从0-255共256种灰度级)
**
纵坐标:具有该灰度级的像素个数

在这里插入图片描述
根据得到的像素点的灰度级和具有该灰度级的像素个数两者可以组成一个直方图,看下图示例:
在这里插入图片描述
除了上述直方图外,还有归一化直方图

横坐标:图像中各个像素点的灰度级
纵坐标:出现这个灰度级的概率
(概率的计算:用原本的y值除以所有像素的个数,在上述例子中:
y=[3/9 1/9 2/9 1/9 2/9])
这里注意纵坐标需要修改成概率值
在这里插入图片描述
在直方图中:
最小值:0,黑色
最大值:255,白色

二.绘制直方图

类似与调用numpy库一样,我们需要调用pyplot库
函数hist,功能为根据数据源和像素级绘制直方图
格式为:
hist(数据源,像素级)
数据源:图像,必须是一维数组
像素级:一般是256,指[0,255]
一个图像,有行有列,为二维,我们需要将他转化为一维数组。转化时需要调用ravel()函数,功能是将多维数组降为一维数组,格式如下:

一维数组=多维数组.ravel()
在这里插入图片描述

import cv2
import matplotlib.pyplot as plt
img=cv2.imread(r"C:\Users\LT010407\Desktop\boat.jpg")
plt.hist(img.ravel(),256)
cv2.imshow("img",img)

在这里插入图片描述

三.使用Opencv统计直方图

上文分别介绍了横坐标:是图像中各个像素点的灰度级,纵坐标为:具有该灰度级的像素个数。在Opencv中使用**calcHist()函数来求直方图的数据,即各个灰度级的像素个数,如图所示:
在这里插入图片描述
使用
calcHist()函数来求[N0,N1,N2,…,N244,N255]**这些数据
具体语法如下:

hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate)

hist:直方图,返回的直方图为一个二维数组,256行1列,如图:在这里插入图片描述
images:原始图像

channels:指定通道
①通道编号需要用中括号括起来
②输入图像为灰度图时,它的值为[0]
③彩色图像可以是[0],[1],[2]分别对应通道B,G,R

mask:掩码图像
①统计整幅图像的直方图,设为None
②统计图像某一部分的直方图时,需要掩码图像
(掩码会在后文着重讲解

histSize:BINS的数量,一般为256,但需要用中括号括起来
ranges:像素值的范围,一般为[0,255],需要中括号括起来

accumulate:累计标识,可选参数,一般省略
①默认值为false
②如果被设置为true,则直方图在开始分配时不会被清零
③该参数允许从多个对象中计算单个直方图,或用于实时更新直方图
④多个直方图的累积结果,用于对一组图像计算直方图

import cv2
import numpy as np
img=cv2.imread(r"C:\Users\Samut\Desktop\lena.jpg")
hist=cv2.calcHist([img],[0],None,[256],[0,255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)

在这里插入图片描述
在这里插入图片描述
这里能够看到这幅图片的数据。

四.绘制Opencv统计直方图

在绘制统计直方图时,我们需要调用一个叫matplotlib.pyplot的包,这个包提供了类似于matlab的绘图框架。来看实例:

实例一:

import numpy as np
import matplotlib.pyplot as plt
x=np.arrange(0,5,0.1)
#创建一个初始值为0,终止为5(不包括5),步长为0.1的数组
y=np.sin(x)
#引用lsin()函数
plt.plot(x,y)

在这里插入图片描述

实例二:

import numpy as np
import matplotlib.pyplot as plt
x=[0,1,2,3,4,5,6]
y=[1.3,0.4,2,5,3,4.5,4]
plt.plot(x,y)

在这里插入图片描述
在使用plt.plot()函数时,还能使用color=‘ ’来标注颜色,具体可填入r,g,b,分别对应红,绿,蓝三种颜色。来看实例:

import numpy as np
import matplotlib.pyplot as plt
a=[1,2,1,2]
plt.plot(a,color='r')

在这里插入图片描述
通常情况下,我们都结合calcHist()函数和plt.plot()函数一同来绘制一幅图像的统计直方图,来看实例:

灰度图像:

import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread(r"C:\Users\Samut\Desktop\boat.jpg")
hist=cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(hist,color='b')
plt.show()

在这里插入图片描述
在这里插入图片描述
彩色图像:

import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread(r"C:\Users\Samut\Desktop\girl.jpg")
histb=cv2.calcHist([img],[0],None,[256],[0,255])
histg=cv2.calcHist([img],[1],None,[256],[0,255])
histr=cv2.calcHist([img],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()

在这里插入图片描述
以上就是对直方图的初步认识和绘制直方图的初步介绍,可以研究具体函数用法和代码实例来加深印象。我们下一篇博客见。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值