python+OpenCV图像处理(五)图像的阈值分割

图像的阈值处理

      一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

       阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。

(一)简单阈值

选取一个全局阈值,然后就把整幅图像分成非黑即白的二值图像。

函数为cv2.threshold( )

这个函数有四个参数,第一个是原图像矩阵,第二个是进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值翻转)
  • cv2.THRESH_TRUNC(得到额图像为多像素值)
  • cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值,低于阈值时不作处理)
  • cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)

这个函数返回两个值,第一个值为阈值,第二个就是阈值处理后的图像矩阵。

img = cv2.imread('4.jpg', 0)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # binary (黑白二值)
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)  # (黑白二值反转)
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)  # 得到的图像为多像素值
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)  # 高于阈值时像素设置为255,低于阈值时不作处理
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)  # 低于阈值时设置为255,高于阈值时不作处理print(ret)cv2.imshow('thresh1', thresh1)
cv2.imshow('thresh2', thresh2)
cv2.imshow('thresh3', thresh3)
cv2.imshow('thresh4', thresh4)
cv2.imshow('thresh5', thresh5)
cv2.imshow('grey-map', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


(二)自适应阈值

一中的简单阈值是一种全局性的阈值,只需要设定一个阈值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过设定一个区域大小,比较这个点与区域大小里面像素点 的平均值(或者其他特征)的大小关系确定这个像素点的情况。使用的函数为:

# 第一个参数为原始图像矩阵,第二个参数为像素值上限,第三个是自适应方法(adaptive method):
#                                              -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
#                                              -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和,权重为一个高斯窗口
# 第四个值的赋值方法:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# 第五个Block size:设定领域大小(一个正方形的领域)
# 第六个参数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)

# 这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图都用一个阈值

img = cv2.imread('4.jpg', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 第一个参数为原始图像矩阵,第二个参数为像素值上限,第三个是自适应方法(adaptive method):
#                                              -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
#                                              -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和,权重为一个高斯窗口
# 第四个值的赋值方法:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# 第五个Block size:设定领域大小(一个正方形的领域)
# 第六个参数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)
# 这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图都用一个阈值
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
cv2.imshow('th3', th3)
cv2.imshow('th4', th4)
cv2.waitKey(0)
cv2.destroyAllWindows()


对于第五个参数的窗口越来越小时,发现得到的图像越来越细了,可以设想,如果把窗口设置的足够大的话(不能超过图像大小),那么得到的结果可能就和第二幅图像的相同了。

(三)Otsu's二值化

cv2.threshold( )函数有两个返回值,一个是阈值,第二个是处理后的图像矩阵。

前面对于阈值的设定上,我们选择的阈值都是127,在实际情况中,有的图像阈值不是127得到的图像效果更好。那么这里就需要算法自己去寻找一个阈值,而Otsu's就可以自己找到一个认为最好的阈值。并且Otsu's非常适合于图像灰度直方图(只有灰度图像才有)具有双峰的情况。他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。那么经过Otsu's得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsu's方法会产生一个阈值,那么函数cv2.threshold( )的第二个参数(设定阈值)就是0了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU.

在下列这些程序和图片中大家会有鲜明的体会:

img = cv2.imread('2.jpg', 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 简单滤波
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # Otsu 滤波
print(ret2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
# 用于解决matplotlib中显示图像的中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.hist(img.ravel(), 256)
plt.title('灰度直方图')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么有些softmax公式需要减去输入中的最大值

我们都知道softmax公式如下: 但有些softmax公式是先将每个x_i减去x中的最大值再代入以上公式 原因是为了防止上溢和下溢 举个例子,x[100000,100001,100002],如果直接代入上式数值会非常大,当对每个x的值减去x中的最大值后得到[-2,-1,0]&…

兰德公司报告分析 “分布式作战”对美空军兵力运用的影响

来源:兰德公司网站/图片来自互联网导读7月17日,兰德公司发布《竞争环境下的分布式作战:对美国空军兵力运用的影响》的报告,研究了美空军竞争环境下“分布式作战”的能力需求,分析了如何调整美空军当前的“兵力运用模式…

MATLAB(四)在高等数学中的应用

MATLAB在高等数学中的应用 (一)求极限 matlab中求极限的命令为 limit(expr, x, a) limit(expr, a) limit(expr) limit(expr, x, a, left) limit(expr, x, a, right) 其中,limit(expr, x, a)表示求符号表达式expr关于符号变量x趋近于a时的…

华为手机到底用了多少美国芯?外媒拆解来了

来源:iFixit、IT之家从拆解结果来看,华为Mate 20 X (5G)手机除了使用了3颗美国的芯片产品(美光内存、SkyworksWCDMA/LTE低端前端模块、Qorvo中高频段模块)以及荷兰公司恩智浦的芯片产品,其余主要部件基本上都是由华为海…

MATLAB(五)在线性代数中的应用

MATLAB在线性代数中的应用 (一)向量组的线性相关性 求列向量组A的一个最大线性无关组,可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其他列向量的坐标即为其对应向量用最大线…

全球市值最大公司的巨变:20年,已是沧海桑田

来源: 资本实验室三十年河东,三十年河西。而商业的世界,变化来得更为迅猛、激烈。就比如当我们比较1999到2019年间的全球市值最大公司,并回看二十年时,惊觉已是沧海桑田。如果以更短的五年为一个观察周期,则…

python+OpenCV图像处理(六)图像平滑与滤波

图像平滑与滤波 运用它,首先就要了解它,什么是平滑滤波? 平滑滤波是低频增强的空间域滤波技术。它的目的有两类:一类是模糊;另一类是消除噪音。空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的…

语音助手再次敲响隐私保护警钟

来源: 中国科学报智能手机内置的语音助手已成为人们生活中的亲密伙伴,大家习惯于让它完成报时、查询天气等日常任务甚至与它聊天解闷。然而,近期多家科技公司被曝光以智能语音助手录制用户谈话,再通过人工对语音做标注和反馈&…

大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战

文章目录 大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 …

python+OpenCV图像处理(七)图像的形态学处理

图像的形态学处理 数学形态学(Mathematical morphology)是一门 建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、…

站立会议08

一、会议细节 时间   2014-4-27 21:10~21:40 地点   基教102 记录人   王岸城 二,会议记录 姓名今天你做了什么明天你要做什么今天遇到了什么问题王岸城记事本删除记事本修改无法使用数据库 苏月 实现登录和注册的连接 学习数据库 连接数据库信息…

【人工智能】机器人的未来发展:从工业自动化到知识自动化

来源:王飞跃博客【导读】智能时代的核心技术将是知识自动化,因此必须从一开始就加快、加强以软件形态为主的知识机器人的研发与应用,尽快形成软件和物理形态平行互动的新型机器人系统,并以此为突破口,引发下一代智能机…

python+OpenCV图像处理(八)边缘检测

边缘检测 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘检测是特征提取中的一个研究领域。 图像边缘检测大幅度地减少了数据量,并且剔除了…

python+OpenCV图像处理(九)图像金字塔

图像金字塔 图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通…

3位物理学家获基础物理学特别突破奖

Peter van Nieuwenhuizen、Sergio Ferrara和Dan Freedman(从左至右)来源:中国科学报超引力理论是一个试图统一所有自然力的理论,在被提出40多年后,它是否能真实描述这个世界仍然悬而未决。尽管如此,该理论的…

python+OpenCV图像处理(十)霍夫变换简单图形检测

霍夫变换 霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如:直线、圆等)。最基…

Windows下安装scikit-learn

在安装sklearn前,首先确保安装了Numpy、Scipy和matplotlib 安装Numpy: 首先到https://pypi.org/project/numpy/#files下载安装包 注意文件的版本,如“numpy-1.19.1-cp36-cp36m-win_amd64.whl”表示该文件适用于widows操作系统下64位的Pyth…

华为发布面向2025十大趋势

来源:华为华为今日发布全球产业展望GIV2025,提出智能世界正在加速而来,触手可及,并预测:到2025年,智能技术将渗透到每个人、每个家庭、每个组织,全球58%的人口将能享有5G网络,14%的家…

python+OpenCV图像处理(十一)图像轮廓检测

图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测。 返回三个值:image,contours,hierarchy contours指的是轮廓本身,hierarchy是每条轮廓对应的…

python+OpenCV图像处理(十二)车牌定位中对图像的形态学组合操作处理

车牌定位中对图像的形态学组合操作处理 所谓的车牌定位,其中最关键的部分就是对图片的处理,参数的设置,并使之拥有泛化能力。 首先传入图片,在进行大规模的图片处理时,因为无法确定图片的尺寸,所以需要将…