文章目录

  • histograms直方图
    • 1 使用opencv来计算直方图
    • 2 grayscale histograms灰度直方图
    • 3 color histograms彩色直方图
    • 4 彩色二维直方图
    • 5 histogram equalization直方图均一化
    • 6 histograms and masks带遮罩的直方图

histograms直方图

什么是直方图?

直方图就是描述像素强度intensity的分布图。如果是在RGB空间中,那么这个强度就指代某个像素在特定某一通道的值,一般是0-255。

在制作直方图的时候,X轴可以理解为箱子bin,如果有两个箱子,那么像素值(强度)在[0 128)区间的像素点就落在第一个箱子,[128 255)的像素点就落在第二个箱子。箱子的高度就是像素点的个数。

1 使用opencv来计算直方图

标准公式为

hist = cv2.calcHist(images, channels, mask, histSize, ranges)

channels是一个列表list格式,list里面装了indexs向量。例如一个RGB的3个通道,分别为[0, 1, 2],如果是一个灰度图grayscale,那么只有一个通道,所以表示为[0]。

histSize表示把像素值离散化的程度,例如可以把RGB三个通道分别映射成32个子集,此时histSize为[32, 32, 32],这三个数字可以各不相同。

ranges指定像素值的分布范围,例如RGB图像的像素分布一般是[0, 256],但是其他色彩空间,例如HSV就可能会不一样。

2 grayscale histograms灰度直方图

核心公式如下,注意cv2.calcHist()里面除了mask其他都是列表的数据格式。

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([image], [0], None, [256], [0,256])
plt.figure()
plt.plot(hist)

3 color histograms彩色直方图

绘制各个通道的彩色直方图

# 首先进行通道分离
channels = cv2.split(image)
colors = ("blue", "green", "red")
# 分别对BGR三个通道画直方图
for (channel, color) in zip(channels, colors):hist cv2.calcHist([channel], [0], None, [256], [0,256])plt.plot(hist, color = color)

4 彩色二维直方图

fig = plt.figure()
# 新建一个操作句柄
ax = fig.add_subplot(131)
hist = cv2.calcHist([channel[1],channel[0]], [0,1], None, [32,32], [0,256,0,256])
p = ax.imshow(hist, interpolation = "nearest")
ax.set_title("2D color histograms for Green and Blue")
plt.colorbar(p)ax = fig.add_subplot(132)
...print("2D histogram shape is {}, with {} values".format(hist.shape, hist.flatten().shape[0]))

5 histogram equalization直方图均一化

# 这个只是直方图的均一化,并不涉及图像的改变
eq = cv2.equalizeHist(image)
cv2.imshow("histogram equalization", np.hstack([iamge, eq]))

可以看到,原来图像的颜色相对集中在中等亮度段,而现在的图像白色和黑色部分增多(即对比度增强)。

6 histograms and masks带遮罩的直方图

首先创建遮罩

# 创建画布
mask = np.zeros(image.shape[:2], dtype = "uint8")
# 画出一个白色填充的矩形
cv2.rectange(mask, (15,15), (130,100), 255, -1)
cv2.imshow("mask", mask)

接着将遮罩覆盖到原来的图像上

# 将遮罩和图像做加的位运算
masked = cv2.bitwise_and(image, image, mask = mask)
cv2.imshow("applying the mask", masked)

最后计算遮罩区域的直方图

# 直接调用函数
plot_histogram(image, "histogram for masked image", mask = mask)

被调用函数为

def plot_histogram(image, title, mask = None):channel = cv2.split(image)colors = ("b","g","r")plt.figure()plt.title(title)for (channel, color) in zip(channels, colors):hist = cv2.calcHist([channes], [0], mask, [256], [0,256])plt.plot(hist, color = color)plt.xlim([0,256])

OpenCV-python学习笔记(三)——histograms直方图相关推荐

  1. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  2. opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...

  3. 【懒懒的Python学习笔记三】

    在上一章中,我们学习了如何创建列表.访问列表元素和简单的列表排序.那么在本章中,我们将进一步学习如何遍历整个列表和对列表更多的操作. 一.遍历列表 我们经常需要遍历整个列表,对每个元素执行相同的操作, ...

  4. Python学习笔记三

    参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一.函数的定 ...

  5. Python学习笔记三(文件操作、函数)

    一.文件处理 1.文件打开模式 打开文本的模式,默认添加t,需根据写入或读取编码情况添加encoding参数. r   只读模式,默认模式,文件必须存在,不能存在则报异常. w  只写模式,若文件不存 ...

  6. openCV Python学习笔记(二)画几何

    此处要花几何图形,我们需要用到如下几个函数: cv2.line 画线函数 cv2.circle 画圆函数 cv2.ellipse 画椭圆 cv2.rectangle 画矩形 1.画线 img=cv2. ...

  7. python学习笔记三 pickle序列化

    import pickle f=file('asdf.txt','wb') pickle.dump(saved_info,f)#保存pickle信息 f.close() f=file(asdf.txt ...

  8. OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)

    1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...

  9. Python学习笔记三(turtle:right()、left()、setheading())

    turtle.right(degree):顺时针移动degree° turtle.left(degree):逆时针移动degree° setheading(angle):设置当前朝向为angle角度 ...

  10. Python学习笔记总结

    了解了python语言后,决定以后使用python来进行各项工作,因此一直想要深入学习python.千里之行始于足下,万事开头难. 由于最近在准备写毕业论文,陆陆续续学习了Python的语法知识. P ...

最新文章

  1. Android系统--TouchEvent的处理流程
  2. Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结
  3. [译] 在 Facebook 发一张登机牌,你就有可能被盗号了
  4. 总体参数的估计(概念)
  5. magento app/design/adminhtml/default/default/template/sales/order/view/info.phtml XSS Vul
  6. java掉单_【Java】抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题...
  7. 运维工程师如果将web服务http专变为https
  8. Tomcat8.5.40启动后一直卡在日志At least one JAR was scanned for TLDs yet contained no TLDs
  9. 课堂作业-1成绩汇总
  10. 【Linux】修改Linux操作系统字符集与Oracle数据库一致
  11. 41.Linux/Unix 系统编程手册(下) -- 共享库基础
  12. java的mime类型_MIME类型大全
  13. 怎么把sql文件导入MySQL数据库中_《sql基础教程》书里的sql文件如何导入数据库?...
  14. 一文搞定十大排序算法(细)
  15. arch模型 python_【一点资讯】Python玩转金融时间序列之ARCH与GARCH模型 www.yidianzixun.com...
  16. Metasploit为什么选择Ruby语言(部分)
  17. 精密测量仪器的使用与维护
  18. 手写英文单词识别(1)
  19. 用 VeraCrypt 加密闪存盘
  20. 工程师 or 精英,犹豫中

热门文章

  1. JAVA零碎要点015---java BigDecimal常见操作_加减乘除操作_比较_取几位小数四舍五入_随时更新
  2. JAVA常用API或编程工具001---ITEXT把html转换成pdf的jar包,使用Java将HTML转换为PDF
  3. python数据结构-图
  4. java中criteria类_java – Criteria API:按类类型过滤
  5. ucc编译器(x86移植)
  6. 无人驾驶入门(雷达、定位和高精地图)
  7. 用汇编的眼光看C++(之缺省模板、特化模板)
  8. hibernate 链接mysql数据库配置文件,hibernate数据库连接文件(MySql)
  9. deepin20系统选择手动安装盘_国产操作系统替换微软还有多远?掌上电脑安装深度Deepin 20体验...
  10. python求矩阵维度必须一致_python数据分析(二)--Numpy