iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中opencv 直方图处理
  • 269
分享到

python中opencv 直方图处理

2024-04-02 19:04:59 269人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录直方图处理直方图的含义绘制直方图使用Numpy绘制直方图使用OpenCV绘制直方图使用掩模绘制直方图直方图均衡化直方图均衡化原理直方图均衡化处理pyplot 模块介绍subplo

直方图处理

直方图从图像内部灰度级的角度对图像进行表述从直方图的角度对图像进行处理,可以达到增强图像显示效果的目的。

直方图的含义

直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。在绘制直方图时,将灰度级作为x轴处理,该灰度级出现的次数作为y轴处理

把左侧的直线图和右侧直方图都称为直方图

在实际处理中,图像直方图的x轴区间一般是[0, 255],对应的是8位位图的256个灰度级;y轴对应的是具有相应灰度级的像素点的个数。

归一化直方图: 在归一化直方图中,x轴仍然表示灰度级;y轴不再表示灰度级出现的次数,而是灰度级出现的频率。

灰度级出现的频率=灰度级出现的次数/总像素数在归一化直方图中,各个灰度级出现的频率之和为1。归一化直方图与直方图在外观上是一致的,只是y轴的标签不同而已。

在OpenCV的官网上,特别提出了要注意的三个概念:DIMS、BINS、RANGE

  • DIMS:表示在绘制直方图时,收集的参数的数量。一般情况下,直方图中收集的数据只有一种,就是灰度级。因此,该值为1。
  • RANGE:表示要统计的灰度级范围,一般为[0, 255]。0对应的是黑色,255对应的是白色。
  • BINS:参数子集的数目。在处理数据的过程中,有时需要将众多的数据划分为若干个组,再进行分析。
    例如: 希望将两个像素值作为一组讨论

绘制直方图

python的模块matplotlib.pyplot中的hist()函数能够方便地绘制直方图,通常采用该函数直接绘制直方图。除此以外,OpenCV中的cv2.calcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。

使用Numpy绘制直方图

模块matplotlib.pyplot提供了一个类似于MATLAB绘图方式的框架,可以使用其中的matplotlib.pyplot.hist()函数来绘制直方图。此函数的作用是根据数据源和灰度级分组绘制直方图。

其基本语法格式为:

matplotlib.pyplot.hist(X, BINS)
  • X:数据源,必须是一维的。图像通常是二维的,需要使用ravel()函数将图像处理为一维数据源以后,再作为参数使用。
  • BINS:BINS的具体值,表示灰度级的分组情况。

函数ravel()的作用是将二维数组降维成一维数组。

例如:数组a

使用函数ravel()对a进行处理:

b = a.ravel()

使用hist()函数绘制一幅图像的直方图

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("./img/hand1.png")
cv2.imshow("original", o)
plt.hist(o.ravel(),256)
plt.show()
cv2.waiTKEy()
cv2.destroyAllwindows()

使用函数hist()将一幅图像的灰度级划分为16组后,绘制该图像的直方图。

将灰度级划分为16组,即将灰度级划分为16个子集,对应的BINS值为16。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("./img/hand1.png")
plt.hist(o.ravel(),16)
plt.show()

使用OpenCV绘制直方图

OpenCV提供了函数cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用matplotlib.pyplot模块中的plot()函数,可以将函数cv2.calcHist()的统计结果绘制成直方图。

  • 用cv2.calcHist()函数统计图像直方图信息

函数cv2.calcHist()用于统计图像直方图信息,其语法格式为:

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

函数中返回值及参数的含义为:

  • hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。
  • images:原始图像,该图像需要使用“[ ]”括起来。
  • channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。
  • mask:掩模图像。当统计整幅图像的直方图时,将这个值设为None。当统计图像某一部分的直方图时,需要用到掩模图像。

仅计算掩膜区域

  • histSize:BINS的值,该值需要用“[ ]”括起来。例如,BINS的值是256,需要使用“[256]”作为此参数值。
  • ranges:即像素值范围。例如,8位灰度图像的像素值范围是[0, 255]。
  • accumulate:累计(累积、叠加)标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

**例子:**使用cv2.calcHist()函数计算一幅图像的统计直方图结果,并观察得到的统计直方图信息。

import cv2
import numpy as np
img=cv2.imread("./img/hand1.png")
hist = cv2.calcHist([img], [0], None, [256], [0,255])
print(type(hist))
print(hist.shape)
print(hist.size)
print(hist)

######
<class &#39;numpy.ndarray'>
(256, 1)
256
[[  88.]
 [  31.]
 [  48.]
 [  66.]
 ...

函数cv2.calcHist()返回值的数据类型为“ndarray”。该数据的shape为(256,1),说明其有256行1列。

该数据的size为256,说明有256个元素,分别对应着256个灰度级在图像内出现的次数。

plot()函数的使用:

使用matplotlib.pyplot模块内的plot()函数,可以将函数cv2.calcHist()的返回值绘制为图像直方图。

绘制统计直方图:

使用函数plot()将函数cv2.calcHist()的返回值绘制为直方图。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread(&quot;./img/hand1.png&quot;)
histb = cv2.calcHist([o], [0], None, [256], [0,255])
plt.plot(histb, color=&#39;b')
plt.show()

使用函数plot()和函数cv2.calcHist(),将彩色图像各个通道的直方图绘制在一个窗口内。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread(&quot;./img/hand1.png&quot;)
histb = cv2.calcHist([o], [0], None, [256], [0,255])
histg = cv2.calcHist([o], [1], None, [256], [0,255])
histr = cv2.calcHist([o], [2], None, [256], [0,255])
plt.plot(histb, color=&#39;b')
plt.plot(histg, color=&#39;g')
plt.plot(histr, color=&#39;r')
plt.show()

使用掩模绘制直方图

在函数cv2.calcHist()中,参数mask用于标识是否使用掩模图像。

当使用掩模图像获取直方图时,仅获取掩模参数mask指定区域的直方图。

  • 掩模处理的概念
    通常将掩模图像白色区域的值设置为255,然后让掩模图像与原始图像进行按位与运算
    OpenCV提供了bitwise_and函数,用于两个像素值之间的按位与运算。
    掩模图像的白色背景部分设置为255,黑色背景部分设置为0
    当在一个函数F中使用了掩模时,就意味着要先将参与运算的图像与掩模图像进行按位与运算,得到掩模运算结果。然后,再将掩模运算结果,作为函数F的参数完成函数F所指定的运算。
  • 构造掩模图像
    在构造掩模图像时,通常先构造一个像素值都是0的二维数组,再将数组中指定区域的像素值设定为255,就得到了掩模图像。
    首先使用函数np.zeros()构造一个像素值都是0的二维数组,然后将其中间部分的值设置为255
import cv2
import numpy as np
mask=np.zeros([600,600], np.uint8)
mask[200:400,200:400]=255
cv2.imshow(&#39;mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()

使用掩模绘制直方图:

绘制掩模图像时,首先将函数cv2.calcHist()的mask参数设置为掩模图像,得到掩模处理的直方图信息,再使用plot()函数完成直方图的绘制。

函数cv2.calcHist()的语法格式:

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

其中,mask参数就是掩模图像。

绘制掩模结果图像的直方图

首先构造一个掩模图像,然后使用函数cv2.calcHist()计算掩模结果图像的统计直方图信息,最后使用函数plot()绘制掩模图像的直方图。

掩模图像要保持与原始图像相等的大小, 使用参数image.shape表示构造与原始图像等大小的掩模图像。

import&nbsp;cv2
import&nbsp;numpy&nbsp;as&nbsp;np
import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt
image=cv2.imread(&quot;./img/hand1.png&quot;,&nbsp;cv2.IMREAD_GRAYSCALE)
mask=np.zeros(image.shape,&nbsp;np.uint8)
mask[200:400,200:400]=255
histImage=cv2.calcHist([image],&nbsp;[0],&nbsp;None,&nbsp;[256],&nbsp;[0,255])
histMI=cv2.calcHist([image],&nbsp;[0],&nbsp;mask,&nbsp;[256],&nbsp;[0,255])
plt.plot(histImage,color=&quot;b&quot;)
plt.plot(histMI,color=&quot;g&quot;)
plt.show()

直方图均衡化

如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。

在外观上,这样的图像具有更丰富的色彩,不会过暗或过亮。直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。这种均衡化,既实现了灰度值统计上的概率均衡,也实现了人类视觉系统(Human Visual System, HVS)上的视觉均衡。

直方图均衡化原理

直方图均衡化的算法主要包括两个步骤:

  • 计算累计直方图。
  • 对累计直方图进行区间转换

在此基础上,再利用人眼视觉达到直方图均衡化的目的。

在累计直方图的基础上,对原有灰度级空间进行转换。可以在原有范围内对灰度级实现均衡化,也可以在更广泛的灰度空间范围内对灰度级实现均衡化。

在原有范围内实现均衡化

用当前灰度级的累计概率乘以当前灰度级的最大值,得到新的灰度级,并作为均衡化的结果。

在更广泛的范围内实现均衡化

用当前灰度级的累计概率乘以更广泛范围灰度级的最大值,得到新的灰度级,并作为均衡化的结果。

通过如下两个步骤,可以让直方图达到均衡化的效果。

  • 计算累计直方图。
  • 将累计直方图进行区间转换。

直方图均衡化使图像色彩更均衡、外观更清晰,也使图像更便于处理,它被广泛地应用在医学图像处理、车牌识别、人脸识别等领域。

直方图均衡化处理

OpenCV使用函数cv2.equalizeHist()实现直方图均衡化。

该函数的语法格式为:

dst&nbsp;=&nbsp;cv2.equalizeHist(&nbsp;src&nbsp;)

  • src是8位单通道原始图像
  • dst是直方图均衡化处理的结果

例子: 使用函数cv2.equalizeHist()实现直方图均衡化

#-----------导入使用的模块--------------- 
import&nbsp;cv2
import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt
#-----------读取原始图像--------------- 
img&nbsp;=&nbsp;cv2.imread(&#39;./img/hand1.png', cv2.IMREAD_GRAYSCALE)
#-----------直方图均衡化处理--------------- 
equ&nbsp;=&nbsp;cv2.equalizeHist(img)
#-----------显示均衡化前后的图像--------------- 
cv2.imshow(&quot;original&quot;,&nbsp;img)
cv2.imshow(&quot;result&quot;,&nbsp;equ)
#-----------显示均衡化前后的直方图--------------- 
plt.figure(&quot;原始图像直方图&quot;)&nbsp;&nbsp;&nbsp;#构建窗口 
plt.hist(img.ravel(),256)
plt.figure(&quot;均衡化结果直方图&quot;)&nbsp;&nbsp;#构建新窗口 
plt.hist(equ.ravel(),256)
plt.show()
#----------等待释放窗口--------------------- 
cv2.waitKey()
cv2.destroyAllWindows()

语句“plt.figure("原始图像直方图")”用于构造名为“原始图像直方图”的新窗口。

均衡化是指综合考虑了统计概率和HVS的均衡化结果。

pyplot 模块介绍

matplotlib.pyplot模块提供了一个类似于MATLAB绘图方式的框架,可以使用其中的函数方便地绘制图形。

subplot 函数

模块matplotlib.pyplot提供了函数matplotlib.pyplot.subplot()用来向当前窗口内添加一个子窗口对象。该函数的语法格式为:

matplotlib.pyplot.subplot(nrows,&nbsp;ncols,&nbsp;index)
  • nrows为行数。
  • ncols为列数。
  • index为窗口序号。

序号是从“1”开始而不是从“0”开始的。

如果所有参数都小于10,可以省略彼此之间的逗号,直接写三个数字。例如,subplot(2, 3, 4)可以直接表示为subplot(234)。

import&nbsp;cv2
import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt
img&nbsp;=&nbsp;cv2.imread(&#39;./img/hand1.png', cv2.IMREAD_GRAYSCALE)
equ&nbsp;=&nbsp;cv2.equalizeHist(img)
plt.figure(&quot;subplot示例&quot;)
plt.subplot(121),&nbsp;plt.hist(img.ravel(),256)
plt.subplot(122),&nbsp;plt.hist(equ.ravel(),256)
plt.show()

imshow函数

模块matplotlib.pyplot提供了函数matplotlib.pyplot.imshow()用来显示图像。

其语法格式为:

matplotlib.pyplot.imshow(X,&nbsp;cmap=None)

  • X为图像信息,可以是各种形式的数值。
  • cmap表示色彩空间。该值是可选项,默认值为null,默认使用RGB(A)色彩空间。

使用函数matplotlib.pyplot.imshow()显示彩色图像

import&nbsp;cv2
import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt
img&nbsp;=&nbsp;cv2.imread(&#39;./img/hand1.png')
imgRGB=cv2.cvtColor(img,&nbsp;cv2.COLOR_BGR2RGB)
plt.figure(&quot;显示结果&quot;)
plt.subplot(121)
plt.imshow(img),&nbsp;plt.axis(&#39;off')
plt.subplot(122)
plt.imshow(imgRGB),&nbsp;plt.axis(&#39;off')
plt.show()
  • 语句“plt.axis('off')”表示关闭坐标轴的显示

使用函数matplotlib.pyplot.imshow()显示灰度图像。

尝试使用不同的形式显示灰度图像

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(&#39;./img/hand1.png')
g=cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
plt.figure(&quot;灰度图像显示演示&quot;)
plt.subplot(221)
plt.imshow(o), plt.axis(&#39;off')
plt.subplot(222)
plt.imshow(o, cmap=plt.cm.gray), plt.axis(&#39;off')
plt.subplot(223)
plt.imshow(g), plt.axis(&#39;off')
plt.subplot(224)
plt.imshow(g, cmap=plt.cm.gray), plt.axis(&#39;off')
plt.show()

只有使用灰度图像作为参数,并且将色彩空间参数值设置为“cmap=plt.cm.gray”,灰度图像才被正常显示。

使用函数matplotlib.pyplot.imshow()以不同的参数形式显示灰度图像。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(&#39;./img/hand1.png')
g=cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
plt.figure(&quot;灰度图像显示演示&quot;)
plt.subplot(221); plt.imshow(g, cmap=plt.cm.gray)
plt.subplot(222); plt.imshow(g, cmap=plt.cm.gray_r)
plt.subplot(223); plt.imshow(g, cmap=&#39;gray')
plt.subplot(224); plt.imshow(g, cmap=&#39;gray_r')
plt.show()

色彩空间参数cmap的参数值“plt.cm.gray_r”及“gray_r”中的“r”是英文“reverse”的缩写,表示逆转的意思。

到此这篇关于Python中opencv 直方图处理的文章就介绍到这了,更多相关python opencv 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中opencv 直方图处理

本文链接: https://www.lsjlt.com/news/118495.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中opencv 直方图处理
    目录直方图处理直方图的含义绘制直方图使用Numpy绘制直方图使用OpenCV绘制直方图使用掩模绘制直方图直方图均衡化直方图均衡化原理直方图均衡化处理pyplot 模块介绍subplo...
    99+
    2024-04-02
  • python OpenCV图像直方图处理
    目录1.图像直方图基本含义和绘制2.OpenCV统计直方图并绘制3.使用掩码的直方图-直方图、掩膜4.直方图均衡化原理及函数5.子图的绘制6.直方图均衡化对比1.图像直方图基本含义和...
    99+
    2024-04-02
  • python OpenCV图像直方图如何处理
    这篇“python OpenCV图像直方图如何处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python&nb...
    99+
    2023-07-02
  • Python+OpenCV图像处理之直方图统计
    目录1. 直方图概述(1)基本概念(2)直方图中的术语2. 直方图绘制(1)读取图像信息(2)绘制直方图3. 掩膜直方图(1)基本概念(2)实现代码4. H-S 直方图(1)基本概念...
    99+
    2024-04-02
  • Python+OpenCV图像处理之直方图统计的示例分析
    这篇文章主要为大家展示了“Python+OpenCV图像处理之直方图统计的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python+OpenCV图像处理之直方图统计的示例分析”这篇文章...
    99+
    2023-06-22
  • OpenCV图像处理之直方图比较方法详解
    目录一、直方图比较二、图像直方图比较方法三、代码实现四、图像处理效果一、直方图比较 直方图比较是对输入的两张图像进行计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算...
    99+
    2024-04-02
  • Python+OpenCV之直方图均衡化详解
    目录直方图均衡化自适应直方图均衡化直方图均衡化 直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将...
    99+
    2024-04-02
  • Python+OpenCV绘制灰度直方图详解
    1.直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数...
    99+
    2024-04-02
  • OpenCV-Python直方图均衡化实现图像去雾
    直方图均衡化 直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像。这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(H...
    99+
    2024-04-02
  • Python数字图像处理基础直方图详解
    目录直方图的定义直方图的性质直方图的应用图像增强图像分割图像识别Python直方图的计算直方图的定义 直方图的性质 只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值...
    99+
    2024-04-02
  • OpenCV-Python直方图均衡化如何实现图像去雾
    小编给大家分享一下OpenCV-Python直方图均衡化如何实现图像去雾,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!直方图均衡化直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的...
    99+
    2023-06-15
  • C++OpenCV绘制简易直方图DrawHistImg
    目录需求说明具体流程功能函数C++测试代码测试效果需求说明 在对图像进行处理时,经常会有这类需求:想要观察图像的直方图分布,例如灰度图中0-255区间数值的分布情况,从而可以进行后续...
    99+
    2024-04-02
  • OpenCV 直方图均衡化的实现原理解析
    目录直方图均衡化介绍图像的直方图是什么更形象解释什么是直方图均衡化?直方图均衡化是如何实现的?直方图均衡化的作用直方图均衡化步骤相关APIequalizeHist代码示例灰度图均值化...
    99+
    2024-04-02
  • 基于OpenCV如何生成图像直方图
    这篇文章将为大家详细讲解有关基于OpenCV如何生成图像直方图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。01. 什么是图像直方图?在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图像...
    99+
    2023-06-14
  • opencv-python图像处理怎么安装
    这篇文章主要讲解了“opencv-python图像处理怎么安装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“opencv-python图像处理怎么安装”吧!一、安装opencv关于openc...
    99+
    2023-06-22
  • Python 第三方opencv库实现图像分割处理
    目录前言1.加载图片2.对图片做灰度处理3.对图片做二值化处理3.1.自定义阈值4.提取轮廓5.对轮廓画矩形框6.分割图片并保存7.查看分割图片8.完整代码前言 所需要安装的库有: ...
    99+
    2024-04-02
  • opencv-python基本图像处理详解
    目录一、使用matplotlib显示图1、显示热量图 2、显示灰度图二、使用cv.imread显示图像1、显示灰度图像总结一、使用matplotlib显示图 impor...
    99+
    2024-04-02
  • Python Opencv实现图片切割处理
    本文实例为大家分享了Python Opencv实现图片的切割处理,供大家参考,具体内容如下 Opencv对图片的切割: 方法一: import os from PIL import ...
    99+
    2024-04-02
  • Python中ROS和OpenCV结合处理图像问题
    目录一、安装ROS-OpenCV二、简单案例分析1.usb_cam.launch2.cv_bridge_test.py3.rqt_image_view三、CvBridge相关API1...
    99+
    2024-04-02
  • Python OpenCV实现图片预处理的方法详解
    目录一、图片预处理1.1 边界填充(padding)1.2 融合图片(mixup)1.3 图像阈值二、滤波器2.1 均值滤波器2.2 方框滤波器2.3 高斯滤波器2.4 中值滤波2....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作