[python opencv 计算机视觉零基础到实战] 十二 直方图

一、学习目标

  1. 了解matplotlib绘图库的使用
  2. 了解如何通过折线图或者直方图对图表进行绘制
  3. 了解了通过图标对图片内容进行直观判断

如有错误欢迎指出~

二、了解图像直方图及其应用

2.1 了解matplotlib库

在了解图像直方图前我们需要了解一个matplotlib库,matplotlib库和numpy可谓是一对好伴侣,就像泡面伴侣火腿肠一样。

matplotlib是一个绘图库,我们将通过matplotlib绘制图像的直方图。为什么图像可以绘制直方图呢?我们可以想一下,图像是由一堆数据组成,既然是数据那就可以对这个图像进行可视化的图标操作。

首先,我们需要安装matplotlib。使用pip工具可以直接安装matplotlib。安装命令为:

pip install matplotlib

安装完matplotlib后,可以在python的交互窗口中对其进行引入,若没问题那就肯定是安装好了:

from matplotlib import pyplot as plt 


我们先简单了解一下matplotlib 的使用方法,查看以下示例:

from matplotlib import pyplot as pltx = [0, 5, 8, 13]
y = [2, 1, 1, 3]print(x)
print(y)
plt.title("Matplotlib") 
plt.xlabel("x") 
plt.ylabel("y") 
plt.plot(x,y) 
plt.show()

首先引入进行引入,随后定义了x和y两个列表,这两个列表对应的是折线图中x和y的两个绘制点,其中x列表是当前坐标系中x的值,y列表则表示y坐标系的值。x列表和y列表相互对应,x[0]与y[0]构成一个坐标点,如x[0]与y[0]则表示(0,2),依次下去则是(5,1)、(8,1);随后使用plt.title设置折线图标题,plt.xlabel设置x标签、plt.ylabel设置y标签,再继续使用plot传入x和y的值,最后使用show方法进行展示。结果如下:

以上是一个Matplotlib折线图的基本用法,接下来我们开始正式的编写有关图像直方图的内容。

2.2 绘制图像直方图

图像直方图表示了一张图像像素的分布,对像素进行了统计,方便与直观的以图的形式对图片进行分析。一般横坐标表示图像像素的不同值,或者说不同的种类,纵坐标则表示了每一种颜色的个数或者百分比。直方图用这种表现方式显示图像的基本内容特征方便接下来对图像进行进行下一步的操作。一般直方图的表示是越靠近左侧纵坐标则表示当前图像的偏暗点数据分布,越靠近右侧则表示图像偏亮的像素点分布情况。

绘制图像直方图需要使用一个直方图方法hist方法,我们一般使用前两个参数;第一个参数为一维数组,第二个参数为需要多少个间隔。现在我们先读取一张图片:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)

随后使用hist方法,使用hist方法时由于img是一个三通道的数据,那如何转为一维数据呢?很简单,有一个ravel方法很方便的对img数据进行转变:

img.ravel()

随后将该数据传入至hist方法中:

plt.hist(img.ravel(), 256)

以上代码中,256是表示一共分为256个数据去显示其中的内容。最后添加show方法以及等待图像关闭的代码,完整代码如下:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)plt.hist(img.ravel(), 256)
plt.show()cv2.waitKey (0)
cv2.destroyAllWindows()

运行代码结果如下:
由于我们这张图片是整体偏亮的,所以数据的分布都在右侧,左侧分布较少。这张图片如下:
也可以把第二个参数改为100,这样每次分段就是一半了:

plt.hist(img.ravel(), 100)

效果如下:
hist的第三个参数是统计范围,你需要直方图显示哪个范围内的数据,例如[0,100],这时就可以写成:

plt.hist(img.ravel(), 100,[0,100])

运行结果如下:

左边纵坐标数据则是个数,横坐标x是0逐渐增大,也就构成了一种越靠近左侧越黑,越靠近右侧越亮的这一种分布情况。我们也可以将以上的0到100范围改成0-256,这时即可恢复原样:

plt.hist(img.ravel(), 256,[0,256])

2.3 3通道折线图绘制

以上只绘制了一个完整图像的直方图,现在我们来试一下绘制3个通道RGB的直方图图像。
绘制3通道的折线图使用一个方法可以很简便的进行绘制,那就是calcHist,calcHist可以通过你给的通道数、灰度范围、像素值范围可以获取图像的通道信息,也可以加入mask遮罩提取图像。
由于同一个直方图或者折线图中,使用同一种颜色绘制会分辨不清,我们可以通过三原色的红绿蓝分别绘制3跟不同颜色的线段进行表示。这里使用折线图首先进行图像绘制。
首先我们定义一个列表,存储红绿蓝三原色字符串,方便之后的绘图时传入色彩:

color = ["blue", "green", "red"]

随后使用一个for循环,不过需要将color传入enumerate中,enumerate将会给予出两个值,一个是下标一个是值,那么这个时候就需要有两个变量接收,for循环可以写成:

for i, v in enumerate(color):

随后使用calcHist方法,并且传入5个值:

hist = cv2.calcHist([img], [i], None, [256], [0, 256])

值必须使用方括号传入,这是语法规定,若不使用你可能会出错。第一个值img是图像数据,第二个值i,由于每次都会循环作为下标,那么就是0、1、2、3这3个数据,这3个数据传入到calcHist后将会拿出红绿蓝三个不同的通道值。第三位填入NONE,因为我们不需要遮罩。然后[256]是一个灰度的范围空间,[0,256]表示像素的范围值。这时每次循环hist都将会是不同通道的值内容,这个时候就可以使用plot进行折线画图,并且传入颜色值,绘制不同颜色的线段:

plt.plot(hist, color=v)

组后show图片,完整代码如下:

import cv2
import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.destroyWindow("Image")
cv2.imshow("Image", img)
color = ["blue", "green", "red"]
for i, v in enumerate(color):hist = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(hist, color=v)plt.show()
cv2.waitKey (0)
cv2.destroyAllWindows()

结果如下:

该系列首发于ebaina

三、总结

  1. 了解matplotlib对折线图、直方图的绘图方法
  2. 了解了matplotlib绘制的图标左侧偏暗右侧偏亮的特性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell中的数字

shell中的数字 author :headsen chen date :2017-10-18 15:01:42 个人原创,转载请注明作者,出处,否则依法追究法律责任 1,生成随机数(范围:0-32767),用特殊变量:RANDOM 2&#xff…

serviceloader java_【java编程】ServiceLoader使用看这一篇就够了

转载:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少听过spi,具体的解释我就不多说了。但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问题来解释:实现: 其实具体的实现类就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改进

在MiniAPI系列中,《.NET6之MiniAPI(十八):OpenAPI swagger》介绍了swagger在MiniAPI框架中的使用,当时留下很多不足,随着.NET7 Preview4的推出,这方面得到了很大的改进,我还是使用“十八”这篇文章的案例。…

Swift - 自定义单元格实现微信聊天界面

1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息(2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小(3&#x…

[python opencv 计算机视觉零基础到实战] 十三 直方图颜色提鲜

一、学习目标 了解了均衡化的作用是什么了解灰度、YUV、彩色图片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分离通道的方法是什么 如有错误欢迎指出~ 二、了解图像均衡化 2.1 了解直方图均衡化 图像直方图均衡化主要是对图像中的少数灰度进行压缩&#…

java 中字符串比较方法_java中常用的字符串的比较方法(两种)

比较字符串比较常用的两个方法是运算符“”和String的equals方法。使用“”比较两个字符串,是比较两个对象的的“地址”是否一致,本质就是判断两个变量是否指向同一个对象,如果是则返回true,否则返回的是false。而String类的equal…

分布式服务框架dubbo原理解析 转

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf),jms消息服务(napoli、notify),KV数据库(tair)等。这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展&#xff…

[python opencv 计算机视觉零基础到实战] 十五 直方图反向投影

一、学习目标 了解了直方图反向投影的一般流程了解2D直方图的使用 如有错误欢迎指出~ 二、了解直方图反向投影 2.1 了解2D直方图 需要对直方图进行反向投影,需要使用2D直方图。2D直方图需要使用calcHist方法。calcHist方法在前两节中已经有了解,现在…

关联规则java代码_重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码?...

重量挖掘关联规则挖掘方法,哪个大神可以将以下伪代码转换为Java代码? 10改进的加权关联规则算法的基本步骤与Apriori算法相似: 首先找到加权支持度不小于用户指定的最小加权支持度的所有频繁项集加权关联规则,然后使用频繁项集生成所有满足最…

多种语言《九九乘法表》荟萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表对于我们学习循环结构,尤其是双重循环特别有帮助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多种语九九乘法表。 一、C语言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

[python opencv 计算机视觉零基础到实战] 十六、用opencv画画

一、学习目标 了解如何使用line方法了解如何使用rectangle方法了解如何使用ellipse方法 如有错误欢迎指出~ 二、了解OpenCV的绘图方法 2.1 了解直线绘图方法 我们在前两节中有了解使用OpenCV中的矩形绘制&#xff0c;接下来我们了解一下更多的图形绘制方法。我们在OpenCV中…

外部中断0(含知识点)

1 #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h>2 #include "stm32f10x_gpio.h"3 #include "stm32f10x_exti.h"4 #include "misc.h"5 6 /*外部中断配置*/7 8 9 int main(void)10 {11 /*************…

[python opencv 计算机视觉零基础到实战] 十七、用鼠标画画

一、学习目标 了解长轴和短轴参数了解旋转角度参数了解起始角度参数了解终止角度参数 二、深入了解OpenCV的ellipse方法 2.1 纵横 椭圆的绘制方法在上一节中我们已经知道了是使用ellipse&#xff0c;ellipse的函数原型如下&#xff0c;为了清晰认识ellipse方法&#xff0c;…

Microsoft Build 2022 到来,开发者们做好准备了吗?

Microsoft Build 2022 将会在5月24日 - 5月26日正式举行&#xff0c;作为开发者的你是否和我一样期待本次的 Build&#xff0c;它会带来什么的技术革新以及黑科技呢&#xff1f;下面我就针对今年 Build 的几个主题结合相关技术来谈谈我对 Build 的期待。开发技术和相关工具今年…

【测绘程序设计】视距测量神器V1.0(附源程序)

神器预览: 一、视距测量概念 视距测量是利用水准仪的望远镜内十字丝分划板上的视距丝在视距尺(水准尺)上读数,根据光学和几何学原理,同时测定仪器到地面点的水平距离和高差的一种方法。 视距测量具有操作简便、速度快、不受地面起伏变化的影响的优点,被广泛应用于碎部测…

Android Studio之查找当前类的位置图标没了

1 问题 我们知道在Android studio里面如果想快速看到该文件所在的目录位置&#xff0c;点击这个图标 现在这个图标没了&#xff0c;找不到了 2 解决办法 把下面的Autoscroll from Source的勾去掉就行。

[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画

一、学习目标 了解如何在图片中加入文字了解如何使用鼠标进行图像绘制 二、了解如何通过鼠标进行图像绘制 2.1 了解putText方法的使用 putText方法接收图像&#xff0c;文字内容&#xff0c; 坐标 &#xff0c;字体&#xff0c;大小&#xff0c;颜色&#xff0c;字体厚度这…

【测绘程序设计】坐标正算神器V1.0(附C/C#/VB源程序)

坐标正算,就是根据直线的边长、坐标方位角和一个端点的坐标,计算直线另一个端点的坐标的工作。本文用C#语言和VB语言实现坐标正算,编写坐标正算神器。 计算实例: 实例1,设直线AB的边长DAB和一个端点A的坐标XA、YA为已知,则直线另一个端点B的坐标为: XB=XA+ΔXAB YB=YA+…

Blazor University (22)路由 —— 定义路由

原文链接&#xff1a;https://blazor-university.com/routing/路由与标准 ASP.NET MVC 一样&#xff0c;Blazor 路由是一种用于检查浏览器 URL 并将其匹配到要呈现的页面的技术。路由比简单地将 URL 匹配到页面更灵活。它允许我们根据文本模式进行匹配&#xff0c;例如&#xf…