阈值分割

  • 为得到图像中的物体信息, 必须进行图像分割, 即提取图像中与感兴趣物体相对应的区域, 而其中最简单的分割算法是图像的阈值分割。

1. 全局阈值

  • 使用过程中的五种阈值类型如上图所示

这种设定全局阈值的来进行图像分割的方法还是比较好理解的, 即设定一个阈值, 跟图像的每一个像素点的灰度值比较, 然后根据上面的五种类型的对应规则改变图中像素点的灰度值来达到图像分割的目的.

1.1 cv2.threshold()函数

ret, img = cv2.threshold (src, thresh, maxval, type)
参数 解释
src 源图片, 必须是单通道
thresh 阈值, 取值范围 0 ~ 255 / 使用 OSTU时传入0值
maxal 分配给像素值的最大值, 取值范围 0 ~ 255
type 阈值类型, 即上图阈值类型的五种类型, 具体参数见下表
type 解释
cv2.THRESH_BINARY 二进制阈值化
cv2.THRESH_BINARY_INV 反二进制阈值化
cv2.THRESH_TRUNC 截断阈值化
cv2.THRESH_TOZERO 阈值化为0
cv2.THRESH_TOZERO_INV 反阈值化为0
返回值 解释
ret 设定的阈值 / 或自动计算得到的阈值
img 阈值化后的图像

1.2 代码

import cv2def main(filename:str)->None:img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)print(img.dtype)ret, b_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)ret, b_img_inv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)ret, img_trunc = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)ret, img_tozero = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)ret, img_tozero_inv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)cv2.imshow("img", img)cv2.imshow("THRESH_BINAR", b_img)cv2.imshow("THRESH_BINAR_INV", b_img_inv)cv2.imshow("THRESH_TRUC", img_trunc)cv2.imshow("THRESH_TOZERO", img_tozero)cv2.imshow("THRESH_TOZERO_INV", img_tozero_inv)cv2.waitKey(0)cv2.destroyAllWindows()if(__name__ == "__main__"):main("img/car.png")

运行结果

1.3 自动阈值分割 Otsu二值化

在上面使用全局阈值时, 我们是手动自己设置了一个阈值, 那么如何确定这个阈值应该设置在那个范围合适, 一个做法即不停尝试不同的数值, 然后查看图片的处理结果, 而一个阈值是可以基于图像的灰度直方图来确定, 例如一副图像的灰度直方图是一副双峰图像, 一个好的阈值应该对应着两个峰之间的最小值, 而这里说的Otsu二值化就是选定阈值的其中一种方法.

opencv中使用OSTU还是用到 cv2.threshold()这个函数, 这不过在type类型这个参数需要多传入一个cv2.THRESH_OTSU, 同时还要把thresh阈值这个参数设置为0, 然后函数的返回值中的ret即根据这个算法找到的一个最优阈值。

ret, b_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)

1.4 全局阈值的不足

全局阈值仅在物体的灰度值和背景的灰度值不变的情况下效果很好, 但更多的情况是照明情况并不均匀, 故会造成使用全局阈值进行分割的结果不理想, 即使使用OSTU也不能有很好的效果(对于非双峰图像,这种方法得到的结果可能会不理想)。 即下面的第一幅和第二幅的处理结果都不是理想的情况

2. 动态阈值

对于上面的问题是由于不均匀照明造成的, 因此不能找出一个对整幅图像都适用的固定阈值, 因为整幅图像在整体虽然光照不均匀, 但在局部区域中, 如上图所示文字是要比周围更暗的, 这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果,故这种将图像与局部背景进行比较的操作被称为动态阈值分割处理.

2.1 cv2.adaptiveThreshold()函数

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数 解释
src 源图片, 必须是单通道
maxValue 分配给像素值的最大值, 取值范围 0 ~ 255
adaptiveMethod 阈值的计算方法, 两种:
1. cv2.ADAPTIVE_THRESH_MEAN_C 区域内均值
2. cv2.ADAPTIVE_THRESH_GAUSSIAN_C 区域内像素点加权和,权重为一个高斯窗口
thresholdType 阈值类型, 就是前面说的五种, 不过这里只能用 cv2.THRESH_BINARY 和 cv2.THRESH_BINARY_INV这两种类型
blockSize 规定领域大小(一个正方形的领域)
C 阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
返回值 解释
dst 阈值化后的图像

2.2 代码实现

 import cv2def main(filename:str)->None:img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)print(img.dtype)adv_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)cv2.imshow("img", adv_img)cv2.waitKey(0)cv2.imwrite("img/save3.bmp", adv_img)cv2.destroyAllWindows()if(__name__ == "__main__"):main("img/test3.png")

运行结果

可以看到效果相比于上面的全局阈值出来的效果好很多.

2.3 动态阈值应用

  • 检测某一物体的缺陷, 如印刷缺陷

图像 gr,cg_{r, c}gr,c​ 代表理想物体, 即无缺陷物体的图像, 即作为参考图像. 图像 fr,cf_{r, c}fr,c​ 为待检测图像, 可以利用下面式子找出与参考图像相比偏差太大的像素点.

S={(r,c)T∈R∣∣fr,c−gr,c∣>gabs}S = \{(r, c) ^ T \in R \,\,\, |\,\,\,|f_{r, c} - g_{r, c}| > g_{abs} \}S={(r,c)T∈R∣∣fr,c​−gr,c​∣>gabs​}

  • 前提: fr,cf_{r,c}fr,c​ 和参考图像 gr,cg_{r,c}gr,c​ 必须精确地对准, 只有这样才能避免将虚假的灰度值差错误解释为缺陷

3. Variation Model 变差模型

  • 为改善算法, 在进行阈值分割处理时, 需要考虑图像中预期的灰度值偏差。用vr,cv_{r, c}vr,c​ 表示灰度值容许偏差

S={(r,c)T∈R∣∣fr,c−gr,c∣>vr,c}S = \{(r, c) ^ T \in R \,\,\, |\,\,\,|f_{r, c} - g_{r, c}| > v_{r, c} \}S={(r,c)T∈R∣∣fr,c​−gr,c​∣>vr,c​}

通过上式中将分割出与参考图像的偏差大于容许偏差的那些像素值

书中用 mr,cm_{r, c}mr,c​ 和 sr,cs_{r,c}sr,c​ 来分别作为模型化参考图像 和 模型化参考图像的容许偏差

mr,cm_{r,c}mr,c​​ = 1n∑i=1ngr,c;i\frac{1}{n} \sum_{i = 1}^{n}g_{r,c; i}n1​∑i=1n​gr,c;i​​

sr,cs_{r,c}sr,c​​ = 1n∑i=1n(gr,c;i−mr,c)\sqrt{\frac{1}{n} \sum_{i = 1}^{n}(g_{r,c; i - m_{r,c}})}n1​∑i=1n​(gr,c;i−mr,c​​)​

变差模型需要从n幅训练图像来构造参考图像和偏差图像, 但面对只可能采集一副参考图像的情况下, 建立变差模型有两个方法:

(1) 人为创建一些偏差, 如对图像进行平移

(2) 在物体边缘处存在的相应最大偏差推导出变差模型

图像分割__阈值分割相关推荐

  1. 7.2 Python图像处理之图像分割-单阈值分割

    7.2 Python图像处理之图像分割-单阈值分割 文章目录 7.2 Python图像处理之图像分割-单阈值分割 1 算法原理 2 代码 3 效果 1 算法原理 单阈值分割算法原理: 单阈值分割是指将 ...

  2. matlab函数im2bw_图像分割之阈值分割(matlab)(转载)

    转载自:https://blog.csdn.net/weixin_39824223/article/details/112249214 matlab函数im2bw_图像分割之阈值分割(matlab) ...

  3. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

  4. 图像分割与视频分割方法

    图像分割 图像分割介绍 1.普通分割 2.语义分割 3.实例分割(instance segmentation) 传统的图像分割方法 1.基于阈值的图像分割 单阈值分割 局部阈值分割 阈值的选取 直方图 ...

  5. matlab中图像的阈值分割,基于MATLAB的图像阈值分割技术汇总

    数字图像处理课程论文 基于MATLAB的图像阈值分割技术 摘要:本文主要针对图像阈值分割做一个基于MATLAB的分析.通过双峰法,迭 代法以及OUTS法三种算法来实现图像阈值分割,并且就这三种算法做了 ...

  6. 图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割

    1.我们主要学习以下四种差分算子 Roberts算子 Sobel算子 Prewitt算子 canny算子 % Matlab图像边缘检测梯度算子–Roberts.Prewitt.Sobel.LOG.Ca ...

  7. 三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用

    一. 概述 此系统实现了常见的VTK四视图,实现了很好的CT图像分割,可以用于骨骼,头部,肺部,脂肪等分割,,并且通过三维重建实现可视化.使用了第三方库 VTK,ITK 实现分割和生不重建. 窗口分为 ...

  8. 图像分割之最大熵阈值分割

    最大熵阈值分割法和OTSU算法类似,假设将图像分为背景和前景两个部分.熵代表信息量,图像信息量越大,熵就越大,最大熵算法就是找出一个最佳阈值使得背景与前景两个部分熵之和最大. 基本原理 频率和概率 直 ...

  9. matlab中图像分割技术之二阈值分割

    1.直方图双峰法 2.最大类间方差法 3.迭代法 阈值化图像分割是一种最基本的图像分割方法,其基本原理就是选取一个或多个处于灰度图像范围之中的灰度阈值,然后将图像中各个像素的灰度值与阈值比较,并根据比 ...

最新文章

  1. 计算机科学与技术类高水平国际学术刊物,莘莘学子 | 计算机科学与技术学院本科生薛传雨在国际期刊上发表高水平学术论文...
  2. 米家摄像头固件_小米摄像头被谷歌紧急封禁!别人的设备,能看到你家现场
  3. grub中mbr的程序
  4. CoreSight介绍篇
  5. 一文读懂汇编程序的多个分段的程序--详解
  6. P1019 单词接龙 (DFS)
  7. python中如何替换某列特定数值_python 怎么根据两列值,修改对应的某列值,其中一列的为需要修改的列标题...
  8. Jest 只MOCK模块中的某个功能实现
  9. truncate python是删除文件内容吗_Python 文件 truncate() 方法
  10. shell输出毫秒_【Linux】shell: 获取时间间隔到毫秒、微秒级别
  11. EasyUI 异步Tree
  12. Docker容器kali镜像导出/导入
  13. 关于protues仿真中的OLED显示模块的使用
  14. Linux安装pyaudio
  15. 怎么把视频压缩到最小的详解
  16. C语言双人贪吃蛇游戏瘦身版本
  17. 2018逻辑思维跨年演讲之《时间的朋友》总结
  18. 阿里RocketMQ创始人首次分享出这份RocketMQ技术内木神级架构手册
  19. 2008-03-31 雨纷飞
  20. 数学英语题目理解模型记录(1)

热门文章

  1. Linux下使用中文、字体
  2. ubuntu下ufw学习
  3. Lyapunov稳定性判定总结及PI滑膜悬架仿真
  4. 一文搞懂peerDependencies
  5. 【单片机项目】制作一辆基于STM32的智能小车——概述
  6. Firefly-RK3399 Linux内核编译
  7. 第一期 微信云开发小程序介绍-生活智打卡
  8. MATLAB编程实现2FSK信号的调制与解调(非相干解调)
  9. 分辨mqtt在线与离线_最全视频下载方案,100%下载所有在线视频!
  10. 忽悠的原理和技巧观后感