Python OpenCV阈值处理详解
作者:盼小辉丶 发布时间:2023-10-07 19:38:47
前言
图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实世界的对象。因此,图像分割是图像识别和内容分析的重要步骤。图像阈值是一种简单、有效的图像分割方法,其中像素根据其强度值进行分区。在本文中,将介绍 OpenCV
所提供的主要阈值技术,可以将这些技术用作计算机视觉应用程序中图像分割的关键部分。
阈值技术简介
阈值处理是一种简单、有效的将图像划分为前景和背景的方法。图像分割通常用于根据对象的某些属性(例如,颜色、边缘或直方图)从背景中提取对象。最简单的阈值方法会利用预定义常数(阈值),如果像素强度小于阈值,则用黑色像素替换,如果像素强度大于阈值,则用白色像素替换。OpenCV 提供了 cv2.threshold()
函数来对图像进行阈值处理。
为了测试 cv2.threshold()
函数,首次创建测试图像,其包含一些填充了不同的灰色调的大小相同的区域,利用 build_sample_image()
函数构建此测试图像:
def build_sample_image():
"""创建填充了不同的灰色调的大小相同的区域,作为测试图像"""
# 定义不同区域
tones = np.arange(start=50, stop=300, step=50)
# 初始化
result = np.zeros((50, 50, 3), dtype="uint8")
for tone in tones:
img = np.ones((50, 50, 3), dtype="uint8") * tone
# 沿轴连接数组
result = np.concatenate((result, img), axis=1)
return result
接下来将使用不同的预定义阈值: 0 、 50 、 100 、 150 、 200 和 250 调用 cv2.threshold()
函数,以查看不同预定义阈值对阈值图像影响。例如,使用阈值 thresh = 50
对图像进行阈值处理:
ret1, thresh1 = cv2.threshold(gray_image, 50, 255, cv2.THRESH_BINARY)
其中,thresh1
是仅包含黑白色的阈值图像。源图像 gray_image
中灰色强度小于 50 的像素为黑色,强度大于 50 的像素为白色。
使用多个不同阈值对图像进行阈值处理:
# 可视化函数
def show_img_with_matplotlib(color_img, title, pos):
img_RGB = color_img[:, :, ::-1]
ax = plt.subplot(7, 1, pos)
plt.imshow(img_RGB)
plt.title(title, fontsize=8)
plt.axis('off')
# 使用 build_sample_image() 函数构建测试图像
image = build_sample_image()
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
for i in range(6):
# 使用多个不同阈值对图像进行阈值处理
ret, thresh = cv2.threshold(gray_image, 50 * i, 255, cv2.THRESH_BINARY)
# 可视化
show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(i * 50), i + 2)
# 可视化测试图像
show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img with tones of gray - left to right: (0,50,100,150,200,250)", 1)
# 图像进行阈值处理后,常见的输出是黑白图像
# 因此,为了更好的可视化效果,修改背景颜色
fig.patch.set_facecolor('silver')
plt.show()
从上图可以看出,根据阈值和样本图像灰度值的不同,阈值处理后生成的黑白图像的变化情况。
简单的阈值技术
上一节中,我们已经简单介绍过了 OpenCV
中提供的简单阈值处理函数——cv2.threshold()
,该函数用法如下:
cv2.threshold(src, thresh, maxval, type, dst=None) -> retval, dst
cv2.threshold()
函数对 src
输入数组(可以为单通道或多通道图像)应用预定义常数 thresh
设置的阈值;type
参数用于设置阈值类型,阈值类型的可选值如下:cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
、cv2.THRESH_TOZERO_INV
、cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
。
maxval
参数用于设置最大值,其仅在阈值类型为 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
时有效;需要注意的是,在阈值类型为 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
时,输入图像 src
应为为单通道。
阈值类型
为了更好的了解阈值操作的不同类型,接下来给出每种阈值类型的具体公式。符号说明:src
是源(原始)图像,dst
对应于阈值化后的目标(结果)图像,因此,src(x, y)
对应于源图像像素 (x, y)
处的强度,而 dst(x, y)
对应于目标图像像素 (x, y)
处的强度。
阈值类型 cv2.THRESH_BINARY
公式如下:
其表示,如果像素 src(x, y)
的强度高于 thresh
,则目标图像像素强度 dst(x,y)
将被设为 maxval
;否则,设为 0
。
阈值类型 cv2.THRESH_BINARY_INV
公式如下:
其表示,如果像素 src(x, y)
的强度高于 thresh
,则目标图像像素强度 dst(x,y)
将被设为 0
;否则,设为 maxval
。
阈值类型 cv2.THRESH_TRUNC
公式如下:
其表示,如果像素 src(x, y)
的强度高于 thresh
,则目标图像像素强度设置为 threshold
;否则,设为 src(x, y)
。
阈值类型 cv2.THRESH_TOZERO
公式如下:
其表示,如果像素 src(x, y)
的强度高于 thresh
,则目标图像像素值将设置为 src(x, y)
;否则,设置为 0
。
阈值类型 cv2.THRESH_TOZERO_INV
公式如下:
其表示,如果像素 src(x, y)
的强度大于 thresh
,则目标图像像素值将设置为 0
;否则,设置为 src(x, y)
。
而 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
属于特殊的阈值类型,它们可以与上述阈值类型( cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
和 cv2.THRESH_TOZERO_INV
)进行组合。组合后,阈值处理函数 cv2.threshold()
将只能处理单通道图像,且计算并返回最佳阈值,而非指定阈值。
接下来使用不同阈值类型对同样的测试图像进行阈值处理,观察不同阈值处理效果:
ret1, thresh1 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY)
ret3, thresh3 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY_INV)
ret4, thresh4 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY_INV)
ret5, thresh5 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TRUNC)
ret6, thresh6 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TOZERO)
ret7, thresh7 = cv2.threshold(gray_image,100,255, cv2.THRESH_TOZERO_INV)
# 可视化
show_img_with_matplotlib(cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 255", 2)
show_img_with_matplotlib(cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 220", 3)
show_img_with_matplotlib(cv2.cvtColor(thresh3, cv2.COLOR_GRAY2BGR), "THRESH_BINARY_INV - thresh = 100", 4)
# 其他图像可视化方法类似,不再赘述
# ...
如上图所示,maxval
参数仅在使用 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
阈值类型时有效,上例中将 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
类型的 maxval
值设置为 255
及 220
,以便查看阈值图像在这两种情况下的变化情况。
简单阈值技术的实际应用
了解 cv2.threshold()
不同参数的工作原理后,我们将 cv2.threshold()
应用于真实图像,并使用不同的阈值:
# 加载图像
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 绘制灰度图像
show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img", 1)
# 使用不同的阈值调用 cv2.threshold() 并进行可视化
for i in range(8):
ret, thresh = cv2.threshold(gray_image, 130 + i * 10, 255, cv2.THRESH_BINARY)
show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(130 + i * 10), i + 2)
来源:https://juejin.cn/post/7061777615996059679


猜你喜欢
- 自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换行的方法对于div,
- HTTP、HTTPS协议下session共享解决cookie失效 的办法:(也许不是最好的,但是实用)原理就是把session id设置到本
- layer弹出窗口在弹出时指定了area,弹出后,如果当前页面(iframe)大小比弹出的窗口小,那么就会出现无法操作弹出窗口的尴尬情况。如
- 关于权限管理的思考最近用laravel设计后台,后台需要有个权限管理。权限管理实质上分为两个部分,首先是认证,然后是权限。认证部分非常好做,
- 今天发现 WordPress 连接不上数据库,登录 window server 服务器查看,所有服务均运行正常。使用 root 账号登录 m
- 前言随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了windows下YOLO的环境搭建流程。一
- 本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。比如表结构数据如下:Table:TreeID Name P
- 删除字符串最后一个字符的方法1.使用strip()方法删除最后一个字符Python strip() 方法用于移除字符串头尾指定的字符(默认为
- 学习vue和nodejs的过程当中,涉及到了axios,今天为了测试,写了get和post两个方法来跟node服务端交互,结果因为heade
- 本文实例为大家分享了Python画圣诞树的具体代码,供大家参考,具体内容如下源代码from turtle import *import ra
- Python 登录网站详解及实例对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看。这是因为 HTTP 协议是一个无状态
- 在编程时你一定碰到过时间触发的事件,在VB中有timer控件,而asp中没有,假如你要不停地查询数据库来等待一个返回结果的话,我想你一定知道
- 打开文件操作文件1打开文件时,需要指定文件路径和打开方式打开方式:r:只读w:只写a:追加“+”表示可以同时读写某个文件r+:读写w+:写读
- 安装MySQL,留作笔记,不知是否能够安装成功,试试吧。1、 进入mysql官网 地址<下载完毕,接下来就是安装了2、安装找到安装包,
- 一、工厂模式(Factory Pattern)工厂模式(Factory Pattern),提供了一种实例化(创建)对象的最佳方式。在工厂模式
- 本文实例为大家分享了python获取地震信息微信实时推送的具体代码,供大家参考,具体内容如下import requests,timefrom
- 使用 Django自带的 auth 用户验证功能,编写函数,使用 is_authenticated 检查用户是否登录,结果报错:TypeEr
- Bootstrap是网上最流行的前端开发框架. 除了用它,我不知道还有其他更快的方法去构建一个响应式的网站。但是自从我向网页添加动态功能的工
- [1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象[2]特性:[2.1]贪婪性,匹配最长的[2.
- 我们都知道,Numpy 是 Python 环境下的扩展程序库,支持大量的维度数组和矩阵运算;Pandas 也是 Python 环境下的数据操