A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

内容来自OpenCV-Python Tutorials 自己翻译整理

目标:
绘制2D直方图

介绍
一维直方图是因为只考虑一个灰度值的特征。在2D直方图中要考虑两个图像特征。在彩色图像直方图中,要考虑色调和饱和度。根据这两个特征绘制2D直方图。

2D直方图:
使用函数 cv2.calcHist()来计算,绘制彩色直方图前需要将图像从BGR空间转换到HSV空间。(一维直方图要从BGR转换到灰度)
参数如下:

channels=[0,1] 因为要处理H和S两个通道
bins=[180,256]H通道为180,S通道为256
range=[0,180,0,256]H取值范围在和S的取值范围
代码:

import cv2
import numpy as np

img = cv2.imread('2.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])

numpy中2D直方图:
一维直方图是np.histogram(),那么二维是np.histogram2d()
(原文档代码有误,没有h和s参数)

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('3.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
print(hsv.shape)#(300, 300, 3)

hue=hsv[:,:,0]
sat=hsv[:,:,1]
hist, xbins, ybins = np.histogram2d(hue.ravel(),sat.ravel(),[180,256],[[0,180],[0,256]])


第一个参数是 H 通道,第二个参数是 S 通道,第三个参数是 bins 的数目,第四个参数是数值范围。

绘制

方法1:使用cv2.imshow,但是得到的是一个灰度图。

方法2:使用Matplotlib() ,使用 matplotlib.pyplot.imshow()函数绘制2D直方图。

插值参数为nearest

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('14.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )
plt.imshow(hist,interpolation = 'nearest')
plt.show()

(效果貌似不是很明显-_-)

X轴是S值,Y轴是H

5 个回复

倒序浏览
奈斯,优秀
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马