风雨兼程

  • 4

    获得赞
  • 5

    发布的文章
  • 0

    答辩的项目

OpenCV图像处理---图像直方图

Python3

最后更新 2020-06-22 11:21 阅读 195

最后更新 2020-06-22 11:21

阅读 195

Python3

图像直方图简介:

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

1.1 原始图像

image.png灰度图:

image.png

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()

效果展示:

image.png

直方图解读:从图中我们能够很清晰的观察到,灰度值为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()

效果展示:

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

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

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

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/article/589
讨论
500字
表情
每日优质讨论奖励 20FAI
发送
每日优质讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除