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

目录
  • 1. 直方图概述
    • (1)基本概念
    • (2)直方图中的术语
  • 2. 直方图绘制
    • (1)读取图像信息
    • (2)绘制直方图
  • 3. 掩膜直方图
    • (1)基本概念
    • (2)实现代码
  • 4. H-S 直方图
    • (1)基本概念
    • (2)绘制二维H-S直方图

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直方图统计内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV半小时掌握基本操作之直方图

    [OpenCV]⚠️高手勿入!⚠️ 半小时学会基本操作 ⚠️ 直方图 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. (第 20 课) 直方图 原图: cv2.calcHist()可以帮助我们统计像素并得到直方图. 格式: calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None) 参数: images: 输入图像 c

  • 基于OpenCV的直方图匹配的实现方法

    如何为图像生成直方图,如何使直方图相等,最后如何将图像直方图修改为与其他直方图相似. 01. 什么是图像直方图? 在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图像的处理过程. 图像直方图表示图像的像素分布情况.换言之,图像直方图显示具有特定像素值的图像点数量.例如,假设正常图像的像素强度在0到255之间变化.为了生成其直方图,我们只需要计算像素值为0的像素数量,然后计算1并继续到255即可.在图1中,我们有一个5 * 5的样本图像,我们通过计算每个像素强度的数量来创建直方图

  • python plotly绘制直方图实例详解

    计算数值出现的次数 import cufflinks as cf cf.go_offline() import numpy as np import pandas as pd set_slippage_avg_cost = [22.01, 20.98, 17.11, 9.06, 9.4, 3.65, 19.65, 7.01, 11.21, 10.3, 5.1, 23.98, 12.03, 8.13, 8.07, 9.28, 3.93, 4.23, 18.6, 8.22, 7.85, 5.39,

  • Python利用 matplotlib 绘制直方图

    目录 1. 直方图概述 1.1什么是直方图? 1.2直方图使用场景 1.3直方图绘制步骤 1.4案例展示 2. 直方图属性 2.1设置颜色 2.2设置长条形数目 2.3设置透明度 2.4设置样式 3. 添加折线直方图 4. 堆叠直方图 5. 不等距直方图 6. 多类直方图 复习回顾: 经过前面对 matplotlib 模块从底层架构.基本绘制步骤等学习,我们已经学习了折线图.柱状图的绘制方法. matplotlib 模块基础:对matplotlib 模块常用方法进行学习 matplotlib 模

  • Opencv实现二维直方图的计算及绘制

    目录 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,Opencv进行二维直方图的计算及绘制(分别用Opencv和Numpy计算),二维直方图可以让我们对不同的像素密度有更好的了解. 1. 效果图 原始图如下: 1维直方图如下: 2维直方图如下: X轴显示S值,Y轴显示色调. hsvmap效果图如下: 2. 源码 # OpenCV中的二维直方图:使用相同的函数cv2.calcHist()计算. # 对于1D直方图,我们从BGR转换为灰度 # 对于2D直方图,需要将图像从BGR

  • Python如何绘制概率分布直方图浅析

    目录 前言 一.代码 二.运行效果 总结 前言 直方图是一个可以快速展示数据概率分布的工具,直观易于理解,并深受数据爱好者的喜爱.大家平时可能见到最多就是 matplotlib,seaborn 等高级封装的库包,类似以下这样的绘图. 一.代码 1.案例一 import random import numpy as np import matplotlib.pyplot as plt X = np.random.normal(loc=10, scale=2, size=(1, 1000))[0]

  • opencv python统计及绘制直方图的方法

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术语,方便理解其在python3库中的应用和处理 BINS: 在上面的直方图当中,如果像素值是0到255,则需要256个值来显示直 方图.但是,如果不需要知道每个像素值的像素数目,只想知道两个像素值之间的像素点数目怎么办?例如,想知道像素值在0到15之间的像素点数目,然后是16到31...240到25

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

    目录 1. 直方图概述 (1)基本概念 (2)直方图中的术语 2. 直方图绘制 (1)读取图像信息 (2)绘制直方图 3. 掩膜直方图 (1)基本概念 (2)实现代码 4. H-S 直方图 (1)基本概念 (2)绘制二维H-S直方图 1. 直方图概述 (1)基本概念 直方图就是对图像的另外一种解释,它描述了整幅图像的灰度分布.直方图的 x 轴代表灰度值(0~255),y 轴代表图片中同一种灰度值的像素点的数目,所以通过直方图我们可以对图像的亮度.灰度分布.对比度等有了一个直观的认识 (2)直方图

  • Python数字图像处理基础直方图详解

    目录 直方图的定义 直方图的性质 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 直方图的定义 直方图的性质 只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值的像素出现的次数是不一样的. 那如果我们在这基础上除以像素总个数的话,那就是某一灰度级出现的概率,那么这样的话不同大小的同一内容图像其灰度直方图是一样的. 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 import cv2 import numpy as np import matp

  • Python OpenCV图像处理之图像滤波特效详解

    目录 1分类 2邻域滤波 2.1线性滤波 2.2非线性滤波 3频域滤波 3.1低通滤波 3.2高通滤波 1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domain Filter),其本质是数字窗口上的数学运算.一般用于图像平滑.图像锐化.特征提取(如纹理测量.边缘检测)等,邻域滤波使用邻域算子——利用给定像素周围像素值以决定此像素最终输出的一种算子 频域滤波(Frequency Domain Filter),其本质是对像素频率的修改.一般用于降噪.重采样.图像压缩等. 按

  • Python+OpenCV绘制灰度直方图详解

    1.直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比.图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征. 图像灰度直方图: 一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征.图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少.图像的灰度直方图是灰度级的函数,描述的是图像中

  • python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dc/df6/tutorial_py_histogram_backprojection.html 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每个像素对应于属于我们对象的像素的概率.输出图像将使我们感兴趣的对象比其余部分更白. 该怎么做呢?我们创建一个图像的直方图,其中包

  • Python+OpenCV图像处理—— 色彩空间转换

    一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #RGB转换为GRAY 这里的GRAY是单通道的 cv.imshow("gray", gray) hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) #RGB转换为HSV cv.imshow("hsv", hsv) y

  • Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 def get_image_info(image): print(type(image)) #type() 函数如果只有第一个参数则返回对象的类型 在这里函数显示图片类型为 numpy类型的数组 print(image.shape) #图像矩阵的shape属性表示图像的大小,shape会返回tup

  • Python+OpenCV图像处理——实现轮廓发现

    简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def contours_demo(image): dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪 gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY) ret, binary = cv.threshold(gray, 0, 25

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)

    图像素描特效 图像素描特效主要经过以下几个步骤: 调用cv.cvtColor()函数将彩色图像灰度化处理: 通过cv.GaussianBlur()函数实现高斯滤波降噪: 边缘检测采用Canny算子实现: 最后通过cv.threshold()反二进制阈值化处理实现素描特效. #coding:utf-8 import cv2 as cv import numpy as np #读取原始图像 img = cv.imread('d:/paojie.png') #图像灰度处理 gray = cv.cvtC

随机推荐