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 相关文章推荐
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
python2.7安装图文教程
Mar 13 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
Python气泡提示与标签的实现
Apr 01 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
pycharm sciview的图片另存为操作
Jun 01 Python
如何基于python把文字图片写入word文档
Jul 31 Python
Python命名空间及作用域原理实例解析
Aug 12 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
pytorch fine-tune 预训练的模型操作
Jun 03 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
我的群发邮件程序
2006/10/09 PHP
php 什么是PEAR?
2009/03/19 PHP
一个比较简单的PHP 分页分组类
2009/12/10 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
一个tab标签切换效果代码
2009/03/27 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
python 循环遍历字典元素的简单方法
2016/09/11 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
保荐人的岗位职责
2013/11/19 职场文书
篮球比赛口号
2014/06/10 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书