OpenCV-Python图像处理:图像阈值处理
☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░
一、概述
图像的阈值处理又称为二值化(Binarization),之所以称为二值化,是它可以将一幅图转换为感兴趣的部分(前景)和不感兴趣的部分(背景),二值化可以剔除掉图像中一些低于或高于一定值(即阈值)的像素,从而提取图像中的物体,通常将超过阈值的像素作为前景。阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。
阈值处理有2种方式,一种是固定阈值方式,又包括多种处理模式,另一种是非固定阈值,由程序根据算法以及给出的最大阈值计算图像合适的阈值,再用这个阈值进行二值化处理,非固定阈值处理时需要在固定阈值处理基础上叠加组合标记,叠加方式就是与固定阈值方式的标记相或。
在OpenCV-Python阈值处理相关的函数有threshold和adaptiveThreshold,threshold为固定阈值处理,adaptiveThreshold为自适应阈值处理。
二、threshold函数
2.1、threshold语法说明
调用语法:
retval, dst = cv2.threshold (src, thresh, maxval, type)
其中:
- src:源图像,8位或32位图像的numpy数组
- thresh:阈值,0-255之间的数字,在进行处理时以阈值为边界来设不同的输出,阈值判断时,是以小于等于阈值和大于阈值作为分界条件
- maxval:最大阈值,当使用固定阈值方法时为指定阈值,当叠加标记时为允许最大的阈值,算法必须在小于该值范围内计算合适的阈值
- type:处理方式,具体取值及含义如下:
- dst:阈值化处理后的结果图像numpy数组,其大小和通道数与源图像相同
- retval:叠加cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE标记后返回真正使用的阈值
从官网介绍资料的说明来看threshold 是支持32位彩色图像处理的,但网上几乎找不到关于处理彩色图像的机制说明及案例,经过老猿验证测试,对threshold 处理彩色图像的机制说明如下:
如果是32位彩色图像,则是以RGB每个通道的值单独与阈值进行比较,按每个通道进行阈值处理,返回的是一个阈值处理后的RGB各自的值,即还是32位图像。
2.2、案例
阈值化处理公开资料比较多,在此不介绍一般的灰度图阈值处理案例,介绍一个彩色图像阈值处理案例。
img1 = cv2.imread(r"F:\screenpic\redflower.jpg")
ret,img2 = cv2.threshold(img1, 35, 255, cv2.THRESH_BINARY)
cv2.imwrite(r"F:\screenpic\redflower_threshold.jpg",img2)
源图:
处理后图:
三、adaptiveThreshold函数
图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情况下图片中不同区域的阈值是不一样的。这样就需要一种方法根据图像不同区域亮度或灰度分布,计算其局部阈值来进行阈值处理。这种方法就是自适应阈值化图像处理,实际上这可以称为局部阈值法。
3.1、语法说明
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
说明:
- src:源图像,必须是8位的灰度图
- dst:处理后的目标图像,大小和类型与源图像相同
- maxValue:用于指定满足条件的像素设定的灰度值
- adaptiveMethod:使用的自适应阈值算法,有2种类型ADAPTIVE_THRESH_MEAN_C算法(局部邻域块均值)或ADAPTIVE_THRESH_GAUSSIAN_C(局部邻域块高斯加权和),ADAPTIVE_THRESH_MEAN_C的计算方法是计算出邻域的平均值再减去第六个参数C的值,ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出邻域的高斯均匀值再减去第六个参数C的值。处理边界时使用BORDER_REPLICATE | BORDER_ISOLATED模式
- thresholdType:阈值类型,只能是THRESH_BINARY或THRESH_BINARY_INV二者之一,具体参考上面“图像阈值处理”的表格
- blockSize:表示邻域块大小,用来计算区域阈值,一般选择3、5、7……
- C:表示常数,它是一个从均匀或加权均值提取的常数,通常为正数,但也可以是负数或零
- 返回值:处理后的图像
3.2、处理说明
- 亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小
- 在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓。因此函数adaptiveThreshold除了将灰度图像二值化,也可以进行边缘提取
- 之所以能进行边缘提取,是因为当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数
- 当把blockSize设为比较大的值时,如blockSize=21 or 31 or 41时,adaptiveThreshold便是二值化函数
- blockSize必须为大于1的奇数(这里其实就是一个卷积矩阵,为奇数是好计算矩阵的中心) ,
- 如果使用平均值方法,平均值mean为180,差值delta为10,maxValue设为255。那么灰度小于170的像素为0,大于等于170的像素为255,如果是反向二值化,灰度小于170的像素为255,大于等于170的像素为0
3.3、案例
import cv2img = cv2.imread(r'F:\screenpic\1.jpg',cv2.IMREAD_GRAYSCALE)
newImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 3, 5)
cv2.imshow('img',img)
cv2.imshow('newImg',newImg)
cv2.waitKey(60000)
运行效果:
源图:
下面是分别设置不同blockSize的结果图,左图块大小blockSize为31,右图blockSize为3:
可以看到blockSize小时,轮廓识别效果明显,而大时,就是一个二值化图像。
四、小结
图像阈值处理又称为二值化(Binarization),它将一幅图转换为感兴趣的部分(前景)和不感兴趣的部分(背景),二值化可以剔除掉图像中一些低于或高于一定值(即阈值)的像素,从而提取图像中的物体,通常将超过阈值的像素作为前景。阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。本文介绍了图像阈值处理的概念、OpenCV-Python的支持函数threshold和adaptiveThreshold以及相关案例。
更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。
更多图像处理的数学基础知识请参考专栏《人工智能数学基础 https://blog.csdn.net/laoyuanpython/category_10382948.html》
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
OpenCV-Python图像处理:图像阈值处理相关推荐
- 二维otsu算法python_【OpenCV+Python】图像阈值与OTSU算法
图像阈值 自本教程开始,我们已经进入了图像处理的一些基本操作的学习,所谓的图像阈值,就是图像二值化.什么是二值化?就是只有0和1,没有其他的.在OpenCV的图像里面,二值化表示图像的像素为0和255 ...
- OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换
OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 目录 OpenCV中的图像处理 -- 图像阈值+图像平滑+形态转换 1. 图像阈值 1.1 简单阈值 1.2 自适应阈值 1.3 Otsu ...
- Opencv Python图像处理进阶教程②
Opencv Python图像处理进阶教程 概述: 代码: https://github.com/bai1231/opencv-learn_and_pratice 1. 图像卷积与应用 图像去噪 图像 ...
- 《opencv 数字图像处理 图像基础》
<opencv 数字图像处理 图像基础> 矩阵 通道分离和合并 彩色图像转灰度图像 灰度图转二值化图像 图像运算 矩阵 定义一个显示图像的函数,对于灰度图,里面添加了vmin=0,vmax ...
- openCV—Python(6)—— 图像算数与逻辑运算
openCV-Python(6)-- 图像算数与逻辑运算 一.函数简介 1.add-图像矩阵相加 函数原型:add(src1, src2, dst=None, mask=None, dtype=Non ...
- OpenCV python 提取图像内的三色
OpenCV python 提取图像内的三色 原图 [opencv.jpg] import cv2 import numpy as npdef main():# 1.导入图片img_src = cv2 ...
- OpenCV中的图像阈值处理算法
简 介: 本文讨论了如何通过图像阈值算法来对图像中特点对接进行隔离. 演示了几种不同的阈值分割(全局阈值分割)算法的结果.对于最简单的阈值算法,通过改变其中的阈值可以获得不同的分割效果. 关键词: 阈 ...
- 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现
环境:Python3.8 和 OpenCV 内容:自适应阈值分割代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as ...
- OpenCV与Python之图像阈值化
https://blog.csdn.net/qq_33757398/article/details/88911241 https://www.cnblogs.com/jyxbk/p/9638541.h ...
- ❤️大家中秋节快乐❤️接下来请欣赏Python Opencv实战之图像阈值和模糊处理,万字实战,收藏起来吧~
最新文章
- 贝叶斯统计:Tweedie公式及其证明
- 【CSS3】CSS3文本相关属性大全
- 数据结构与算法学习笔记之 提高读取性能的链表(上)
- django表格_Django表格
- python中字典dictionary详解及基本使用
- python爬虫实例(百度图片、网站图片)
- 电子海图系统线状符号表达及绘制方法
- zabbix3.4详细安装教程
- Fiddler抓包https配置
- 发现一款牛逼的 IDEA 插件:检测代码漏洞,一键修复!
- segue跳转_使用SwiftUI的Segue Shenanigans
- 强哥说Java--Java接口
- FPGA学习-rom只读存储器(嵌入式块应用)
- Matlab视频处理
- 克里奥服务器装系统,克里奥神模拟器
- unity建立项目崩溃:failed to decompress
- sqlserver的分页查询
- C语言实现 百钱百鸡
- 用爬虫批量采集阿里巴巴1688商品数据
- 前端学习——第三方登录(Google登录、Facebook登录)
热门文章
- [循证理论与实践] meta分析系列之一: meta分析的类型
- android测试入门选择哪个工具何时,Android单元测试——辅助工具介绍
- c语言强制转换例子,关于强制类型转换(c语言)(示例代码)
- shell 调用securecrt_Linux下的SecureCRT/XShell替代工具
- 勤于奋抖音推文知乎小说变现第四课:如何找素材
- A brief taste of JIFA
- SharePoint备份文件
- [读书笔记-3] 卓有成效的管理者-聚焦贡献
- Anaconda安装教程及numpy环境配置
- 怎么在高一的时候逆袭