opencv python如何实现图像二值化


Posted in Python onFebruary 03, 2020

这篇文章主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

代码如下

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白
# 有全局和局部两种
# 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。
# 如果是一副双峰图像(简 单来说双峰图像是指图像直方图中存在两个峰)呢?
# 我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。
# 简单来说就是对 一副双峰图像自动根据其直方图计算出一个阈值。
# (对于非双峰图像,这种方法 得到的结果可能会不理想)。


def threshold_demo(image):
  gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

  # 这个函数的第一个参数就是原图像,原图像应该是灰度图。
  # 第二个参数就是用来对像素值进行分类的阈值。
  # 第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
  # 第四个参数来决定阈值方法,见threshold_simple()
  # ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
  ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
  print("threshold value: %s"%ret)
  cv.imshow("threshold_demo", binary)


def threshold_simple(image):
  img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  ret, thresh1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
  ret, thresh2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
  ret, thresh3 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)
  ret, thresh4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
  ret, thresh5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)
  titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
  images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

  for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray') # 将图像按2x3铺开
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

  plt.show()


# 在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。
# 当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。
# 这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的 每一个小区域计算与其对应的阈值。
# 因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
# 这种方法需要我们指定三个参数,返回值只有一个
# _MEAN_C:阈值取自相邻区域的平均值,_GAUSSIAN_C:阈值取值相邻区域 的加权和,权重为一个高斯窗口。
# Block Size - 邻域大小(用来计算阈值的区域大小)。
# C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。

def threshold_adaptive(image):
  img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  # 中值滤波
  img = cv.medianBlur(img,5)

  ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
  # 11 为 Block size, 2 为 C 值
  th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)
  th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)

  titles = ['Original Image', 'Global Threshold (v = 127)', 'Adaptive Mean Threshold', 'Adaptive Gaussian Threshold']
  images = [img, th1, th2, th3]

  for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])

  plt.show()


def threshold_custom(image):
  gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  h, w = gray.shape[:2]
  m = np.reshape(gray, [1, w*h])
  mean = m.sum() / (w*h) # 求出整个灰度图像的平均值
  print("mean:", mean)
  ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
  cv.imshow("threshold_custom", binary)


# 将大图片拆分成小图片后再用自适应局部阈值比较好
def big_image_demo(image):
  print(image.shape)
  cw = 200
  ch = 200
  h, w = image.shape[:2]
  gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  cv.imshow("big_image_demo_gray", gray)

  # 将一张图片每隔ch * cw分成一份
  for row in range(0, h, ch):
    for col in range(0, w, cw):
      roi = gray[row:row+ch, col:col+cw]
      dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 2)
      gray[row:row + ch, col:col + cw] = dst
      print(np.std(dst), np.mean(dst))

  cv.imwrite("../images/result_big_image.png", gray)


def main():
  img = cv.imread("../images/02.jpg")
  # threshold_demo(img)
  # threshold_simple(img)
  # threshold_adaptive(img)
  # threshold_custom(img)
  src = cv.imread("../images/big_image.jpg")
  big_image_demo(src)
  cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口
  cv.destroyAllWindows() # 关闭所有窗口


if __name__ == '__main__':
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 文件和路径操作函数小结
Nov 23 Python
python基础教程之获取本机ip数据包示例
Feb 10 Python
Python脚本处理空格的方法
Aug 08 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
python如何定义带参数的装饰器
Mar 20 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
python实现人机猜拳小游戏
Feb 03 #Python
如何使用selenium和requests组合实现登录页面
Feb 03 #Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 #Python
Tensorflow 实现释放内存
Feb 03 #Python
手把手教你进行Python虚拟环境配置教程
Feb 03 #Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 #Python
python global和nonlocal用法解析
Feb 03 #Python
You might like
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
网络教育毕业生自我鉴定
2013/10/10 职场文书
手术室护士自我鉴定
2013/10/14 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
可口可乐广告词
2014/03/20 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
安全检查汇报材料
2014/12/26 职场文书
医院党建工作总结2015
2015/05/26 职场文书
关于保护环境的建议书
2019/06/24 职场文书