Python OpenCV 直方图 (五)

直方图

Python 调用 calcHist 返回 hist (直方图)

calcHist 函数:

[python] view plain copy

print?

cv2.calcHist([images], channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist

参数说明: images  --   图像对像

channels  --  用于计算直方图的通道

Mask  --

histSize  --   表示直方图分成多少份(多少个直方柱)

ranges  --  表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素

hist   --

accumulate  --  是一个布尔值,表示直方图是否叠加

灰度图计算

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

image = cv2.imread("D:/histTest.jpg", 0)

hist = cv2.calcHist([image],

[0], #使用的通道

None, #没有使用mask

[256], #HistSize

[0.0,255.0]) #直方图柱的范围

彩色图像(多通道)直方图

使用 OpenCV 方法

步骤: 1. 读取并分离各通道

2.计算每个通道的直方图

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

def calcAndDrawHist(image, color):

hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0])

'''''

minMaxLoc寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置

注意:多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像

素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。

'''

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)

#创建绘制直方图的的图像,由于值全为0 所以它是黑色的

histImg = np.zeros([256,256,3], np.uint8)

hpt = int(0.9* 256) #直方图的范围限定在0-255×0.9之间

for h in range(256):

intensity = int(hist[h]*hpt/maxVal)  # 计算直方图的最大值再乘以一个系数

'''''

绘制线

histImg --   图像

(h,256)  --  线段的第一个端点

(h,256-intensity)  --  线段的第二个端点

color  --  线段的颜色

'''

cv2.line(histImg,(h,256), (h,256-intensity), color)

return histImg;

if __name__ == '__main__':

img = cv2.imread("mini.jpg")

b, g, r = cv2.split(img)     # 使用Opencv 自带的分离函数 split

histImgB = calcAndDrawHist(b, [255, 0, 0])

histImgG = calcAndDrawHist(g, [0, 255, 0])

histImgR = calcAndDrawHist(r, [0, 0, 255])

cv2.imshow("histImgB", histImgB)

cv2.imshow("histImgG", histImgG)

cv2.imshow("histImgR", histImgR)

cv2.imshow("Img", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

在一张图上绘制,这样不用再分离通道,用折线来描绘直方图的边界即可

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

img = cv2.imread('mini.jpg')

h = np.zeros((256,256,3)) #创建用于绘制直方图的全0图像

bins = np.arange(256).reshape(256,1) #直方图中各bin的顶点位置

color = [ (255,0,0),(0,255,0),(0,0,255) ] #BGR三种颜色

'''''

对三个通道遍历一次,每次绘制相应通道的直方图的折线

'''

for ch, col in enumerate(color):

#计算对应通道的直方图

originHist = cv2.calcHist([img],[ch],None,[256],[0,256])

'''''

OpenCV的归一化函数。该函数将直方图的范围限定在0-255×0.9之间

'''

cv2.normalize(originHist, originHist,0,255*0.9,cv2.NORM_MINMAX)

'''''

先将生成的原始直方图中的每个元素四舍六入五凑偶取整

(cv2.calcHist函数得到的是float32类型的数组)

注意,这里必须使用np.int32(...)进行转换,

numpy的转换函数可以对数组中的每个元素都进行转换,

而Python的int(...)只能转换一个元素,如果使用int(...),

将导致only length-1 arrays can be converted to Python scalars错误。

'''

hist=np.int32(np.around(originHist))

'''''

将直方图中每个bin的值转成相应的坐标。

如hist[0] =3,...,hist[126] = 178,...,hist[255] = 5;

而bins的值为[[0],[1],[2]...,[255]]

使用np.column_stack将其组合成[0, 3]、[126, 178]、[255, 5]这样的坐标

作为元素组成的数组。

'''

pts = np.column_stack((bins,hist))

'''''

polylines 根据这些点绘制出折线

False  --  指出这个折线不需要闭合

col   --  指定了折线的颜色

'''

cv2.polylines(h,[pts],False,col)

'''''

反转绘制好的直方图,因为绘制时,[0,0]在图像的左上角

'''

h=np.flipud(h)

cv2.imshow('colorhist',h)

cv2.waitKey(0)

使用Numpy 直方图计算

NumPy中histogram函数应用到一个数组返回一对变量:直方图数组和箱式向量。注意:matplotlib也有一个用来建立直方图的函数(叫作hist,正如matlab中一样)与NumPy中的不同。主要的差别是pylab.hist自动绘制直方图,而numpy.histogram仅仅产生数据。

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

img = cv2.imread('mini.jpg')

h = np.zeros((300,256,3))

bins = np.arange(257)

bin = bins[0:-1]

color = [ (255,0,0),(0,255,0),(0,0,255) ]

for ch,col in enumerate(color):

item = img[:,:,ch]

N,bins = np.histogram(item,bins)

v=N.max()

N = np.int32(np.around((N*255)/v))

N=N.reshape(256,1)

pts = np.column_stack((bin,N))

cv2.polylines(h,[pts],False,col)

h=np.flipud(h)

cv2.imshow('img',h)

cv2.waitKey(0)

直方图

Python 调用 calcHist 返回 hist (直方图)

calcHist 函数:

[python] view plain copy

print?

cv2.calcHist([images], channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist

参数说明: images  --   图像对像

channels  --  用于计算直方图的通道

Mask  --

histSize  --   表示直方图分成多少份(多少个直方柱)

ranges  --  表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素

hist   --

accumulate  --  是一个布尔值,表示直方图是否叠加

灰度图计算

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

image = cv2.imread("D:/histTest.jpg", 0)

hist = cv2.calcHist([image],

[0], #使用的通道

None, #没有使用mask

[256], #HistSize

[0.0,255.0]) #直方图柱的范围

彩色图像(多通道)直方图

使用 OpenCV 方法

步骤: 1. 读取并分离各通道

2.计算每个通道的直方图

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

def calcAndDrawHist(image, color):

hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0])

'''''

minMaxLoc寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置

注意:多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像

素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。

'''

minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)

#创建绘制直方图的的图像,由于值全为0 所以它是黑色的

histImg = np.zeros([256,256,3], np.uint8)

hpt = int(0.9* 256) #直方图的范围限定在0-255×0.9之间

for h in range(256):

intensity = int(hist[h]*hpt/maxVal)  # 计算直方图的最大值再乘以一个系数

'''''

绘制线

histImg --   图像

(h,256)  --  线段的第一个端点

(h,256-intensity)  --  线段的第二个端点

color  --  线段的颜色

'''

cv2.line(histImg,(h,256), (h,256-intensity), color)

return histImg;

if __name__ == '__main__':

img = cv2.imread("mini.jpg")

b, g, r = cv2.split(img)     # 使用Opencv 自带的分离函数 split

histImgB = calcAndDrawHist(b, [255, 0, 0])

histImgG = calcAndDrawHist(g, [0, 255, 0])

histImgR = calcAndDrawHist(r, [0, 0, 255])

cv2.imshow("histImgB", histImgB)

cv2.imshow("histImgG", histImgG)

cv2.imshow("histImgR", histImgR)

cv2.imshow("Img", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

在一张图上绘制,这样不用再分离通道,用折线来描绘直方图的边界即可

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

img = cv2.imread('mini.jpg')

h = np.zeros((256,256,3)) #创建用于绘制直方图的全0图像

bins = np.arange(256).reshape(256,1) #直方图中各bin的顶点位置

color = [ (255,0,0),(0,255,0),(0,0,255) ] #BGR三种颜色

'''''

对三个通道遍历一次,每次绘制相应通道的直方图的折线

'''

for ch, col in enumerate(color):

#计算对应通道的直方图

originHist = cv2.calcHist([img],[ch],None,[256],[0,256])

'''''

OpenCV的归一化函数。该函数将直方图的范围限定在0-255×0.9之间

'''

cv2.normalize(originHist, originHist,0,255*0.9,cv2.NORM_MINMAX)

'''''

先将生成的原始直方图中的每个元素四舍六入五凑偶取整

(cv2.calcHist函数得到的是float32类型的数组)

注意,这里必须使用np.int32(...)进行转换,

numpy的转换函数可以对数组中的每个元素都进行转换,

而Python的int(...)只能转换一个元素,如果使用int(...),

将导致only length-1 arrays can be converted to Python scalars错误。

'''

hist=np.int32(np.around(originHist))

'''''

将直方图中每个bin的值转成相应的坐标。

如hist[0] =3,...,hist[126] = 178,...,hist[255] = 5;

而bins的值为[[0],[1],[2]...,[255]]

使用np.column_stack将其组合成[0, 3]、[126, 178]、[255, 5]这样的坐标

作为元素组成的数组。

'''

pts = np.column_stack((bins,hist))

'''''

polylines 根据这些点绘制出折线

False  --  指出这个折线不需要闭合

col   --  指定了折线的颜色

'''

cv2.polylines(h,[pts],False,col)

'''''

反转绘制好的直方图,因为绘制时,[0,0]在图像的左上角

'''

h=np.flipud(h)

cv2.imshow('colorhist',h)

cv2.waitKey(0)

使用Numpy 直方图计算

NumPy中histogram函数应用到一个数组返回一对变量:直方图数组和箱式向量。注意:matplotlib也有一个用来建立直方图的函数(叫作hist,正如matlab中一样)与NumPy中的不同。主要的差别是pylab.hist自动绘制直方图,而numpy.histogram仅仅产生数据。

[python] view plain copy

print?

#!/usr/bin/env python

# encoding: utf-8

import cv2

import numpy as np

img = cv2.imread('mini.jpg')

h = np.zeros((300,256,3))

bins = np.arange(257)

bin = bins[0:-1]

color = [ (255,0,0),(0,255,0),(0,0,255) ]

for ch,col in enumerate(color):

item = img[:,:,ch]

N,bins = np.histogram(item,bins)

v=N.max()

N = np.int32(np.around((N*255)/v))

N=N.reshape(256,1)

pts = np.column_stack((bin,N))

cv2.polylines(h,[pts],False,col)

h=np.flipud(h)

cv2.imshow('img',h)

cv2.waitKey(0)


相关文章

  • 机器人视觉中物体识别实验系统设计
  • 机器人视觉中物体识别实验系统设计 摘 要 作为机电一体化产品的典型代表,机器人在逐渐走向智能化.而通过 视觉来对周围环境中的物体进行识别的技术是机器人智能化的重要标志.具有"视觉"且能够识别物体的机器人可以获取外部世界图 ...查看


  • 英文翻译模板
  • 本科毕业设计 外文翻译 专业名称 自动化 学生学号 2011302111 学生姓名 张恒 指导教师 吴梅 完成时间 2015.4.2 本科毕业设计英文翻译 指导教师评阅意见 算法. ∙ calib3d -基本的多视图几何算法,单,立体摄像机 ...查看


  • 图像处理软件:软件包为开发人员提供机器视觉设计的众多选择
  • 在配置机器视觉系统时,系统集成商可以采取多种不同的方法. 在构建机器视觉系统时,开发人员可以选择众多知名公司的商用软件包.然而,在选择这类软件时,重要的是理解这些软件提供的功能.支持的硬件以及如何轻松地配置这样的软件,以解决特定的机器视觉任 ...查看


  • [OpenCV入门教程之九] 非线性滤波专场:中值滤波.双边滤波
  • 二.深入--OpenCV源码分析溯源 首先让我们一起领略medianBlur()函数的源码,其于-\opencv\sources\modules\imgproc\src\smooth.cpp的第1653行开始. [cpp] ',1)&quo ...查看


  • 图像平滑处理
  • 原理 Note 以下原理来源于Richard Szeliski 的著作Computer Vision: Algorithms and Applications 以及 Learning OpenCV 平滑 也称 模糊, 是一项简单且使用频率很 ...查看


  • 解锁数据分析的正确姿势:描述统计
  • 本文是<如何七周成为数据分析师>的第十二篇教程,如果想要了解写作初衷,可以先行阅读七周指南.温馨提示:如果您已经熟悉统计学,大可不必再看这篇文章,或只挑选部分. 当获得一份数据集时,你会怎么做? 立马撩起袖管进行分析么?这不是一 ...查看


  • [转]OpenCV计算连通区域数目与最大连通区域并标示出
  • #include #include #include #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma ...查看


  • 大学生创新项目个人总结
  • 个人总结与思考 时光荏苒,一年的创新项目如期就要结束.能够参加这次项目,我感到非常荣幸,过程中的点点滴滴依然历历在目.因为是第一次参加创新项目,我也从中学习到了很多在日常学习中很难学习到的"知识",也让我感受到实践带来的 ...查看


  • 如何利用Python和win32编程避免重复性体力劳动(一)
  • 如何利用Python和win32编程避免重复性体力劳动(一)--开始.FindWindow和FindWindowEx 标签: pythonpywin32FaceGenwin32 2013-12-23 15:06 4267人阅读 评论(11) ...查看


热门内容