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三级目录展示的实现方法
Sep 28 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
对python字典过滤条件的实例详解
Jan 22 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
Python list和str互转的实现示例
Nov 16 Python
Jupyter Notebook内使用argparse报错的解决方案
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
php的一个登录的类 [推荐]
2007/03/16 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php文件上传类的分享
2017/07/06 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
一个JavaScript变量声明的知识点
2013/10/28 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python计算两个日期相差天数的方法示例
2017/05/23 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
python快排算法详解
2019/03/04 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
python 绘制国旗的示例
2020/09/27 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
判断单链表中是否存在环
2012/07/16 面试题
家长意见和建议怎么写
2015/06/04 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题