1.什么是图像二值化

彩色图像: 有blue,green,red三个通道,取值范围均为0-255

灰度图:只有一个通道0-255,所以一共有256种颜色

二值图像:只有两种颜色,黑色和白色,二值化就是把图像的像素转变为0或者255,只有这两个像素值。0白色 1黑色 。0是黑色,255是白色。

2.图像二值化

(1)先获取阈值

(2)根据阈值去二值化图

(3)threshold函数

  1. ret, dst = cv2.threshold(src, thresh, maxval, type)
  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • thresh: 阈值
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

(4)全局阈值 -代码实现

  1. 1 # -*- coding=GBK -*-
  2. 2 import cv2 as cv
  3. 3 import numpy as np
  4. 4
  5. 5
  6. 6 #图像二值化 0白色 1黑色
  7. 7 #全局阈值
  8. 8 def threshold_image(image):
  9. 9 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  10. 10 cv.imshow("原来", gray)
  11. 11
  12. 12 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用
  13. 13 print("阈值:%s" % ret)
  14. 14 cv.imshow("OTSU", binary)
  15. 15
  16. 16 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
  17. 17 print("阈值:%s" % ret)
  18. 18 cv.imshow("TRIANGLE", binary)
  19. 19
  20. 20 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)# 自定义阈值为150,大于150的是白色 小于的是黑色
  21. 21 print("阈值:%s" % ret)
  22. 22 cv.imshow("自定义", binary)
  23. 23
  24. 24 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)# 自定义阈值为150,大于150的是黑色 小于的是白色
  25. 25 print("阈值:%s" % ret)
  26. 26 cv.imshow("自定义反色", binary)
  27. 27
  28. 28 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)# 截断 大于150的是改为150 小于150的保留
  29. 29 print("阈值:%s" % ret)
  30. 30 cv.imshow("截断1", binary)
  31. 31
  32. 32 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)# 截断 小于150的是改为150 大于150的保留
  33. 33 print("阈值:%s" % ret)
  34. 34 cv.imshow("截断2", binary)
  35. 35
  36. 36 src = cv.imread("C://1.jpg")
  37. 37 threshold_image(src)
  38. 38 cv.waitKey(0)
  39. 39 cv.destroyAllWindows()

函数threshold()的参数说明:

cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用
    cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
    cv.THRESH_BINARY)# 自定义阈值为150,大于150的是白色 小于的是黑色
    cv.THRESH_BINARY_INV)# 自定义阈值为150,大于150的是黑色 小于的是白色
    cv.THRESH_TRUNC)# 截断 大于150的是改为150  小于150的保留

cv.THRESH_TOZERO)# 截断 小于150的是改为150  大于150的保留

(5)局部阈值 -代码实现

自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合适的图片。

  1. dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • thresh_type: 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
  • type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
  • Block Size: 图片中分块的大小,必须为奇数
  • C :阈值计算方法中的常数项
  1. 1 #局部阈值
  2. 2 def local_image(image):
  3. 3 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  4. 4 cv.imshow("原来", gray)
  5. 5 binary1 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10) #blocksize必须为奇数
  6. 6 cv.imshow("局部1", binary1)
  7. 7 binary2 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)#高斯处理
  8. 8 cv.imshow("局部2", binary2)

(6)自己计算阈值-代码实现

图像的长宽以及灰度、RGB图像的像素原理分布

https://blog.csdn.net/qq_29540745/article/details/70256722

  1. 1 # -*- coding=GBK -*-
  2. 2 import cv2 as cv
  3. 3 import numpy as np
  4. 4
  5. 5
  6. 6 #求出图像均值作为阈值来二值化
  7. 7 def custom_image(image):
  8. 8 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  9. 9 cv.imshow("原来", gray)
  10. 10 h, w = gray.shape[:2]
  11. 11 m = np.reshape(gray, [1, w*h])#化为一维数组
  12. 12 mean = m.sum() / (w*h)
  13. 13 print("mean: ", mean)
  14. 14 ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
  15. 15 cv.imshow("二值", binary)
  16. 16
  17. 17
  18. 18 src = cv.imread("C://1.jpg")
  19. 19 custom_image(src)
  20. 20 cv.waitKey(0)
  21. 21 cv.destroyAllWindows()

参考:

https://blog.csdn.net/u011321546/article/details/79593195

https://blog.csdn.net/Vici__/article/details/100714822#15%E3%80%81%E4%BA%8C%E5%80%BC%E5%8C%96%EF%BC%88cv2.threshold%EF%BC%89

https://www.cnblogs.com/ssyfj/p/9272615.html

 

python实现图像二值化的更多相关文章

  1. opencv python:图像二值化

    import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑, ...

  2. Python+OpenCV图像处理(十)—— 图像二值化

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 一.普通图像二值化 代码如下: import cv2 as cv import numpy ...

  3. [python-opencv]图像二值化【图像阈值】

    图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...

  4. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  5. C# 指针操作图像 二值化处理

    /// <summary> /// 二值化图像 /// </summary> /// <param name="bmp"></param& ...

  6. openCV_java 图像二值化

    较为常用的图像二值化方法有:1)全局固定阈值:2)局部自适应阈值:3)OTSU等. 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化 ...

  7. MATLAB:图像二值化、互补图(反运算)(im2bw,imcomplement函数)

    图像二值化.反运算过程涉及到im2bw,imcomplement函数,反运算可以这么理解:原本黑的区域变为白的区域,白的区域变为黑的区域. 实现过程如下: close all; %关闭当前所有图形窗口 ...

  8. OpenCV_基于局部自适应阈值的图像二值化

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

  9. Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化  [函数名称]   P分位法图像二值化 [算法说明]   所谓P分位法图像分割,就是在知道图像中目标所占的比率Rat ...

随机推荐

  1. Ubuntu 20.04上安装MySQL教程,ubuntu安装mysql

    在Ubuntu 20.04上安装MySQL教程 先决条件 确保您以具有sudo特权的用户身份登录. 在Ubuntu上安装MySQL 在撰写本文时,Ubuntu存储库中可用的MySQL的最新版本是MyS ...

  2. 使用 WPF + Chrome 内核实现 在线客服系统 的复合客服端程序

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署免费下载:https://docs.sh ...

  3. 11.5.2 LVS-NAT 实验

    NAT拓扑 lvs-server VIP:10.211.55.99DIP:10.37.129.99 负载均衡器 开启路由功能(VIP桥接,DIP仅主机) rs01 RIP:10.37.129.3 后端 ...

  4. 题解 Yuno loves sqrt technology II

    题目传送门 题目大意 有\(n\)个数,\(m\)个查询,每次查询一个区间内的逆序对个数. \(n,m\le 10^5\) 思路 其实是为了锻炼二次离线才做这道题的. 不难想到可以有一个\(\Thet ...

  5. 洛谷3628 APIO2010特别行动队(斜率优化)

    考虑最普通的\(dp\) \[dp[i]=max(dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c \] qwq 由于演算纸扔掉了 qwq 所以直接给出最后的 ...

  6. Windows内核开发-9-32位和64位的区别

    Windows内核开发-9-32位和64位的区别 32位的应用程序可以完美再64位的电脑上运行,而32位的内核驱动无法再64位的电脑上运行,或者64位的驱动无法在32位的应用程序上运行.这是为什么呢. ...

  7. Excel一对多查找

    很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找方法 ...

  8. Convolutional Neural Network-week2编程题2(Residual Networks)

    1. Residual Networks(残差网络) 残差网络 就是为了解决深网络的难以训练的问题的. In this assignment, you will: Implement the basi ...

  9. 安装pytorch的细节记录

    1.根据教程安装pytorch的时候发现太慢了,无法容忍,根据https://blog.csdn.net/zzq060143/article/details/88042075z在Ancona Prom ...

  10. 【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)

    问题描述 如何把开启NFS协议的Azure Blob挂载到Linux虚拟机中呢? [答案]:可以使用 NFS 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或在本地运行的 Linu ...