Python+OpenCV图像处理——图像二值化的实现


Posted in Python onOctober 24, 2020

简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

普通图像二值化

代码如下:

import cv2 as cv
import numpy as np

#全局阈值
def threshold_demo(image):
  gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化
  #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
  ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
  print("threshold value %s"%ret)
  cv.namedWindow("binary0", cv.WINDOW_NORMAL)
  cv.imshow("binary0", binary)

#局部阈值
def local_threshold(image):
  gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化
  #自适应阈值化能够根据图像不同区域亮度分布,改变阈值
  binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10)
  cv.namedWindow("binary1", cv.WINDOW_NORMAL)
  cv.imshow("binary1", binary)

#用户自己计算阈值
def custom_threshold(image):
  gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化
  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.namedWindow("binary2", cv.WINDOW_NORMAL)
  cv.imshow("binary2", binary)

src = cv.imread('E:/imageload/kobe.jpg')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow('input_image', src)
threshold_demo(src)
local_threshold(src)
custom_threshold(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

Python+OpenCV图像处理——图像二值化的实现

注意:

1.全局阈值

①OpenC的threshold函数进行全局阈值。其函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst

src参数表示输入图像(多通道,8位或32位浮点)。

thresh参数表示阈值。

maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。

type参数表示阈值类型。

retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。

dst参数表示输出与src相同大小和类型以及相同通道数的图像。

②type参数阈值类型这部分参考博客:https://blog.csdn.net/iracer/article/details/49232703  ,写的很不错。

阈值类型:

Python+OpenCV图像处理——图像二值化的实现

阈值类型图示:

Python+OpenCV图像处理——图像二值化的实现

③type参数单独选择上述五种阈值类型时,是固定阈值算法,效果比较差。

此外还有自适应阈值算法:(自适应计算合适的阈值,而不是固定阈值)

比如结合cv.THRESH_OTSU,写成cv.THRESH_BINARY | cv.THRESH_OTSU。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #大律法,全局自适应阈值,第二个参数值0可改为任意数字但不起作用。 

比如结合cv.THRESH_TRIANGLE,写成cv.THRESH_BINARY | cv.THRESH_TRIANGLE。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) #TRIANGLE法,全局自适应阈值,第二个参数值0可改为任意数字但不起作用,适用于单个波峰。  

补:

cv.THRESH_OTSU和cv.THRESH_TRIANGLE也可单独使用,不一定要写成和固定阈值算法结合的形式。单独写和结合起来写,都是自适应阈值算法优先。

例子:ret, binary = cv.threshold(gray, 0, 255,  cv.THRESH_OTSU) #大律法       ret, binary = cv.threshold(gray, 0, 255,  cv.THRESH_TRIANGLE) #TRIANGLE法  

2.局部阈值

OpenCV的adaptiveThreshold函数进行局部阈值。函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

src参数表示输入图像(8位单通道图像)。

maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.

adaptiveMethod参数表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。

thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。

blockSize参数表示块大小(奇数且大于1,比如3,5,7........ )。

C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。

补:在使用平均和高斯两种算法情况下,通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C即可得到自适应阈值。如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到。

参考:https://blog.csdn.net/guduruyu/article/details/68059450

3.numpy的reshape函数是给数组一个新的形状而不改变其数据,函数原型:reshape(a, newshape, order='C')

a参数表示需要重新形成的原始数组。

newshape参数表示int或int类型元组(tuple),若为(1, 3),表示生成的新数组是1行3列。

order参数表表示使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。

函数返回值:如果可能的话,这将是一个新的视图对象; 否则,它会成为副本。

以上就是Python+OpenCV图像处理——图像二值化的实现的详细内容,更多关于python 图像二值化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中的引用和拷贝浅析
Nov 22 Python
Python基本语法经典教程
Mar 11 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
Django中间件基础用法详解
Jul 18 Python
python英语单词测试小程序代码实例
Sep 09 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
Python基于Tkinter编写crc校验工具
May 06 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
使用Python将语音转换为文本的方法
Aug 10 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
python 下划线的不同用法
Oct 24 #Python
python 写一个性能测试工具(一)
Oct 24 #Python
Django admin组件的使用
Oct 24 #Python
Python数据可视化常用4大绘图库原理详解
Oct 23 #Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 #Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
You might like
Apache设置虚拟WEB
2006/10/09 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
php接口隔离原则实例分析
2019/11/11 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Django进阶之CSRF的解决
2018/08/01 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
Python的垃圾回收机制详解
2019/08/28 Python
详解Python的三种拷贝方式
2020/02/11 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
生物技术专业求职信
2014/06/10 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2015年推普周活动总结
2015/03/27 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis