永兴的笔记-OpenCV-7图像直方图 1 基本介绍

在这里插入图片描述

一、什么是图像直方图:

直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
图像直方图是数值数据分布的精确图形表示。

  • 颜色直方图:
    颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
    • 灰度直方图(我们使用比较多的):
      简单来说就是统计各个像素值的个数。比如说一幅灰度图中像素值中像素值为88的有多少个,像素值为66的有多少个像素点。
      在这里插入图片描述
      在这里插入图片描述
二、为什么要使用直方图:

图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类。

  • 为什么说直方图计算代价较小?
    例如一个1024x1024的图像,当转换成直方图时会进行其分组,列如分为255组,那么这1024x124个像素会被叠加分到这255组中去,即处理起虽然值变大了,但是像素点变少了,不需要去拆分rgb(hsv除外)三色,不需要单步计算等额外的工作,只需要通过特定的算法对这255组进行计算即可,所以说代价是较小的!
  • 颜色直方图的意义如下:
      ● 颜色直方图是图像中像素强度分布的图形表达方式。
      ● 它统计了每一个强度值所具有的像素个数。
  • 图像直方图应用的常见方向:
    • 图像分割:
      图像分割是图像识别的基础,对图像进行图像分割,将目标从背景区域中分离出,可以避免图像识别时在图像上进行盲目的搜索,大大提高图像识别的效率以及识别准确率。基于灰度直方图的阈值分割计算简单,适用于目标与背景分布于不同灰度范围的灰度图像,特别是遥感图像。
    • 图像检索:
      图像检索是指快速有效地从大规模图像数据库中检索出所需的图像,是目前一个非常重要又富有的挑战性的研究课题。颜色特征由于其直观性、计算代价较小等优点,在图像检索中扮演着重要角色,早期的图像检索算法也主要利用颜色特征,特别是颜色直方图。
    • 图像分类:
      图像分类任务主要是对一组图进行一系列自动处理,最终确定图形所属的类别。图像分类具有广泛的应用前景,是计算机视觉的难点问题。针对图像分类的算法众多,其中以基于bag-words模型的方法最为经典有效。该方法首先利用提取的颜色、形状等特征构建视觉词典,然后在图像上统计视觉词的直方图,最后利用视觉词直方图作为特征运用分类器进行分类决策。
三、绘制直方图:

1、Python图像可视化简单介绍:

#安装 matplotlib 
pip install matplotlib
#导入 
import matplotlib.pyplot as plt 
plt.plot(*args, scalex=True, scaley=True, data=None, **kwargs)

点击打开:介绍教程

plt.title(label, fontdict=None, loc='center', pad=None, **kwargs)
  • label : 图像名称

2、绘制直方图:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)

  • images : 绘制直方图的图像
  • channels : 要计算的通道数,灰度图写[0]就行,彩色图B/G/R分别传入[0]/[1]/[2]。
  • mask : 图像掩膜 , 如果需要计算整个区域 则 填写 None
  • histSize : 子区段数目
  • ranges : 需要计算的像素范围
  • hist :传入的 hist 直方图
  • accumulate : 布尔值 ,表示是否对传入的 hist 清零。不清零的话可以将多幅图像的直方图累加。

返回值:

  • hist : 直方图数据
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("first.jpg",0) #以灰度模式读取图像
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist),plt.title("hist")
plt.show()
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

hist , bins = np.histogram(a, bins=10, range=None, normed=None, weights=None,density=None)
参数:

  • a : 图像像素的数组
    ravel() 的作用是将多维数组或者矩阵降维一维
  • bins : 子区段的个数
  • range :要计算的像素值范围,一般为[0,256]

返回值:

  • hist : 直方图数据
  • bins :返回子段交界点的值的数组
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("first.jpg",0) # 以灰度模式读取图像
hist , bins = np.histogram(img.ravel(),256,[0,256])
print(bins)
plt.plot(hist)
plt.title("hist")
plt.show()
cv2.imshow("img",img)

在这里插入图片描述
在这里插入图片描述

练习题7-1
绘制自己喜欢的图像的彩色直方图。

评论出你的答案

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值