当前位置: 首页 > news >正文

opencv二值化实验

二值化实验

  • 1二值化说明
  • 2 阈值法(THRESH_BINARY)
  • 3.反阈值法(THRESH_BINARY_INV)
  • 4截断阈值法(THRESH_TRUNC)
  • 5 低阈值零处理(THRESH_TOZERO)
  • 6 超阈值零处理(THRESH_TOZERO_INV)
  • 7 OTSU阈值法
  • 8 自适应二值化
    • 8.1取均值(ADAPTIVE_THRESH_GAUSSIAN_MEAN_C)
    • 8.2加权求和(ADAPTIVE_THRESH_GAUSSIAN_C)

1二值化说明

二值化,顾名思义,就是将某张图像的所有像素改成只有两种值之一其操作的图像也必须是灰度图。也就是说,二值化的过程,就是将一张灰度图上的像素根据某种规则修改为0和maxval(maxval表示最大值,一般为255,显示白色)两种像素值,使图像呈现黑白的效果,能够帮助我们更好地分析图像中的形状、边缘和轮廓等特征。

在本实验中,使用了六种不同的方式来对灰度图进行二值化。

分别为:

  • 1.阈值法(THRESH_BINARY)
  • 2.反阈值法(THRESH_BINARY_INV)
    1. 截断阈值法(THRESH_TRUNC)
    1. 低阈值零处理(THRESH_TOZERO)
    1. 超阈值零处理(THRESH_TOZERO_INV)
    1. OTSU阈值法

2 阈值法(THRESH_BINARY)

阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(黑),大于阈值的像素就被设置为maxval。
在这里插入图片描述
代码如下:

'''阈值法'''#二值化实验必须是在灰度图的基础上进行二值处理#直接读取灰度图img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#进行二值处理使用cv2.threshold()方法返回值为元组,第二个元素才是想要的二值图_,img_b=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#小于127的像素点变为127,超过127的像素点变为255cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述

threshold参数说明:

  • 参数1:是要做二值化处理的灰度图
  • 参数2:设置的阈值,并且是小于这个值的像素点变为这个值
  • 参数3 表示超过阈值的像素点的值变为参数3的这个值
  • 参数4:表示要进行二值化处理的类型

注意:

  • 二值化实验的进行处理的原图必须是灰度图
  • threshold的返回值为两个值的元组,第二个值才是处理完后的二值图
  • 二值图不是只有0和255的组合,只要是任意两个0-255的组合都可以

3.反阈值法(THRESH_BINARY_INV)

顾名思义,就是与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval。

在这里插入图片描述
代码如下:

 '''反阈值法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#小于127的像素点变为255,超过127的像素点变为127_,img_b=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述
反阈值法就是跟阈值法相反,低于阈值的设置为另一个值,超过阈值的设置为阈值的 值

4截断阈值法(THRESH_TRUNC)

截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。
在这里插入图片描述
代码如下:

  '''截断阈值法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#超过阈值的像素点设置为阈值,没有超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,150,255,cv2.THRESH_TRUNC)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述
注意:

  • 截断阈值法(cv2.THRESH_TRUNC)和灰度图相似有多种颜色
  • 超过阈值的像素点设置为阈值,没有超过的不变,这里的参数3只是作为一个threshold的参数,在这个方法中不起作用

5 低阈值零处理(THRESH_TOZERO)

低阈值零处理,字面意思,就是像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。
在这里插入图片描述
代码如下:

 '''低阈值零处理法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#小于或等于阈值的像素点设置为0,超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述
注意:
-低阈值零处理(cv2.THRESH_TOZERO) 小于或等于阈值的像素点设置为0,超过的不变,这里的参数3只是作为一个threshold的参数,在这个方法中不起作用

6 超阈值零处理(THRESH_TOZERO_INV)

超阈值零处理就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于等于阈值的部分不变。

和低阈值零处理(cv2.THRESH_TOZERO)方法相反
在这里插入图片描述
代码如下:

 '''超阈值零处理'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#大于或等于阈值的像素点设置为0,没超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述

以上介绍的二值化方法都需要手动设置阈值,但是在不同的环境下,摄像头拍摄的图像可能存在差异,导致手动设置的阈值并不适用于所有图像,这可能会导致二值化效果不理想。因此,我们需要一种能自动计算每张图片阈值的二值化方法,能够根据每张图像的特点 自动计算出适合该图像的二值化阈值,从而达到更好的二值化效果。这种二值化方法可以在不同环境下适用,提高图像处理的准确性和鲁棒性。

7 OTSU阈值法

OTSU算法的具体实现

通过OTSU算法得到阈值之后,就可以结合上面的方法根据该阈值进行二值化,在本实验中**有THRESH_OTSU和THRESH_INV_OTSU两种方法,**就是在计算出阈值后结合了阈值法和反阈值法。

注意:使用OTSU算法计算阈值时,组件中的thresh参数将不再有任何作用。
在这里插入图片描述
代码如下:

  '''OSTU阈值处理'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#127不使用,超过阈值的设置为255  _,img_b=cv2.threshold(img,127,255,cv2.THRESH_OTSU)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述

8 自适应二值化

与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。

自适应二值化方法会对图像中的所有像素点计算其各自的阈值,这样能够更好的保留图片里的一些信息。自适应二值化组件内容如下图所示:
在这里插入图片描述
方法的格式如下:

cv2.adaptiveThreshold(image_np_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)

其中各个参数的含义如下:

maxval:最大阈值,一般为255

adaptiveMethod:小区域阈值的计算方式:

ADAPTIVE_THRESH_MEAN_C:小区域内取均值

ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核

thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法

blockSize:选取的小区域的面积,如7就是7*7的小块。

c:最终阈值等于小区域计算出的阈值再减去此值

8.1取均值(ADAPTIVE_THRESH_GAUSSIAN_MEAN_C)

假如我们使用的小区域是3*3的,那么就会从图片的左上角开始(也就是像素值为162的地方)计算其邻域内的平均值,如果处于边缘地区就会对边界进行填充,填充值就是边界的像素点,如下图所示:
在这里插入图片描述
代码如下:

'''自适应阈值法——取均值'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#127不使用,超过阈值的设置为255  img_b=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2)#3表示一个正方形的边长(也称为卷积核)必须是奇数 2是一个常数cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)

在这里插入图片描述

注意:
cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2)

  • 参数2: 255: 输出图像的最大值。在二值化后,超过自适应阈值的像素会被设置为该最大值,通常为255表示白色;未超过阈值的像素将被设置为0,表示黑色。
  • 参数3 :表示自适应二值法的类型
  • 参数4:表示使用阈值法的类型
  • 参数5:表示一个卷积核,表示计算每个像素阈值时所考虑的7x7邻域大小(正方形区域的宽度和高度),其值必须是奇数。
  • 参数6:是一个最终阈值减去的常数

8.2加权求和(ADAPTIVE_THRESH_GAUSSIAN_C)

加权求和的原理
首先还是对边界进行填充,然后计算原图中的左上角(也就是162像素值的位置)的二值化阈值,其计算过程如上图所示,再然后根据选择的二值化方法对左上角的像素点进行二值化,之后核向右继续计算第二个像素点的阈值,第三个像素点的阈值…直到右下角(也就是155像素值的位置)为止。

当核的大小不同时,仅仅是核的参数会发生变化,计算过程与此是一样的。
在这里插入图片描述
代码如下:

 '''自适应二值化——加权值(高斯求和)'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)img_b=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2)#3表示一个正方形的边长(也称为卷积核)必须是奇数 2是一个常数cv2.imshow("img_b",img_b)cv2.imshow("img",img)cv2.waitKey(0)

在这里插入图片描述

相关文章:

  • 解决7穴连接器的信号完整性问题
  • Linux——管道
  • OpenCV---图像基础
  • 4.14-4.15学习总结 IO流:缓冲流+转换流+序列化流+打印流+压缩流+Commons—io工具包+Hutool工具包
  • ZUS6000在无线充电测试上的应用
  • Java二分查找——数据结构篇
  • linux 内核 static-key机制分析
  • 数据结构(三)---单向循环链表
  • 【Pandas】pandas DataFrame itertuples
  • Debian服务器挂载外部存储设备的完整指南
  • Android 项目配置文件解释
  • 【差分隐私相关概念】瑞丽差分隐私(RDP)命题2
  • 数字IC设计-VCS和Verdi的使用
  • RFID 赋能部队智能物联网仓储建设:打造信息化高效解决方案
  • 电磁兼容概述-标准梳理
  • 在IDEA里面建立maven项目(便于java web使用)
  • 什么是时间复杂度和空间复杂度?
  • 抖音ai无人直播间助手场控软件
  • Java实时监控常用指令、工具
  • 大数据学习笔记
  • 光线传媒:正与部分重点地区洽谈主题乐园合作,首款3A游戏预计三年左右推出
  • 帕力旦·吐尔逊已任喀什大学党委副书记、校长
  • 中国天主教组织发唁电对教皇去世表示哀悼
  • 印度加大应对力度,吊销所有巴基斯坦公民签证
  • 小马智行彭军:今年是Robotaxi量产元年,有望3年后盈亏平衡
  • 神二十发射取得圆满成功