OpenCV图像处理(十六)---图像直方图

       

比热容(Specific Heat Capacity,符号c),简称比热,亦称比热容量,是热力学中常用的一个物理量,用来表示物质吸热或散热本领。比热容越大,物质的吸热或散热能力越强。它指单位质量的某种物质升高(或下降)单位温度所吸收(或放出)的热量。其国际单位制中的单位是焦耳每千克开尔文[J/( kg· K )],即令1KG的物质的温度上升1开尔文所需的热量。根据此定理,最基本便可得出以下公式:

物质的比热容越大,相同质量和温升时,需要更多热能。以水和油为例,水和油的比热容分别约为4200 J/(kg·K)和2000 J/(kg·K),即把相同质量的水加热的热能比油多出约一倍。若以相同的热能分别把相同质量的水和油加热的话,油的温升将比水的温升大。

                                                      

科普

前言

     在上一期的文章中,我们学习了图像的轮廓特征,主要学习了轮廓检测函数和框选函数。今天,我们将继续学习图像的新知识--直方图。

一、直方图

图像直方图简介:

     在介绍图像直方图之前,我们先来回顾一下数学中直方图的含义,还记得初中的时候,我们学习过用来表示样本数据的趋势或者分布的统计图吗?折线图和直方图就是代表之一,我们知道折线图是用来表示数据的行走趋势(简单说就是高高低低的一条折线),直方图是用来表示数据中各个类型的数量的(比如说 ,一堆人民币包含了各种数值的钞票,用直方图来表示,你将会观察到10元的有多少张,20元有多少张)的统计图,那么,图像中的直方图是否也是类似的呢?我们看看一下吧,直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的多少个……直方图是一种分析图片的手段,当然,图像中比较常见的颜色格式是彩色和灰度的,针对灰度图像直方图,我们可以这样理解,灰度直方图是图像中像素灰度集的一种统计反应。它能够描述图像中灰度的分布情况,直观地展现出图像中灰度所占多少。直方图横轴表示像素的灰度范围(比如说 0~255),纵轴表示的是像素的数量或者密度。

1.1 原始图像

灰度图:

1.2 代码实践 

  直方图实现一:pyplot提供了类似matlab的绘图框架,

  • import matplolib.pyplot as plt

  • plt.hist hist(图像原始数据,像素的范围) 图像的灰度级是0-255,一共256个。因为该直方图函数需要一维数据,所以需要用到ravel()函数,将多维数组降为一维数组。

#coding:utf-8
import cv2
# 导入matplotlib.pyplot包,我们需要用到它的函数
import matplotlib.pyplot as plt


# 以灰度模式读入图片
gray_img = cv2.imread("./fig.jpg", cv2.IMREAD_GRAYSCALE)
cv2.imshow("gray_img", gray_img)


# 调用hist函数绘制直方图
plt.hist(gray_img.ravel(), 256)
# 显示直方图
plt.show()


cv2.waitKey()
cv2.destroyAllWindows()


效果展示:

 

直方图解读:从图中我们能够很清晰的观察到,灰度值为50左右的像素有2500多个,其余的在100个左右。分布相对均匀。

直方图实现二:openv已经为我们准备好了绘制直方图函数,

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

参数

  • images : 原始图像

  • channels : 指定通道

  • 通道编号需要用中括号括起来

    输入图像是灰度图时,它的值为[0]

    彩色图像可以使[0],[1],[2]分别对应通道B,G,R。

  • mask : 掩码图像

  • 统计整幅图像的直方图,设为None。

    统计图像某一部分的直方图时,需要掩码图像

    histSize : BINS的数量

    ranges : 像素值返回RANGE

    像素值范围,例如:[0, 255]

    accumulate : 累计标识

    默认值为false

    如果被设置为true,则直方图在开始分配时不会被清零

    该参数允许从多个对象中计算单个直方图,或者用户实施更新直方图

    多个直方图的累计结果,用户对一组图像计算直方图

#coding:utf-8
# 导入matplotlib.pyplot包,我们需要用到它的函数
import matplotlib.pyplot as plt
import cv2
# 以灰度模式读入图片
gray_img = cv2.imread("./fig.jpg", cv2.IMREAD_GRAYSCALE)


#调用cv2.calcHist()函数绘制直方图
hist = cv2.calcHist([gray_img], [0], None, [256], [0, 255])


# 用绿色绘制
plt.plot(hist, color="g")
plt.show()


效果展示:

直方图解读:通过直方图可以观察到,与上一种绘制结果差不多,仅仅是表现方式不一样,上面的直方图使用长矩形的方式展现的,下面的直方图更侧重于用数学函数,而且是连续的函数进行表达。

直方图的作用:从上面的实例我们可以了解到,其实每一个图像的直方图是不一样的,由此,直方图可以用来进行比较不同的图像,不过直方图用到最多的是,均衡化,何为均衡化,简单地说,使得图像的像素值尽量分布均匀,而不是高低差落较大,这样的好处是,能够更好的观察图像的细节部分,如果想要继续学习更多知识,我们下期文章或许可以推出哦,大家敬请关注!

结语

     今天的文章分享结束了,图像直方图能够让我们直观的看到像素的分布情况,也可以用在精度不是很高的图像识别问题,希望大家下去学会相关函数的使用,实践方知其所以然。

编辑:玥怡居士|审核:小圈圈居士

往期精彩回顾

OpenCV图像处理(十五)---图像轮廓特征

OpenCV图像处理(十四)---边缘检测

OpenCV图像处理(十三)---图像滤波

扫码关注更多精彩

点亮在看,你最好看!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值