直方图概念

如图:下面黑色图为上面图的直方图
横坐标:图像中各个像素点的灰度级
纵坐标:具有该灰度级的像素个数。

归一化直方图
横坐标:图像中各个像素点的灰度级
纵坐标:出现该灰度级的概率。

DIMS:使用参数的数量
dims=1:灰度直方图,仅仅考虑灰度的情况。
还有其他考虑亮度的
BINS:参数子集的数目
bins=256: 如灰度是256. 表示0-255
缩小数字表示将临近值合并。

RANGE:统计灰度值的范围,一般为[0-255]
最小值0:黑色
最大值255:白色

直方图绘制

python+opencv
1.使用matplotlib绘制直方图
函数:hist(数据源,像素级)
数据源:图像,必须是一维数组
像素级:一般是256,指[0-255]

np.raval()可以实现多维数组转一维。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("boat.jpg")
cv2.imshow("original",o)
plt.hist(o.ravel(),256)#o.ravel()将像素数组转一维
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()

像素直方图

2.使用opencv绘制直方图

hist=cv2.calcHist(images,channels,mask,histsize,ranges,accumulate)
hist:直方图
images:原始图像,格式[src],需要用中括号括起来
channels:通道,灰色直接[0],BGR对应[0],[1],[2]
mask:掩码图像。如果一个图很大,需要计算部分图的直方图,需要掩码。
histsize:BINS的数量,需要用中括号括起来。一般是[256]
ranges:像素值范围,一般[0,255]
accumulate:累积标识。可选参数、默认false,设为true为计算好几幅图的直方图。

绘制灰度图像直方图
不使用掩码

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("boatGray.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
print("type:",type(histb))
print('szie:',histb.size)
print('shape:',histb.shape)
plt.plot(histb,color='r')
plt.show()



绘制彩色图像直方图
不使用掩膜
注意012,是BGR,非RGB

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("girl.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()


3.使用掩膜的直方图

生成掩膜
mask=np.zeros(image.shape,np.unit8)#生成全黑图像
mask[200:400,200:400]=255#部分取白
把生成的掩膜传入下列函数的mask中,即完成。
hist=cv2.calcHist(images,channels,mask,histsize,ranges,accumulate)

import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread("girl.bmp",cv2.IMREAD_GRAYSCALE)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
histMI=cv2.calcHist([image],[0],mask,[256],[0,255])#使用掩膜,只对第一通道
histImage=cv2.calcHist([image],[0],None,[256],[0,255])#不适用掩膜,只对第一通道
plt.plot(histImage,'r')
plt.plot(histMI)
plt.show()

原图

蓝色为使用掩膜的直方图

掩膜处理

黑色为0,其他色为1.将掩膜与原始图像进行与操作。得到处理结果。



使用方法
计算结果=cv2.bitwise_and(原始图像,掩膜)
bitwise:按位操作
and:与运算

import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread("boat.bmp",0)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
mi=cv2.bitwise_and(image,mask)
cv2.imshow('original',image)
cv2.imshow('mask',mask)
cv2.imshow('mi',mi)
cv2.waitKey()
cv2.destroyAllWindows()

直方图均衡化

应用场合:图像过亮或者过暗。如车牌识别

理论前提:如果一个图像占有全部可能的灰度级,并且均匀分布。
结论:该图像具有高对比度和多变的灰度色调。读取的是灰度图
外观:图像细节丰富,质量更高。
算法
1.计算累积直方图
2.将累积直方图进行区间转换
3.在累积直方图中,概率相近的原始值,会被处理成相同的值。
1.计算累积直方图

2.将累积直方图进行区间转换

累积直方图:对前面求和。1的值=0和1的值的和

3.在累积直方图中,概率相近的原始值,会被处理成相同的值。
7是因为给出的示例是三维的二进制,范围是0-7,如果是np.unit9,应是255。

四舍五入得到新的值:原先是0的像素变成1,原始是1的像素变成3…。

新的像素有1,3,4,5,6,7。是因为合并如原先的45都变成了5。

换成255的数示例

方法
dst=cv2.equalizeHist(src)
dst:处理结果
src:源图像。

直方图对比

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('equ.bmp',cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.hist(img.ravel(),256)
plt.figure()
plt.hist(equ.ravel(),256)
plt.show()

原始

处理后

示例:
处理的是灰度图,需要读取灰色图

import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread("equ.bmp",cv2.IMREAD_GRAYSCALE)#读取灰色图像
r=cv2.equalizeHist(o)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

import cv2
import matplotlib.pyplot as plt
img = cv2.imread('boat.bmp',cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.subplot(221)
plt.imshow(img,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(222)
plt.imshow(equ,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(223)
plt.hist(img.ravel(),256)
plt.subplot(224)
plt.hist(equ.ravel(),256)
plt.show()


总目录链接:
python3+opencv学习笔记汇总目录(适合基础入门学习)
电气专业的计算机小白,写博文不容易。如果你觉得本文不错,请点个赞支持下。谢谢。

opencv学习笔记21:直方图和掩膜 原理及其应用相关推荐

  1. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

  2. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  3. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. OpenCV学习笔记(十六):直方图均衡化:equalizeHist()

    OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...

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

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

  7. 9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测

    文章目录 前言 一.Mask 二.彩色直方图 三.画出基本图形 四.图片上显示文本 五.人脸检测 前言 本文为9月10日OpenCV学习笔记--Mask.彩色直方图.人脸检测,分为五个章节: Mask ...

  8. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  9. opencv学习笔记18:canny算子边缘检测原理及其函数使用

    canny边缘检测原理 去噪:边缘检测容易受到噪声的影响,在此之间,先去噪,通常采用高斯滤波器.opencv学习笔记11:图像滤波(均值,方框,高斯,中值) 梯度:对去噪后的图像采用sobel算子计算 ...

最新文章

  1. python重复执行函数_Python threading 单线程 timer重复调用函数
  2. BZOJ4034 树上操作(树剖 线段树大模板)
  3. equipment download scenario3
  4. android 按钮按下缩放,android捏缩放
  5. 开源社区_建立一个开源社区
  6. 【PAT甲】1006 Sign In and Sign Out (25分)循环模拟
  7. CSS3学习案例1——超级链接类型标示图标
  8. GitHub 添加 SSH keys
  9. 3D Slicer Programmatically Set Slice Offset and Intersections 用代码修改Slicer中的切片偏移和交叉点显示...
  10. 预处理_浅析雨水收集系统——雨水预处理
  11. Halcon 入门教程(01)
  12. Max Core Frequency 异常显示为-1.80GHz -- Intel-Extreme-Tuning-Utility-Intel-XTU (英特尔 XTU)
  13. Mac删除Python缓存文件
  14. 炒币玩波段为什么一定要设置止损止盈?
  15. 如何在word中使用latex输入下括号?
  16. 基于python实现resnet_【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控...
  17. 技巧:彻底删除电脑弹窗广告,还你一个干净的桌面!
  18. Linux Ubuntu 添加创建新用户步骤 安装 go
  19. 《凯恩斯革命的前世今生》导语集(前三章)
  20. seo推广优化的方法

热门文章

  1. centos 上传jar 命令_centos上快速将一个jar使用docker部署启动
  2. Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.
  3. Spring Security——简单第三方OAuth2登录自动配置——GitHub登录DEMO
  4. hadoop-1.1.2 在centos环境下的部署
  5. 【iOS XMPP】使用XMPPFramewok(一):添加XMPPFramework(XCode 4.6.2)
  6. java + selenium 种WebElement 定位到父元素 跟子元素
  7. Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题
  8. Centos MySql基础
  9. Java web—Servlet过滤器(Filter)
  10. Tomcat 的类加载机制