第6章-阈值处理

第六章-阈值处理

    • one. threshold函数:
      • 1. 二值化阈值处理(cv2.THRESH_BINARY):
      • 2. 反二值化阈值处理(cv2.THRESH_BINARY_INV)
      • 3. 截断阈值化处理(cv2.THRESH_TRUNC)
      • 4. 超阈值零处理(cv2.THRESH_TOZERO_INV)
      • 5.低阈值零处理(cv2.THRESH_TOZERO)
    • two.自适应阈值处理:
    • three. Otsu处理:

阈值处理是指剔除图像内像素值高于一定值或者低于一定值的像素点。 例如,设定阈值为127,然后:

  • 将图像内所有像素值大于127的像素点的值设为255。
  • 将图像内所有像素值小于或等于127的像素点的值设为0。

通过上述方式能够得到一幅二值图像,如图所示,按照上述阈值处理方式将一幅灰度图像处理为一幅二值图像,有效地实现了前景和背景的分离。

image-20211013111330415

OpenCV提供了函数cv2.threshold()和函数cv2.adaptiveThreshold(),用于实现阈值处理。

one. threshold函数:

OpenCV3.0使用cv2.threshold()函数进行阈值化处理,该函数的语法格式是:

  • retval, dst = cv2.threshold(src, thresh, maxval, type)

    • retval:代表返回的阈值。
    • dst:代表阈值分割结果图像,与原始图像具有相同的大小和类型。
    • src:代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值。
    • thresh:代表要设定的阈值。
    • maxval:代表当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值。
    • type代表阈值分割的类型,具体类型值如表所示:

    image-20211013103741015

上述公式相对抽象,可以可视化为:

image-20211013103854712

1. 二值化阈值处理(cv2.THRESH_BINARY):

二值化阈值处理会将原始图像处理为仅有两个值的二值图像,如图所示。其针对像素点的处理方式为:

  • 对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值。
  • 对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为0。

image-20211013104222845

用表达式表达为:

dst(x,y)={maxval,src(x,y)>thresh0,其他情况dst(x, y) = \begin{cases} maxval, \quad src(x, y) >thresh \\ 0, \quad 其他情况\end{cases}dst(x,y)={maxval,src(x,y)>thresh0, ,thresh代表特定阈值。

在8位图像中,最大值是255。因此,在对8位灰度图像进行二值化时,如果将阈值设定为127,那么:

  • 所有大于127的像素点会被处理为255。
  • 其余值会被处理为0。

为了方便,在后续说明中,我们都以8位图像为例,即像素值最大值为255。

例如:使用cv2.threshold()函数对数组进行二值化阈值处理。

import cv2
import numpy as npimg = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
t, rst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
print('img=\n', img)
print('t', t)
print('rst=\n', rst)# 输出结果
img=[[138 241 156  43   1][205 128 223 143 236][ 61  34 106 233 196][180  81 192 210 107]]
t 127.0
rst=[[255 255 255   0   0][255 255 255 255 255][  0   0   0 255 255][255   0 255 255   0]]

2. 反二值化阈值处理(cv2.THRESH_BINARY_INV)

反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:

  • 对于灰度值大于阈值的像素点,将其值设定为0。
  • 对于灰度值小于或等于阈值的像素点,将其值设定为255。

image-20211013111532792

用表达式表达为:

dst(x,y)={0,src(x,y)>threshmaxval,其他情况dst(x, y) = \begin{cases} 0, \quad src(x, y) >thresh \\ maxval, \quad 其他情况\end{cases}dst(x,y)={0,src(x,y)>threshmaxval, ,thresh代表特定阈值。

例如:使用cv2.threshold()函数对数组进行反二值化阈值处理。

import cv2
import numpy as npimg = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
t, rst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
print('img=\n', img)
print('t', t)
print('rst=\n', rst)# 输出结果
img=[[ 22 209 106 193  56][218 252 109 166  47][141 247  76 247 102][ 42   4 217 110 199]]
t 127.0
rst=[[255   0 255   0 255][  0   0 255   0 255][  0   0 255   0 255][255 255   0 255   0]]

3. 截断阈值化处理(cv2.THRESH_TRUNC)

截断阈值化处理会将图像中大于阈值的像素点的值处理为设定的阈值,小于或等于该阈值的像素点的值保持不变。如示意图所示:

image-20211013112247076

例如,阈值选取为127,则截断阈值化处理时:

  • 对于像素值大于127的像素点,其像素值将被设定为127。
  • 对于像素值小于或等于127的像素点,其像素值将保持改变。

如果使用表达式表示,那么其目标值的产生规则为:

dst(x,y)={thresh,src(x,y)>thresh保持不变,其他情况dst(x, y) = \begin{cases} thresh, \quad src(x, y) >thresh \\ 保持不变, \quad 其他情况\end{cases}dst(x,y)={thresh,src(x,y)>thresh, ,thresh代表特定阈值。

import cv2
import numpy as npimg = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
t, rst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
print('img=\n', img)
print('t=\n', t)
print('rst=\n', rst)# 输出结果
img=[[ 75 169  58 247 235][ 95  95 139 129 102][ 93  86  97 140 200][108  64 250  33 171]]
t=127.0
rst=[[ 75 127  58 127 127][ 95  95 127 127 102][ 93  86  97 127 127][108  64 127  33 127]]

4. 超阈值零处理(cv2.THRESH_TOZERO_INV)

超阈值零处理会将图像中大于阈值的像素点的值处理为0,小于或等于该阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:

  • 对于像素值大于阈值的像素点,其像素值将被处理为0。
  • 对于像素值小于或等于阈值的像素点,其像素值将保持不变。

超阈值零处理的工作原理如图所示。

image-20211013113055544

例如,阈值选取为127,则:

  • 对于像素值大于127的像素点,其值将被设定为0。
  • 对于像素值小于或等于127的像素点,其值将保持改变。

如果使用表达式表示,其目标值的产生规则为:

dst(x,y)={0,src(x,y)>threshsrc(x,y),其他情况dst(x, y) = \begin{cases} 0, \quad src(x, y) >thresh \\ src(x, y), \quad 其他情况\end{cases}dst(x,y)={0,src(x,y)>threshsrc(x,y), ,thresh代表特定阈值。

import cv2
import numpy as npimg = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
t, rst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
print('img=\n', img)
print('t=\n', t)
print('rst=\n', rst)# 输出结果
img=[[101  38  87  65 182][126 143  54  27 236][233 150 144  30 206][182 174 185 212 115]]
t=127.0
rst=[[101  38  87  65   0][126   0  54  27   0][  0   0   0  30   0][  0   0   0   0 115]]

5.低阈值零处理(cv2.THRESH_TOZERO)

低阈值零处理会将图像中小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。即先选定一个阈值,然后对图像做如下处理:

  • 对于像素值大于阈值的像素点,其值将保持不变。
  • 对于像素值小于或等于阈值的像素点,其值将被处理为0。

image-20211013114019979

例如,阈值选取为127,则:

  • 对于像素值大于127的像素点,其像素值将保持改变。
  • 对于像素值小于或等于127的像素点,其像素值将被设定为0。

如果使用表达式表示,其目标值的产生规则为:

dst(x,y)={src(x,y),src(x,y)>thresh0,其他情况dst(x, y) = \begin{cases} src(x, y), \quad src(x, y) >thresh \\ 0, \quad 其他情况\end{cases}dst(x,y)={src(x,y),src(x,y)>thresh0, ,thresh代表特定阈值。

import cv2
import numpy as npimg = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
t, rst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
print('img=\n', img)
print('t=\n', t)
print('rst=\n', rst)# 输出结果
img=[[  2 202  44   8  95][130 187  52 214 168][153 169 199 224 155][  4 232  38 244  97]]
t=127.0
rst=[[  0 202   0   0   0][130 187   0 214 168][153 169 199 224 155][  0 232   0 244   0]]

two.自适应阈值处理:

​ 对于色彩均衡的图像,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清晰有效的阈值分割结果图像。

​ 有一种改进的阈值处理技术,其使用动态变化的阈值完成对图像的阈值处理,这种技术被称为自适应阈值处理。在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。

OpenCV提供了函数cv2.adaptiveThreshold()来实现自适应阈值处理,该函数的语法格式为:

  • dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
    • dst:代表自适应阈值处理结果。
    • src:代表要进行处理的原始图像。需要注意的是,该图像必须是8位单通道的图像。
    • maxValue:代表最大值。
    • adaptiveMethod:代表自适应方法。
    • thresholdType: 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
    • blockSize:代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。
    • C:是常量。

​ 函数cv2.adaptiveThreshold()根据参数adaptiveMethod来确定自适应阈值的计算方法,函数包含cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法。这两种方法都是逐个像素地计算自适应阈值,自适应阈值等于每个像素由参数blockSize所指定邻域的加权平均值减去常量C。两种不同的方法在计算邻域的加权平均值时所采用的方式不同:

  • cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重值是一致的。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。
import cv2img = cv2.imread('../sugar.tiff', 0)
print(img)
t1, thd = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
athdMEAN = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 3)
athdGAUS = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 3)
cv2.imshow('img', img)
cv2.imshow('thd', thd)
cv2.imshow('athdMEAN', athdMEAN)
cv2.imshow('athdGAUS', athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()

image-20211013153325121

​ 通过对比普通的阈值处理与自适应阈值处理可以发现,自适应阈值处理保留了更多的细节信息。在一些极端情况下,普通的阈值处理会丢失大量的信息,而自适应阈值处理可以得到效果更好的二值图像。

three. Otsu处理:

​ 在使用函数cv2.threshold()进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据。通常情况下处理的图像都是色彩均衡的,这时直接将阈值设置为127是比较合适的。但是,有时图像灰度级是分布不均衡的,如果此时还将阈值设置为127,那么阈值处理的结果就是失败的。例如,有一个图像img,里面的像素值为:

image-20211013155455573

此时,若用127作为阈值,则阈值处理结果为:

image-20211013155549062

很显然,这不是我们想要的结果。我们可以观察到,对于img,如果以阈值125进行分割,可以得到较好的结果:

image-20211013155632125

​ 但是,实际处理的图像往往是很复杂的,不太可能像上述img那样,一眼就观察出最合适的阈值。如果一个个去尝试,工作量无疑是巨大的。

Otsu方法能够根据当前图像给出最佳的类间分割阈值。简而言之,Otsu方法会遍历所有可能阈值,从而找到最佳的阈值。

在 OpenCV 中,通过在函数 cv2.threshold()中对参数 type 的类型多传递一个参数“cv2.THRESH_OTSU”,即可实现Otsu方式的阈值分割。

​ 需要说明的是,在使用Otsu方法时,要把阈值设为0。此时的函数cv2.threshold()会自动寻找最优阈值,并将该阈值返回。例如,下面的语句让函数cv2.threshold()采用Otsu方法进行阈值分割:

  • t, otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

与普通阈值分割的不同之处在于:

  • 参数type增加了一个参数值“cv2.THRESH_OTSU”。
  • 设定的阈值为0。
  • 返回值t是Otsu方法计算得到并使用的最优阈值。

例1:

import cv2
import numpy as npimg = np.zeros((5, 5), dtype=np.uint8)
img[0:6, 0:6] = 123
img[2:6, 2:6] = 126
t1, thd = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
t2, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)print('img=\n', img)
print('thd=\n', thd)
print('otsu=\n', otsu)# 输出结果
img=[[123 123 123 123 123][123 123 123 123 123][123 123 126 126 126][123 123 126 126 126][123 123 126 126 126]]
thd=[[0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0]]
otsu=[[  0   0   0   0   0][  0   0   0   0   0][  0   0 255 255 255][  0   0 255 255 255][  0   0 255 255 255]]

例2:

import cv2img = cv2.imread('../lena.bmp', 0)
t1, thd = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY)
t2, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('img', img)
cv2.imshow('thd', thd)
cv2.imshow('otus', otsu)
cv2.waitKey()
cv2.destroyAllWindows()

image-20211013161802362

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

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

相关文章

【树莓派学习笔记】二、(无屏幕)SSH远程登录、图形界面及系统配置

目录确定树莓派LAN IP使用PuTTY登陆带图形界面的远程登陆Xming方案VNC Server 方案系统配置换源(可选)备份原文件查询系统版本编辑sources.list文件同步更新源更新软件包重启树莓派固定LAN IP平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 确定…

Centos7完全分布式搭建Hadoop2.7.3

(一)软件准备 1,hadoop-2.7.3.tar.gz(包) 2,三台机器装有cetos7的机子 (二)安装步骤 1,给每台机子配相同的用户 进入root : su root 创建用户s: useradd s 修改用户密码:passwd s 2…

第7章:图像的平滑处理

第7章:图像的平滑处理一、均值滤波:二、方框滤波:三、高斯滤波:四、中值滤波五、双边滤波:六、2D卷积​ 图像的平滑处理是在尽量图像原有信息的情况下,过滤掉图像内部的噪声。由于图像平滑处理的同时通常伴…

【树莓派学习笔记】三、点亮一个LED灯(C语言 - WiringPi、Python - RPi.GPIO/GPIO Zero、bash脚本)

目录C语言WiringPiPythonRPi.GPIOGPIO Zerobash脚本平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 若GPIO输出为3.3V 采用压降为1.7V的红色LED灯 设工作电流为15mA,则限流电阻取≥(3.3 - 1.7)/0.015 106.67欧较为安全。 C语言 Wi…

OpenStack 之Nova添加扩展API流程,附带资源的查找功能

例子中涉及到SQLAlchemy 得相关操作,可以参考 上一随笔 Openstack 中规定,扩展openstack得api有两种方式 创建新的WSGI 资源扩展原有得WSGI资源得控制器(我得理解是,接受到API请求后,具体得响应逻辑)这两种…

第8章:形态学操作

第8章:形态学操作one. 腐蚀操作:two. 膨胀:three. 通用形态学函数:four. 开运算:five. 闭运算:six. 形态学梯度运算:seven. 礼帽运算:eight. 黑帽运算:night. 核函数&…

【树莓派学习笔记】四、OpenCV的安装与卸载

目录安装修改host以连接上Github测试IP修改树莓派的hosts安装各种依赖包安装OpenCV只安装核心模块安装核心模块和opencv_contribC Opencv 测试编写测试源码编译测试卸载平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf 安装 修改host以连接上Git…

第9章:图像梯度

第9章:图像梯度one. Sobel理论基础1. 计算水平方向偏导数的近似值2. 计算垂直方向偏导数的近似值two. Sobel算子及函数的使用:1. 函数语法:2. 对像素取绝对值:3. 方向:three. Scharr 算子及函数使用:1. 函数语法:2. 实…

【树莓派学习笔记】五、处理、自动重命名并另存为图片

目录编写源码编译测试平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 编写源码 所用源码修改自【机器视觉学习笔记】最近邻插值实现图片任意角度旋转&#xff08;C&#xff09; 在合适的地方编写源码 nano main.cpp#include <opencv2/openc…

第10章:Canny图像边缘检测

第10章&#xff1a;Canny图像边缘检测一、Canny边缘检测的基础&#xff1a;1. 应用高斯滤波去除图像噪声&#xff1a;2. 计算梯度3.非极大值抑制4. 应用双阈值确定边缘&#xff1a;二、Canny函数使用&#xff1a;​ Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。19…

【树莓派学习笔记】六、启用摄像头、实时视频、录像和截图

目录安装摄像头配置使用luvcview平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 安装摄像头 配置 sudo raspi-config重启后 cd /dev ls可看到新增了video0设备 使用luvcview 安装 sudo apt-get install luvcview查看摄像设备详细信息 luv…

Android各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解

2019独角兽企业重金招聘Python工程师标准>>> VGA&#xff1a;Video Graphics Array&#xff0c;即&#xff1a;显示绘图矩阵&#xff0c;相当于640480 像素&#xff1b;HVGA&#xff1a;Half-size VGA&#xff0c;即&#xff1a;VGA的一半&#xff0c;分辨率为48032…

敏捷合同-摘自网络

敏捷软件开发实践的文化中存在着一个断层&#xff0c;该断层同样体现在许多敏捷团队中。这个断层就是业务分析人员在敏捷项目中的角色——谁来担任这个角色&#xff1f;它的作用 和价值是什么&#xff1f;它又是如何发生改变的&#xff1f;这种情况的潜台词&#xff08;其实我曾…

第11章:图像金字塔

第11章&#xff1a;图像金字塔一、理论基础&#xff1a;1. 向下采样&#xff1a;2. 向上采样&#xff1a;二、pyrDown函数使用&#xff1a;三、pyrUp函数及使用&#xff1a;四、采样可逆性研究五、拉普拉斯金字塔1. 定义&#xff1a;2. 应用&#xff1a;什么是图像金子塔&#…

【树莓派学习笔记】七、(免费)内网穿透将树莓派作为服务器管理网站

目录nginx安装开机自启动测试查看nginx安装路径查看配置文件路径(测试用)修改index.nginx-debian.html内网穿透免费方案ngrok原版方案下载ngrok连接账户开启内网穿透httpSSH网云穿方案开通隧道下载开启内网穿透开机自启动花生壳方案下载和安装添加内网穿透映射测试平台&#xf…

第12章:图像轮廓

第12章&#xff1a;图像轮廓一、查找并绘制轮廓&#xff1a;1. 查找图像轮廓&#xff1a;2. 绘制图像轮廓&#xff1a;3. 绘制轮廓实例&#xff1a;二、矩特征1. 矩的计算&#xff1a;moments函数2. 计算轮廓面积&#xff1a;contourArea函数3. 计算轮廓长度&#xff1a;arcLen…

【树莓派学习笔记】八、两步安装VS Code (Visual Studio Code)

目录下载安装使用(可选)安装插件C/CCMake ToolsCode Runner平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 下载 官网下载 Download Visual Studio Code 发送到树莓派 安装 sudo dpkg -i Desktop/code_1.60.2-1632316275_armhf.deb 使用 在…

20 best jquery 截图

digguka, January 05, 2012jQuery Image Crop - A very useful list of tools for cropping, zooming and resizing of images. Some of plugins come with the ability to upload croped images. 转载于:https://www.cnblogs.com/yqskj/archive/2013/05/25/3098411.html

【RK3399Pro学习笔记】一、Thinker Edge R 安装系统和VNC服务

目录下载固件安装USB驱动下载烧录工具刷机第一次开机连接WifiSSH登录换源设置语言安装VNC服务平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 风火轮论坛资料网盘 提取码&#xff1a;wqbd 下载固件…

第13章:直方图处理

第13章&#xff1a;直方图处理一、直方图的含义&#xff1a;1. 普通直方图&#xff1a;2. 归一化直方图&#xff1a;二、绘制直方图&#xff1a;1. 使用Numpy绘制直方图&#xff1a;2. 使用OpenCV绘制直方图&#xff1a;3. 使用掩码绘制直方图&#xff1a;三、直方图均衡化&…