OpenCV Python 直方图

原创 2016年06月01日 00:08:20

OpenCV Python 直方图


直方图

什么是直方图

直方图的作用

敲程序

下面为使用PythonOpenCVmatplotlib来编写几个samples程序来实际感受一下图像的直方图:

使用matplotlib计算直方图

代码

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

img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)
plt.hist(img.ravel() , 256, [0, 256])
plt.show()

出现错误

上面的这段程序,你运行会出现这样的error:

Traceback (most recent call last):
  File "/home/aobo/PycharmProjects/OpenCV2/Histograms/hist.py", line 6, in <module>
    plt.hist(img.ravel() , 256, [0, 256])
AttributeError: 'NoneType' object has no attribute 'ravel'

解决办法

将代码里的下面这行

img = cv2.imread('~/Pictures/IMG_4137.JPG', 0)

修改为:(图片路径使用完整的绝对路径)

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG', 0)

错误的原因是:img变量没有成功的载入图片(cv2.imread()),所以这个img变量就是一个没有任何变量类型的一个变量,在Python语言里img现在就是一个NoneType对象。因为只要Mat对象才有ravel()这个方法,而NoneType对象没有,所以才出现了上面的error

img.ravel() 将图像转成一维数组。

运行结果:

Figure 1


输出一个彩色图像的直方图

代码

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

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
color = ('b','g','r')
# enumerate():python里的一个新函数
# 它的作用:同时遍历索引(i)和元素(col)
for i,col in enumerate(color):
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(histr, color = col)
    plt.xlim([0, 256])
plt.show()

运行效果

Figure 1

代码讲解

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

cv2.calcHist()是OpenCV里面求直方图的函数。下面介绍这个函数需要传入的形参:

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

实参 对应形参 解释
[img] images 原始图像,需要使用[]修饰
[i] channels cv2.calcHist()函数一次只能得到一张图片的其中一个通道的直方图,所以,这里传入的是本次需要处理的元素图片的通道的索引号,同样需要使用[]修饰。如果输入的元素图像是灰度图,它的值就是[0]; 如果输入的元素图像是彩色图像的话,传入的参数可以是[0], [1], [2],它们分别对应着通道B, G, R。
plt.plot(histr, color = col)

这句话中的col的值是:’b’, ‘g ’ 或 ‘r’,赋给color形参,函数会自动处理成形应的颜色值,用这个颜色值将histr直方图绘制到plt画板上。

plt.xlim([0, 256])

设置plt画板x轴的上下限,就是x轴所显示的长度。我们将这段代码修改出下面这个样子,然后运行程序,会得到下面的结果:

plt.xlim([0, 100])

Figure 1


使用掩模

代码

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

img = cv2.imread('/home/aobo/Pictures/IMG_4137.JPG')
color = ('b','g','r')

mask = np.zeros(img.shape[:2], np.uint8)
mask[1000:2000, 1000:2000] = 255
masked_img = cv2.bitwise_and(img, img, mask = mask)

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])

plt.show()

运行效果

<注>:当原始图像使用较大图像的时候,你会发现程序运行后需要好久才能得到下面的结果。
Figure 1

代码解释

mask = np.zeros(img.shape[:2], np.uint8)
mask[1000:2000, 1000:2000] = 255

制作一个掩模。首先使用np.zeros()函数创建一个与原图尺寸和深度都一样,像素值全为0(黑色)图像mask,然后指定mask掩模的[1000:2000, 1000:2000]区域的像素全为255(白色)。上图右上角的图就是掩模图像。

masked_img = cv2.bitwise_and(img, img, mask = mask)

现在掩模发挥了作用:掩模的黑色区域(像素值为0)用来遮盖原图img,即不参与图像处理,只保留像素值不为0的区域。masked_img图像就是上图左下角的图像。
cv2.bitwise_and()函数的功能是位与。下面是这个函数的声明:

cv2.bitwise_and(src1, src2[, dst[, mask]])

当前代码里,对应的src1src2是同一种数据类型,所以此时cv2.bitwise_and()函数执行的是下面的操作:
Alt text

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

分别计算出原图img的直方图和img掩模区域的直方图。

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])

subplot()matplotlib.pyplot里的函数。它是:将多个图画到一个平面上的工具。

subplot(m, n, p) 或者subplot(mnp)

m 表示图排成m行
n 表示图排成n列
p 表示将图画到Figure(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下

版权声明:本文为博主原创文章,未经博主允许不得转载。 更多博文,请浏览:http://www.aobosir.com/

OpenCV Python教程(3、直方图的计算与显示)

转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识、用途什么的就直接略过去了...
  • sunny2038
  • sunny2038
  • 2013年06月20日 14:40
  • 44274

calcHist的使用

opencv提供了calcHist函数来计算图像直方图。          其中C++的函数原型如下:void calcHist(const Mat* arrays, int narrays, co...
  • sydnash
  • sydnash
  • 2012年04月11日 20:21
  • 24825

从PyOpenCV到CV2

安装cv2 http://hyry.dip.jp/files/opencv.zip 采用cv2重写的《Python科学计算》中的实例程序 读者可以在下面的页面中搜索“open...
  • jazywoo123
  • jazywoo123
  • 2013年12月09日 17:36
  • 2385

python opencv 获取程序执行时间

本节实现的是使用OpenCV里自带的函数,计算程序的执行时间。 - 获取系统时钟数 - 获取系统时钟频率...
  • huanglu_thu13
  • huanglu_thu13
  • 2016年08月28日 16:31
  • 593

Python下opencv使用笔记(九)(图像直方图)

(一)图像直方图图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图)。所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念。直方图的好处就在于可以清...
  • on2way
  • on2way
  • 2015年07月14日 17:52
  • 9429

Python与图像处理2

OTSU(最大类间方差法)就是计算出灰度图最佳阈值的算法。如下所示: (1)先对灰度图进行直方图计算并归一化处理,得到0-255之间每个像素在灰度图中出现的概率,即表示为某个像素 在灰度图中出现了个,...
  • shengshengwang
  • shengshengwang
  • 2016年09月27日 23:34
  • 2908

OpenCV【4】---calcHist 计算图像的直方图

1 直方图  直方图:给出了一幅图像或一组图像中拥有给定数值的像素数量。灰度图图像(单通道)的直方图有256个条目。0号条目给出值为0的像素个数,1号条目给出值为1的像素个数…。当然直方图可以归一化,...
  • FreeApe
  • FreeApe
  • 2016年01月06日 21:54
  • 1815

Python OpenCV 直方图 (五)

直方图 python 调用 calcHist 返回 hist (直方图) calcHist 函数: cv2.calcHist([images], channels, mask, histSize, ...
  • u013220584
  • u013220584
  • 2014年01月05日 21:49
  • 1909

openCV—Python(8)—— 图像直方图及其直方图均衡化

一、函数简介1、calcHist—计算图像直方图函数原型:calcHist(images, channels, mask, histSize, ranges, hist=None, accumulat...
  • jnulzl
  • jnulzl
  • 2015年07月31日 16:02
  • 4645

OpenCV实现图像搜索引擎(Image Search Engine)

OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务。OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优...
  • coderhuhy
  • coderhuhy
  • 2015年06月20日 21:26
  • 4386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV Python 直方图
举报原因:
原因补充:

(最多只允许输入30个字)