1. pip install matplotlib

1简单的阈值化

cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. OpenCV提供不同类型的阈值,它由函数的第四个参数决定. 不同的类型是:

cv2.THRESH_BINARY 如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0
cv.THRESH_BINARY_INV 如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value
cv.THRESH_TRUNC 如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y)
cv.THRESH_TOZERO 如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0
cv.THRESH_TOZERO_INV 如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y)

代码

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pylab as plt
  4.  
  5. img = cv2.imread('lena.jpg',0)
  6. ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
  7. ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
  8. ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
  9. ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
  10. ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
  11.  
  12. titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
  13. images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
  14.  
  15. for i in range(6):
  16. plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
  17. plt.title(titles[i])
  18. plt.xticks([]),plt.yticks([])
  19.  
  20. plt.show()

测试效果

2自适应阈值化

图像在不同区域具有不同照明条件时,应进行自适应阈值处理.因此,我们为同一图像的不同区域获得不同的阈值,并且它为具有不同照明的图像提供了更好的结果.
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
adaptiveMethod:决定如何计算阈值

  • cv2.ADAPTIVE_THRESH_MEAN_C:阈值是邻域的平均值
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值的加权和,其中权重是高斯窗口

blockSize:决定了邻域的大小
C:从计算的平均值或加权平均值中减去的常数

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pylab as plt
  4.  
  5. img = cv2.imread('lena.jpg',0)
  6. img = cv2.medianBlur(img,5)
  7.  
  8. ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
  9. th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
  10. cv2.THRESH_BINARY,11,2)
  11. th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
  12. cv2.THRESH_BINARY,11,2)
  13.  
  14. titles = ['Original Image', 'Global Thresholding (v = 127)',
  15. 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
  16. images = [img, th1, th2, th3]
  17.  
  18. for i in range(4):
  19. plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
  20. plt.title(titles[i])
  21. plt.xticks([]),plt.yticks([])
  22. plt.show()

3 大津阈值法

根据双峰图像的图像直方图自动计算阈值。 (对于非双峰图像,二值化不准确。)

使用cv.threshold()但是传递了一个额外的标志v.THRESH_OTSU.对于阈值,只需传递零.然后算法找到最佳阈值并返回为第二个输出retVal。如果未使用Otsu阈值法,则retVal与之前使用的阈值相同.

在第一种情况下,将全局阈值应用为值127.在第二种情况下,直接应用了Otsu的阈值.在第三种情况下,使用5x5高斯内核过滤图像以消除噪声,然后应用Otsu阈值处理.
代码

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pylab as plt
  4.  
  5. img = cv2.imread('lena.jpg',0)
  6. # global thresholding
  7. ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
  8.  
  9. # Otsu's thresholding
  10. ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
  11.  
  12. # Otsu's thresholding after Gaussian filtering
  13. blur = cv2.GaussianBlur(img,(5,5),0)
  14. ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
  15.  
  16. # plot all the images and their histograms
  17. images = [img, 0, th1,
  18. img, 0, th2,
  19. blur, 0, th3]
  20. titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
  21. 'Original Noisy Image','Histogram',"Otsu's Thresholding",
  22. 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
  23.  
  24. for i in range(3):
  25. plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
  26. plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
  27. plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
  28. plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
  29. plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
  30. plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
  31.  
  32. plt.show()

opencv python 图像二值化/简单阈值化/大津阈值法的更多相关文章

  1. 10、OpenCV Python 图像二值化

    __author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)---------- ...

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

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

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

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

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

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

  5. Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化  [函数名称] 简单统计法图像二值化 WriteableBitmap StatisticalThSegment(Wr ...

  6. python实现图像二值化

    1.什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色,二值化就是 ...

  7. openCV_java 图像二值化

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

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

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

  9. Win8 Metro(C#)数字图像处理--2.55OSTU法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.55OSTU法图像二值化  [函数名称] Ostu法图像二值化      WriteableBitmap OstuThSegment(Writ ...

随机推荐

  1. 使用 java替换web项目的web.xml

    创建一个接口: package my.web; public interface SpringWeb { void config(); } 实现类: package my; import my.web ...

  2. Java九种基本数据类型,以及他们的封装类

    基本类型 大小(字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer long 8 0L Long float ...

  3. SOUI中对象的生命周期管理

    C++程序员最难的一环就是处理内存泄漏. 很多情况下,一个对象在一个模块里分配了内存,忘记了释放,或者在另一个模块里释放都会导致内存相关的问题. SOUI中大部分暴露在应用层的对象都使用类似COM的引 ...

  4. Factory Kit【其他模式】

    Factory Kit public class FactoryKit { /** * Factory Kit:它定义了一个包含不可变内容的工厂,并使用独立的构建器和工厂接口来处理对象的创建. */ ...

  5. Openstack 实现技术分解 (3) 开发工具 — VIM & dotfiles

    目录 目录 前文列表 扩展阅读 前言 插件管理 Vundle 主题 Solarized 浏览项目目录结构 Nerdtree Symbol 窗口 Tagbar 文件模糊查询 CtrlP 代码补全 You ...

  6. 前后端分离&接口API设计学习报告

    接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...

  7. windows7如何用键盘模拟鼠标操作

    windows7如何用键盘模拟鼠标操作 https://jingyan.baidu.com/article/6dad5075104907a123e36e38.html 听语音 37453人看了这个视频 ...

  8. node-webkit-updater——NW.js自动更新

    NW.js自动更新三种方案: 1)node-webkit-updater(推荐) 2)nwjs-autoupdater 3)nw-autoupdater NW.js自动更新三种方案:[http://d ...

  9. 【ABAP系列】SAP ABAP SY-SUBRC的含义解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP SY-SUBR ...

  10. 手工设计神经MNIST使分类精度达到98%以上

    设计了两个隐藏层,激活函数是tanh,使用Adam优化算法,学习率随着epoch的增大而调低 import tensorflow as tf from tensorflow.examples.tuto ...