博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV+python:直方图的概念及绘制(Histogram)
阅读量:3950 次
发布时间:2019-05-24

本文共 1799 字,大约阅读时间需要 5 分钟。

1,直方图的概念

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。

图像灰度直方图:

一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率
在这里插入图片描述
归一化直方图:
通常会将纵坐标归一化到[0,1]区间内,也就是将灰度级出现的频率(像素个数)除以图像中像素的总数。灰度直方图的计算公式如下:
在这里插入图片描述
其中,rk是像素的灰度级,nk是具有灰度rk的像素的个数,MN是图像中总的像素个数。
2,直方图的绘制

import cv2 as cvimport numpy as npfrom matplotlib import pyplot as plt#%matplotlib inlinedef plot_demo(image):    plt.hist(image.ravel(), 256, [0, 256]) #image.ravel()#ravel函数功能是将多维数组降为一维数组,统计各个bin的频次,256:bin的个数,[0, 256]:范围    plt.show("直方图") #和OpenCV中的想要的直方图不同"""画灰度图直方图:绘图都可以调用matplotlib.pyplot库来进行,其中的hist函数可以直接绘制直方图。plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)hist的参数非常多,但常用的就这五个,只有第一个是必须的,后面四个可选arr: 需要计算直方图的一维数组bins: 直方图的柱数,可选项,默认为10normed: 是否将得到的直方图向量归一化。默认为0range参数表示箱子的下限和上限。即横坐标显示的范围,范围之外的将被舍弃"""def image_hist(image):    color = ('blue', 'green', 'red')  #图像三通道    for i, color in enumerate(color):        hist = cv.calcHist([image], [i], None, [256], [0, 256]) #绘制各个通道的直方图        plt.plot(hist, color=color) #定义线的颜色        plt.xlim([0, 256]) #x轴的范围    plt.show()"""calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) images参数表示输入图像,传入时应该用中括号[ ]括起来channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。mask参数表示掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。histSize参数表示灰度级的个数,需要中括号,比如[256]ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],则代表0通道范围是0-256,1通道范围0-180。hist参数表示计算出来的直方图。"""src = cv.imread("F:/images/lena.png")cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)cv.imshow("input image", src)plot_demo(src)image_hist(src)cv.waitKey(0)cv.destroyAllWindows()

运行结果:

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

转载地址:http://mxhwi.baihongyu.com/

你可能感兴趣的文章
android 用svn管理的版本编译出来有问题
查看>>
android 如何用jar包代替java代码编译
查看>>
android 数据连接关闭的情况下如何让彩信发不出去
查看>>
android 编辑彩信,加入几页铃声,预览暂停界面,铃声名字不见了
查看>>
android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
查看>>
android 关于LCD背光调节渐变过程引起背光闪烁问题
查看>>
android 保存具有不同前缀的同一号码分别为A和B,用其中一个呼叫,通话记录一直显示另一个联系人名字的问题
查看>>
android 在手机中预置联系人/Service Number
查看>>
android 系统语言为英语时,Contacts联系人名字含有特殊前缀后缀(Dr. Mr. Lt等)时的相关问题处理
查看>>
android 短信下,添加联系人,进入联系人多选界面出现联系人电话号码晃动的问题
查看>>
android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
查看>>
正确学习javascript。困惑的指南
查看>>
SERO幻影社区的背景怎么样?几大主流隐私币种技术分析!
查看>>
SERO目前具备的十大技术特点
查看>>
Neo4j CQL语句学习Day3
查看>>
Neo4j CQL学习Day4
查看>>
Mysql 数据库
查看>>
MySQL数据库练习
查看>>
Neo4j学习Day5
查看>>
Tomcat的基本配置
查看>>