深入了解Python二维直方图
作者:机器视觉小学徒 发布时间:2023-02-17 19:36:22
前言
只统计像素的灰度值这一特征,可将其成为一维直方图。二维直方图可以统计像素的色相和饱和度,用于查找图像的颜色直方图。
一、OpenCV中的二维直方图
OpenCV仍然使用cv2.calcHist()函数来查找图像的颜色直方图,只是在指定参数时与之前有所区别。
cv2.calcHist()函数的基本格式如下:
hist =cv2.calcHist(image, channels, mask, histSize, ranges)
image
参数指定的原图像应从BGR色彩空间转换为HSV色彩空间, 实际参数需要用方括号括起来
channels
参数设置为[0,1]时, 表示同时处理色相和饱和度
histSize
参数设置BINS值为[180,256]时, 表示色相为180, 饱和度为256
ranges
参数设置为[0,180,0,256]时, 表示色相的取值范围为[0,180], 饱和度的取值范围为[0,2565]
cv2.calcHist()函数返回的颜色直方图可以直接使用cv2.show()函数显示。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('XIAN.jpg')
cv2.namedWindow('orininal', cv2.WINDOW_NORMAL)
cv2.imshow('orininal', img)
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0,180,0,256])
cv2.namedWindow('2DHist', cv2.WINDOW_NORMAL)
cv2.imshow('2DHist', hist)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(hist, interpolation = 'nearest') # 绘制颜色直方图
plt.show() # 显示颜色直方图
cv2.calcHist()函数返回的颜色直方图是一个大小为180*256的二维数组,用cv2.imshow()函数显示时是一副灰度图像,不能直接显示出颜色的分布情况。
可以使用matplotlib.pyplot.imshow()函数绘制具有不同颜色的二维直方图。
二、Numpy中的二维直方图
Numpy的np.histogram2d()函数用于计算二维直方图,其基本格式如下:
hist, xedges, yedges = np.histogram2d(x, y, bins, range)
hist
为返回的直方图
xedges
为返回的x的直方图的BINS边界值
yedges
为返回的y的直方图的BINS边界值
x
和y
为原图对应通道转换成的一维数组
bins
为BINS的值, 如[180,256]
range
为像素范围, 格式为[[0, 180],[0, 256]]
img = cv2.imread('building.jpg')
cv2.imshow('orininal', img)
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(img2)
hist, x, y = np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180],[0, 256]])
cv2.imshow('2DHist', hist)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.imshow(hist, interpolation = 'nearest')
plt.show()
可以使用matplotlib.pyplot.imshow()函数绘制具有不同颜色的二维直方图。
三、直方图示例
1、使用Numpy函数计算直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('home.jpg')
plt.figure(figsize = (25,25))
imgrgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(2, 2, 1)
plt.title('Original')
plt.axis('off')
plt.imshow(imgrgb)
histb, e1 = np.histogram(img[0].ravel(), 256, [0, 255]) #计算B通道直方图
histg, e2 = np.histogram(img[1].ravel(), 256, [0, 255]) #计算G通道直方图
histr, e3 = np.histogram(img[2].ravel(), 256, [0, 255]) #计算R通道直方图
plt.subplot(2, 2, 2)
plt.plot(histb, color = 'b')
plt.plot(histg, color = 'g')
plt.plot(histr, color = 'r')
plt.title('Hist')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #转换色彩空间为HSV
h, s, v = cv2.split(img2)
hist, x, y=np.histogram2d(h.ravel(), s.ravel(), [180, 256], [[0, 180], [0, 256]]) #计算颜色直方图
plt.subplot(2, 2, 3)
plt.title('2Dhist') #设置子图窗口标题
plt.imshow(hist, interpolation = 'nearest',cmap = 'gray') #绘制颜色直方图
plt.show() #显示颜色直方图
2、使用OpenCV函数计算直方图
# 2.使用OpenCV函数计算直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg')
plt.figure(figsize = (25,25))
imgrgb=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(2, 2, 1)
plt.imshow(imgrgb)
plt.title('Original')
plt.axis('off')
histb = cv2.calcHist([img], [0], None, [256], [0,255]) #计算B通道直方图
histg = cv2.calcHist([img], [1], None, [256], [0,255]) #计算G通道直方图
histr = cv2.calcHist([img], [2], None, [256], [0,255]) #计算R通道直方图
plt.subplot(2, 2, 2)
plt.plot(histb, color= 'b')
plt.plot(histg, color= 'g')
plt.plot(histr, color= 'r')
plt.title('Hist')
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.subplot(2, 2, 3)
plt.title('2Dhist') #设置子图窗口标题
plt.imshow(hist,interpolation = 'nearest',cmap = 'gray') #绘制颜色直方图
plt.show() #显示颜色直方图
来源:https://blog.csdn.net/weixin_43843069/article/details/122135082


猜你喜欢
- 在编写python函数时,无意中发现一个问题:python中的变量不能以数字打头,以下函数中定义了一个变量3_num_varchar,执行时
- PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的
- 一、参照完整性参照完整性指的就是多表之间的设计,主要使用外键约束。多表设计: 一对多、多对多、一对一设计1.一对多关联主要语句:constr
- 话说土匪老湿在他的大作 《交互设计之回归篇》 里曝光了上次有意思小组竞赛我们小组分享的话题 “瞬间的快感”,但这一极具噱
- 转自http://rookiefly.cn/detail/69作死小能手这两天闲着没事,把自己电脑重装了,然而重装过后配置开发环境踩了一些坑
- 背景 background css 说明 background-image:url(&q
- python模拟登陆网页主要使用到urllib、urllib2、cookielib及BeautifulSoup等基本模块,当然进阶阶段我们还
- Vue 能监听数组的情况Vue 监听数组和对象的变化(vue2.x)vue 实际上可以监听数组变化,比如:直接 = 赋值data () {
- 使用指令:pyinstaller -F -w main.py生成的.exe文件执行报错看报错信息,初步怀疑是生成的.exe不能执行.ini配
- 初学ASP,程序是能勉强写出来了,但若每进行一次网站页面的改版,所有的源程序都将进行一次移植手术。为此所耗费的人力精力不计其数,甚至一不小心
- 效果如下所示:# -*- coding: utf-8 -*-import turtle# 绘制太极图函数def draw_TJT(R):&n
- 转自微信公众号: Python之禅1.日志简介说到日志,无论是写框架代码还是业务代码,都离不开日志的记录,他能给我们定位问题带来极
- 前言如果你对数据分析有一定的了解,那你一定听说过一些亲民好用的数据分析的工具,如Excel、Tableau、PowerBI等等等等,它们都是
- 本文实例为大家分享了微信小程序实现搜索框功能的具体代码,供大家参考,具体内容如下效果:wxml文件:<view class="
- 项目中要对短文本进行相似度估计,word2vec是一个很火的工具。本文就word2vec的训练以及加载进行了总结。word2vec的原理就不
- mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决
- 错误号 错误信息5 &n
- Django带来了一个高级的聚合生成框架,它使得创建RSS和Atom feeds变得非常容易。什么是RSS? 什么是Atom?RSS和Ato
- 1. 认识数据库1.1 数据库和数据结构的关系数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合,是一个抽象的学科我们熟知的数据结
- 音乐播放器可让您快速轻松地管理和收听所有音乐文件。在本文中,我将带您了解如何使用 Python 创建音乐播放器 GUI。如何使用 Pytho