深入了解Python二维直方图

 更新时间:2021年12月25日 15:40:02   作者:机器视觉小学徒  
只统计像素的灰度值这一特征,可将其成为一维直方图。二维直方图可以统计像素的色相和饱和度,用于查找图像的颜色直方图。本文将为大家介绍分别使用OpenCV和NumPy函数计算直方图,需要的可以学习一下

前言

只统计像素的灰度值这一特征,可将其成为一维直方图。二维直方图可以统计像素的色相和饱和度,用于查找图像的颜色直方图。

一、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边界值

xy为原图对应通道转换成的一维数组

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()                                          #显示颜色直方图

到此这篇关于深入了解Python二维直方图的文章就介绍到这了,更多相关Python 二维直方图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python爬虫获取基金基本信息

    Python爬虫获取基金基本信息

    这篇文章主要介绍了Python爬虫获取基金基本信息,文章基于上一篇文章内容基于python的相关资料展开主题,需要的小伙伴可以参考一下
    2022-05-05
  • Scrapy项目实战之爬取某社区用户详情

    Scrapy项目实战之爬取某社区用户详情

    这篇文章主要介绍了Scrapy项目实战之爬取某社区用户详情,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解Selenium-webdriver绕开反爬虫机制的4种方法

    详解Selenium-webdriver绕开反爬虫机制的4种方法

    这篇文章主要介绍了详解Selenium-webdriver绕开反爬虫机制的4种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python爬虫包BeautifulSoup异常处理(二)

    Python爬虫包BeautifulSoup异常处理(二)

    这篇文章主要为大家详细介绍了Python爬虫包BeautifulSoup的异常处理,具有一定的参考价值,感兴趣的朋友可以参考一下
    2018-06-06
  • pytorch model.cuda()花费时间很长的解决

    pytorch model.cuda()花费时间很长的解决

    这篇文章主要介绍了pytorch model.cuda()花费时间很长的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 使用python实现生成用户信息

    使用python实现生成用户信息

    这篇文章主要介绍了使用python实现生成用户信息的相关代码,非常的简单实用,需要的朋友可以参考下
    2017-03-03
  • python实现的爬取电影下载链接功能示例

    python实现的爬取电影下载链接功能示例

    这篇文章主要介绍了python实现的爬取电影下载链接功能,涉及Python基于BeautifulSoup模块的网页信息爬取相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • Python程序暂停的正常处理方法

    Python程序暂停的正常处理方法

    这篇文章主要介绍了Python程序暂停的实现代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • 如何用Matlab和Python读取Netcdf文件

    如何用Matlab和Python读取Netcdf文件

    这篇文章主要介绍了如何用Matlab和Python读取Netcdf文件,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • python画图中文不显示问题的解决方法

    python画图中文不显示问题的解决方法

    python中绘图时如果标签或者标题是中文,最后绘出来的图中的文字会被方框替代,下面这篇文章主要给大家介绍了关于python画图中文不显示问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论