图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析。不过图像的直方图不具有空间特征。

图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像素点的灰度值,绘制成直方图,其横轴是灰度值(0,255),纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分=图像的size。

灰度直方图

1 defplt_hist(img):2 plt.hist(img.ravel(), 256, [0, 256])3 plt.show()

三色折线图(可以直观的看出三原色的占比分布)

1 defimg_hist(img):2 color = ("blue", "green", "red")3 for i, color inenumerate(color):4 hist = cv.calcHist([img], [i], None, [256], [0, 256])5 plt.plot(hist, color=color)6 plt.xlim([0, 25])7 plt.show()

一般来说,直方图有双峰性,会有两个峰值以区分前景和背景,但并不是每张图像都如此。分析图像的变化,进而确定最优二值化值。在两个峰值之间的最小值,经常是我们需要找的二值化值。我们可以发现,两个峰值之间的波谷是两个峰值的叠加区。有了灰度直方图,我们可以给图片做二值化。确定哪些pixel是我们需要关注的哪些是不重要的。二值化有两种主要形式:一种是全局阈值二值化,另外一种是局部阈值二值化。

选择二值化的值(找到两个双峰的最低点,但不是都有多峰可能存在多个最小值,可以用局部阈值)

经典算法:isodata algorithm 预设初始的二值化值,然后不断迭代,效果不是最好的

Otsu algorithm 研究双峰的关联性求二值化值

Entropy algorithm 熵算法,前景熵hb和背景熵hw。0-255个灰度值分别求熵,最大的h值就是我们要找的二值化值。

其他算法:triangle algorithm 灰度值的最大值和最左侧的最小值连接,然后做垂线,当垂线距离最大时,所对应的灰度值就是我们需要的二值化值,不过这个算法效果不是很好,应用于细胞分离比较多。

使用opencvAPI:(otsu和triangle)

1 defthreshold_binary(src):2 #把BGR图像转化成灰度图像

3 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)4 #获得灰度直方图以便调整算法的使用

5 plt.hist(src.ravel(), 256, [0, 256])6 plt.show()7 #几种二值化方法

8 ret, binary = cv.threshold(gray, 50, 255, cv.THRESH_BINARY)#指定阈值50

9 print("二值阈值: %s" %ret)10 cv.imshow("threshold_binary", binary)11 ret_otsu, binary_otsu = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_OTSU)12 print("二值阈值_otsu: %s" %ret_otsu)13 cv.imshow("threshold_binary_otsu", binary_otsu)14 ret_tri, binary_tri = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_TRIANGLE)15 print("二值阈值_tri: %s" % ret_tri)

运行示例:

二值阈值: 50.0

二值阈值_otsu: 173.0

二值阈值_tri: 250.0

以上是全局阈值二值化的结果,下面还有局部阈值二值化。个人觉得局部阈值更好的描绘了图片的轮廓。

1 deflocal_threshold_binary(src):2 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)3 binary_mean = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)4 cv.imshow("binary_mean", binary_mean)5

6 binary_gau = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)7 cv.imshow("binary_gau", binary_gau)

两种方法,

超大图像及其二值化

经常会遇到一些比较大的图像,我们可以把图片拆分成很多个小方块分别进行全局二值化或者使用局部阈值。这时候可以用opencv处理图像显示不全,需要把图片保存到本地才行。

1 defbig_image_binary(src):2 print(src.shape)3 cw = 256

4 ch = 256

5 h, w, c =src.shape6 gray =cv.cvtColor(src, cv.COLOR_BGR2GRAY)7 for row inrange(0, h, ch):8 for col inrange(0, w, cw):9 roi = gray[row:row+ch, col:col+cw]10 dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)11 #ret_otsu, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

12 gray[row:row+ch, col:col+cw] =dst13 #计算方差和平均值,当这两个数值小于某一值时,可以认为图像为空白,做空白图像过滤

14 print(np.std(dst), np.mean(dst))15 cv.imwrite("E:/photo/big_img_binary.jpg", gray)

python绘制灰度图片直方图-python+opencv 灰度直方图及其二值化相关推荐

  1. 用python怎么样实现图像二值化_使用Python+OpenCV如何实现图像二值化

    使用Python+OpenCV如何实现图像二值化 发布时间:2020-10-26 14:15:52 来源:亿速云 阅读:77 作者:蛋片鸡 这篇文章运用简单易懂的例子给大家介绍使用Python+Ope ...

  2. opencv学习笔记之二值化

    opencv学习笔记之二值化 1.什么是二值化 二值化,从名词意义上可以看出来,是将一共物体转化成两个值.二值即:0或255.即一个白色一个黑色.即一个图片经过二值化之后会显示成白色和黑色的形式. 2 ...

  3. OpenCV大津法二值化

    OpenCV大津法二值化 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化 ...

  4. python绘制灰度直方图_python+opencv 灰度直方图及其二值化

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

  5. python如何将图片的像素矩阵绘制成图片(python,matplotlib):TypeError: Invalid shape (1, 28, 28) for image data

    矩阵变成图片,这个问题使用(python , matplotlib ) 可以轻松实现. import matplotlib.pyplot as plt #使用格式 plt.imshow(x)#其中x为 ...

  6. python绘制决策树图片

    背景 w3cshool机器学习篇最后一个章节是决策树的简单入门教学,我在那里拷贝代码运行时报错,显示绘制不出决策树图片 思路 python编译报错无非三种,语法错误,没有装库,路径没对.w3cshoo ...

  7. python绘制图像rgb三原色各一种直方图_直方图微观秘密,和颜色与层次(一)v1.05...

    本文是为了在已有概念的情况下,加深大家对直方图的认识. +Updated 2018/10/30 GMT+8:00 +Updated 2019/06/03 GMT+8:00 难度:60 知识点: 直方图 ...

  8. 使用openCV进行边缘检测、二值化、轮廓、轮廓检测、BGR、灰度图、二值化,专栏:各种openCV实践的案例

    专栏连接:openCV练习-各种openCV实践的案例 前言 使用OpenCV的轮廓检测,当我们加入对象的边界上的所有点时,我们得到一个轮廓. 通常,特定轮廓区域与边界像素有关,具有相似的颜色和强度. ...

  9. 用python绘制柱状图标题-使用Python绘制图表大全总结

    在使用Python绘制图表前,我们需要先安装两个库文件numpy和matplotlib. Numpy是Python开源的数值计算扩展,可用来存储和处理大型矩阵,比Python自身数据结构要高效:mat ...

  10. 用python画漂亮图片-使用 Python/matplotlib 画出漂亮的论文插图

    论文中画出各种绚烂的插图,都是用一些什么样的软件画出来的.本文介绍 Python 的绘图模块 matplotlib: Python plotting.适用于从 2D 到 3D,从标量到矢量的各种绘图. ...

最新文章

  1. 腾讯云安装samba服务器无法连接问题
  2. 青少年学python第六节_青少年学Python(第2册)
  3. 数据中心级交换机考核方法
  4. MyBatisPLus3.x中代码生成器自定义数据库表字段类型转换
  5. 2.1.3 计算机网络之编码与调制
  6. 线性求所有逆元的方法
  7. codeforces 808d
  8. WPF开发的实用小工具 - 快捷悬浮菜单
  9. win10和linux双系统分区大小,win10与Linux双系统分区问题
  10. C#中获取本机IP地址,子网掩码,网关地址
  11. 2013年值得我们学习的网页设计作品【系列二】
  12. 思维导图中主题连接线格式修改教程
  13. 配置追踪者—Scylla v1(***测试工具)
  14. DOS检查网络连通性并记录时间
  15. 固高运动控制卡学习3 --前瞻预处理
  16. 吉他音阶训练——问题解答
  17. diskgenius克隆硬盘无法启动_克隆分区
  18. 集装箱装柜计算机器在线,集装箱装柜数智能计算表
  19. sapi/cgi/php-cgi,sapi/cgi/php-cgi
  20. 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)

热门文章

  1. 乐观锁和悲观锁,可重入锁和不可重入锁(1)
  2. HTTP协议之post multipart/form-data数据类型实例
  3. cassandra 存储list数组
  4. macbook 分屏软件
  5. 删除input框type=number时,默认的上下小箭头
  6. 命令 检查Linux服务器性能
  7. Golang通道的无阻塞读写的方法示例
  8. 【转载】【VSCode】Windows下VSCode编译调试c/c++
  9. codeforces 501 C,D,E
  10. Type difference of character literals in C and C++