OpenCV Python 直方图


直方图

什么是直方图

直方图的作用

敲程序

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

使用matplotlib计算直方图

代码

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = 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() 将图像转成一维数组。

运行结果:


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

代码

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = 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()

运行效果

代码讲解

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])


使用掩模

代码

import cv2
import numpy as np
from matplotlib import pyplot as pltimg = 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()

运行效果

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

代码解释

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()函数执行的是下面的操作:

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(指的是上面截图里的窗口)哪个图上,顺序是从左到右,从上到下

转载于:https://www.cnblogs.com/aobosir/p/5928676.html

OpenCV Python 直方图相关推荐

  1. python opencv 直方图均衡_深入理解OpenCV+Python直方图均衡化

    原标题:深入理解OpenCV+Python直方图均衡化 正文 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法. 基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度 ...

  2. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  3. Python,OpenCV进行直方图反投影

    Python,OpenCV进行直方图反投影 1. 效果图 2. 源码 参考 这篇博客将介绍Python,OpenCV中的直方图反投影.直方图反投影用于图像分割或在图像中查找感兴趣的对象. 简单地说,它 ...

  4. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  5. opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值

    什么是灰度直方图? 图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度 ...

  6. Python+OpenCV:直方图反向投影(Histogram Backprojection)

    Python+OpenCV:直方图反向投影(Histogram Backprojection) Algorithm in Numpy 1. First we need to calculate the ...

  7. Python+OpenCV:直方图均衡化(Histogram Equalization)

    Python+OpenCV:直方图均衡化(Histogram Equalization) ####################################################### ...

  8. Python+OpenCV:直方图(Histograms)

    Python+OpenCV:直方图(Histograms) 理论 什么是直方图?您可以将直方图看作是一种图形或图表,它为您提供关于图像强度分布的总体概念.它是x轴为像素值(范围从0到255,不总是这样 ...

  9. python绘制灰度图片直方图-opencv+python 统计及绘制直方图

    灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图. 统计直方图数据 首先要稍微理解一些与函数相关的术 ...

  10. OpenCV—python 颜色直方图与直方图均衡化

    文章目录 一.颜色直方图 1.1 使用opencv展示直方图 1.2 使用matplotlib绘制 二.直方图均衡化 2.1 全局直方图均衡化与自适应均衡化 2.2 使用查找表来拉伸直方图 2.3 直 ...

最新文章

  1. C#:添加web service引用
  2. sublime text使用小技巧
  3. 在stringgrid的drawcell事件处理过程中,给单元格赋值时,要用textout输出,不要像一般给cell[i,j]赋值那样。
  4. asp编程工具_使用ASP.NET Core构建RESTful API的技术指南
  5. 系列10—消息中间件
  6. 【JS面试向】深入原型链之class的继承
  7. 【爬虫】毕设学习记录:python爬取静态网页(只爬取单页)
  8. linux内核中TCP发送的实现
  9. 中国首枚芯片邮票问世:搭载NFC芯片 可APP读取
  10. python数组写入txt
  11. java实现秒杀系统_Java秒杀系统--4.实现秒杀接口
  12. 盗版牢骚? or 学而不思?
  13. js高级学习笔记(b站尚硅谷)-1-数据类型
  14. htcd816+android密码,详细的HTC Desire 816解锁教程
  15. windows7官方原版_如何下载微软原版操作系统、办公软件
  16. Python爬取图片之家
  17. 转载1:拓扑结构介绍及其种类
  18. lda2vec (2)
  19. Pandas是什么?Pandas库下载和安装!
  20. 软件工程导论第三章复习总结附思维导图

热门文章

  1. tkinter 文本框 值改变_【动图详解】PPT中文本框的使用方法,初学者必看!
  2. jquery name选择器_【百战程序员从开始到植发】之jquery
  3. python交通调查数据处理_python数据分析--关于时间类型数据处理的一种方法
  4. 【HDU1665】That Nice Euler Circuit(欧拉公式+点在线段上判断(不在端点)+线段规范相交)
  5. 【UKIEPC2017:D】Deranging Hat(求序列a到a‘交换过程的具体实现)
  6. SHAP(SHapley Additive exPlanation):Python的可解释机器学习库
  7. android开发第一个程序,Android开发入门之第一个android程序
  8. linux部署was找不到8879端口,WAS8.0与IHS集群安装与配置指导手册
  9. 剑指offer JZ02/05 替换空格 Python
  10. 124.二叉树中的最大路径和