Python+OpenCV图像处理之直方图统计

 更新时间:2021年12月18日 11:52:26   作者:一马归一码  
直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识。本文将为大家详细介绍一下如何通过OpenCV实现直方图统计,感兴趣的可以了解一下

1. 直方图概述

(1)基本概念

直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布。直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度、灰度分布、对比度等有了一个直观的认识

(2)直方图中的术语

BINS

前面说到,直方图中的 x 轴表示的是灰度值,一幅灰度图的灰度等级有 256 级,所以我们是否需要将每一个等级标注在一条轴上呢?或者如果我们需要的不是每一个灰度值的分布,而是一个范围内的灰度分布呢?所以我们将每一个需要的灰度值范围称为一个 BIN,即所有的灰度等级被分为几个小组,每一个小组是一个 BIN

DIMS

代表的是我们收集的图像的参数的数目,直方图我们如果只收集灰度值一个参数,那么该参数的值就是1

RANGE

代表统计的灰度值的范围,一般的范围是[0-255]

2. 直方图绘制

(1)读取图像信息

在计算机视觉系列的文章中第一件事就是读取图像信息:

"""
Author:XiaoMa
date:2021/10/24
"""
#调用需要的包
import cv2
import matplotlib.pyplot as plt
 
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)     #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)

图像信息如下:

419 636 

(2)绘制直方图

绘制直方图使用的函数如下:

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

images:原图

channels:指定通道 [0]代表灰度图,如果读入的图像不是灰度图,该值可以是[0],[1],[2]分别代表通道 B,G,R

mask:掩码图像,进行整张图的绘制时为 None

histSize:BIN 的数量

ranges:像素值范围

accumulate:累计标识,一般可以省略

灰度图的直方图 

#绘制直方图
hist = cv2.calcHist([img1], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '直方图', linestyle = '--')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()

可以看出这幅灰度图中亮度较高的像素点还是占多数的,即整体亮度较高

彩色图直方图

读入彩色图像,并对某一个通道进行直方图绘制

"""
Author:XiaoMa
date:2021/10/24
"""
#调用需要的包
import cv2
import matplotlib.pyplot as plt
 
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
 
img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')
img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img0)
cv2.waitKey(delay = 0)
 
#绘制直方图
hist = cv2.calcHist([img0], [0], None, [256], [0, 255])
plt.plot(hist, color = 'lime', label = '蓝色通道直方图', linestyle = '--', alpha = 1)
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')
plt.show()

上图就是对蓝色通道绘制的直方图 

3. 掩膜直方图

(1)基本概念

如果我们不需要整幅图像中的直方图,而是某个区域的直方图,我们只需要绘制一幅图,将需要统计的部分设置为白色,不需要统计的部分设置为黑色,就构成了一幅掩膜图像

(2)实现代码

得到掩模图

##得到掩膜图
mask = np.zeros(img0.shape, np.uint8)    #将每一个像素点设置为0,就是黑色
mask[109:309, 212:412] = 255             #选取特定区域设置为白色
img0_1 = cv2.bitwise_and(img0, mask)     #图像与操作得到掩膜图
cv2.namedWindow("W1")
cv2.imshow("W1", img0_1)
cv2.waitKey(delay = 0)

绘制掩膜直方图 

#绘制掩膜直方图
##得到掩膜图
mask = np.zeros(img1.shape, np.uint8)    #将每一个像素点设置为0,就是黑色
mask[109:309, 212:412] = 255             #选取特定区域设置为白色
img1_1 = cv2.bitwise_and(img1, mask)     #图像与操作得到掩膜图
cv2.namedWindow("W1")
cv2.imshow("W1", img1_1)
cv2.waitKey(delay = 0)
##绘制掩膜直方图和部分图像直方图
hist1 = cv2.calcHist([img1], [0], mask, [256], [0, 255])         #掩膜图直方图,参数需要修改
hist2 = cv2.calcHist([img1], [0], None, [256], [0,255])
plt.plot(hist1, color = 'b', label = '掩膜直方图', linestyle = '--')
plt.plot(hist2, color = 'r', label = '原图直方图', linestyle = '-.')
plt.legend()
plt.savefig('E:\From Zhihu\For the desk\cvseven2.jpeg')
plt.show()

得到的图像如下:

4. H-S 直方图

(1)基本概念

 H(Hue) - S(Saturation) 直方图,即色调 - 饱和度直方图

绘制该直方图需要将源RGB图像转化到 HSV (色调、饱和度、亮度)颜色空间中去

img0_2 = cv2.cvtColor(img0, cv2.COLOR_BGR2HSV) #将 RGB 空间转化为 HSV 空间
cv2.namedWindow("W2")
cv2.imshow("W2", img0_2)
cv2.waitKey(delay = 0)

(2)绘制二维H-S直方图

此处参考:OpenCV 官网

##绘制H-S直方图
hist3 = cv2.calcHist ([img0_2], [0, 1], None , [180, 256], [0, 180, 0, 256])#官网给出的解释:channel = [0,1] 因为我们需要同时处理 H 和 S 平面;bins = [180,256] H 平面为 180,S 平面为 256;range = [0,180,0,256] 色调值介于 0 和 180 之间,饱和度介于 0 和 256 之间
plt.imshow(hist3)
plt.savefig('E:\From Zhihu\For the desk\cvseven3.jpeg')
plt.show()

得到的图像如下:

上图中的 X 轴代表S(饱和度),Y轴代表H(色调) 

该图中的峰值主要分布在 S 在(0-50)之间 H在(20-80),至于为什么峰值较少,个人猜测是由于原图中的色彩变化不明显,导致没办法绘制出过多过明显的峰值

到此这篇关于Python+OpenCV图像处理之直方图统计的文章就介绍到这了,更多相关Python OpenCV直方图统计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中如何实现径向基核函数

    python中如何实现径向基核函数

    这篇文章主要介绍了python中如何实现径向基核函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python中的struct.unpack示例详解

    Python中的struct.unpack示例详解

    在Python中,struct.unpack是一个函数,用于将字节串转换为元组,这个函数在处理二进制数据时非常有用,这篇文章主要介绍了Python中的struct.unpack示例详解,需要的朋友可以参考下
    2023-12-12
  • Keras框架中的epoch、bacth、batch size、iteration使用介绍

    Keras框架中的epoch、bacth、batch size、iteration使用介绍

    这篇文章主要介绍了Keras框架中的epoch、bacth、batch size、iteration使用介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python探索之爬取电商售卖信息代码示例

    Python探索之爬取电商售卖信息代码示例

    这篇文章首先简单介绍了网络爬虫的基本概念,然后向大家分享了一段有关爬取电商售卖信息的实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • python中similarity函数实例用法

    python中similarity函数实例用法

    在本篇文章里小编给大家整理的是一篇关于python中similarity函数实例用法,有兴趣的朋友们可以跟着学习下。
    2021-10-10
  • Python数据可视化之Seaborn的使用详解

    Python数据可视化之Seaborn的使用详解

    Seaborn库是python中基于matplotlib库的可视化工具库,通过sns我们可以更方便地绘制出更美观的图表。本文将分享python基于Seaborn库的一系列绘图操作,感兴趣的可以了解一下
    2022-04-04
  • Python 中 list 的各项操作技巧

    Python 中 list 的各项操作技巧

    最近在学习 python 语言。大致学习了 python 的基础语法。觉得 python 在数据处理中的地位和它的 list 操作密不可分,今天把相关基础操作记录到脚本之家平台,需要的的朋友参考下
    2017-04-04
  • 解决Pandas to_json()中文乱码,转化为json数组的问题

    解决Pandas to_json()中文乱码,转化为json数组的问题

    今天小编就为大家分享一篇解决Pandas to_json() 中文乱码,转化为json数组的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python多线程的使用详情

    Python多线程的使用详情

    这篇文章主要介绍了Python多线程的使用详情,线程之间执行是无序的,cpu调度哪个线程就执行哪个线程,下文相关介绍需要的小伙伴可以参考一下
    2022-04-04
  • Python生成可执行文件之PyInstaller库的使用方式

    Python生成可执行文件之PyInstaller库的使用方式

    PyInstaller是一个十分有用的第三方库,通过对源文件打包,Python程序可以在没有安装Python的环境中运行,也可以作为一个独立文件方便传递和管理,下面这篇文章主要给大家介绍了关于Python生成可执行文件之PyInstaller库的使用方式,需要的朋友可以参考下
    2022-04-04

最新评论