图像处理

Author:louwill

Machine Learning Lab

基于阈值的图像分割因其处理直观、实现简单和计算速度快,是一种更为常用的传统图像分割算法。本文基于图像灰度阈值处理的基本原理,对全局阈值处理方法和大津法进行介绍,并用一些图像实例进行展示。

灰度阈值基础

给定灰度图像,假设该图像有目标物体和背景像素所构成,现在要从图像中提取目标物体,一个最为直接的方法就是使用一个固定阈值将目标物体像素与背景像素分开,以区域为目标物体区域,否则为背景区域。

那么什么样的图像容易用阈值法进行分割呢?简单来说,就是目标区域与背景区域具有较大图像灰度差异时,用阈值法分割效果可能会比较好。这种较大的图像灰度差异体现到图像直方图上时,就呈现处图像灰度直方图双峰的特征。如图1所示。

图1 双峰图像直方图

图像使用阈值分割方法取得好的分割效果取决于如下关键因素:

  • 直方图波峰之间的间隔;

  • 图像的噪声情况;

  • 目标物体和背景的相对尺寸;

  • 图像光源的均匀性;

  • 图像反射的均匀性。

全局阈值处理

当图像中存在较大的灰度变化时,使用全局阈值处理的方法一般就能够取得较好的效果。但我们仍希望对于一幅图像,能够找到一个相对合理的阈值来作为全局阈值。因而就有迭代的阈值图像分割算法。算法流程如下:

  • 初始化全局阈值

  • 基于分割该图像,产生两组像素:由灰度值大于的像素组成,由灰度值小于等于的像素组成

  • 对和像素分别计算平均灰度值和

  • 计算一个新的阈值

  • 重复第2到第4步,直到连续迭代中的值间的差小于一个预定的参数为止。

下面来看一个使用全局阈值的图像分割例子。直接读入图像,先基于Numpy进行灰度化和二值化处理。

img = cv2.imread('./harden.png')
# 灰度化
y = 0.2126*img[:,:,2] + 0.7152*img[:,:,1] + 0.0722*img[:,:,0]
img[:,:,0] = y
img[:,:,1] = y
img[:,:,2] = y
# 以128为阈值进行二值化
y[y>=128] = 255
y[y<128] = 0
img[:,:,0] = y
img[:,:,1] = y
img[:,:,2] = y
plt.imshow(img);

原图和分割效果分别如图2和3所示。

图2 原图

图3 全局阈值分割效果图

opencv也提供了全局阈值的分割方法,处理代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('harden.png', 0)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
ret, thresh1 = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
plt.imshow(thresh1);

分割效果如图4所示。

图4 opencv阈值法分割

大津法(OTSU)

基于阈值的图像二值化方法的一个关键在于如何选定阈值,这可以视作为一个全局寻优问题。大津法也即OTSU法,是由日本学者大津展之于1979年提出的一种图像阈值分割方法。该方法将阈值划分视作是一个统计决策问题,其目的在于将像素分配给两组或多组的过程中使得引入的平均误差最小。大津法给出的方案是使得两组之间的类间方差最大时的阈值为最优阈值。所以大津法也叫最大类间方差法。

先来看一下大津法的基本原理。假设划分阈值为,小于阈值的像素区域为,大于阈值的像素区域为。和分别为被阈值分开的两类像素占总像素的比值。和分别为这两个类像素均值,和分别为这两个类中像素值的方差。

图像的类内方差和类间方差为:

图像的整体方差为:

图像的可分离度定义为:

最大化图像分离度即可,所以使得:

最大化即可。

基于NumPy的大津法实现例子如下代码所示。

img = cv2.imread('./harden.png')
img = img.astype(np.float)
H, W, C = img.shape
# 灰度化
out = 0.2126*img[:,:,2] + 0.7152*img[:,:,1] + 0.0722*img[:,:,0]
out = out.astype(np.uint8)
# 初始化类间方差和最佳阈值
max_sigma = 0
max_t = 0# 遍历迭代
for _t in range(1, 255):# 小于阈值t的类v0v0 = out[np.where(out<_t)]# 计算v0均值M0 = np.mean(v0) if len(v0) > 0 else 0.# v0类像素占比w0 = len(v0)/(H*W)# 大于阈值t的类v1v1 = out[np.where(out>=_t)]# 计算v1均值M1 = np.mean(v1) if len(v1) > 0 else 0.# v1类像素占比w1 = len(v1)/(H*W)# 类间方差Sb2 = w0*w1*((M0-M1)**2)# 寻优if Sb2 > max_sigma:max_sigma = Sb2max_t = _t# 打印最佳阈值
print(max_t)

通过大津法寻优可知示例图片的最佳划分阈值为。然后以为阈值进行二值化。效果如图5所示。

图5 大津法阈值分割

opencv中直接提供了大津法的实现方法,如下代码所示。

img = cv2.imread('./harden.png')
# 灰度化
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 大津法阈值化处理
ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(th);

小结

本文对基于阈值的图像分割方法进行了简单的介绍,并给出了相应的图像实例。基于阈值的图像分割方法简单直接,计算速度快,在图像灰度差异较大的情况下,是首选的分割方法。但阈值分割方法本身也存在抗噪能力弱、使用条件严格等缺点,所以往往会配合图像滤波去噪等方法一起使用。

参考资料

[1] 数字图像处理第四版

[2] https://opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

往期精彩:

时隔一年!深度学习语义分割理论与代码实践指南.pdf第二版来了!我工作第五年的学习与读书之法

基于阈值处理的图像分割算法!相关推荐

  1. 【CV】基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  2. 【深度学习】基于区域生长的图像分割算法!

    图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法.区域生长正是一种基于区域寻找的传统图像分割算法. 区域生长基本原理 区域生长(Region Growth) ...

  3. 基于区域生长的图像分割算法!

    图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法.区域生长正是一种基于区域寻找的传统图像分割算法. 区域生长基本原理 区域生长(Region Growth) ...

  4. 基于超像素的多视觉特征图像分割算法研究

    0.引言 背景: 经典聚类算法:Kmeans.FCM 现有问题: 1)现有算法大都是基于单一的视觉特征而设计的,eg:基于颜色特征的分割. 2)没有考虑像素周围的空间信息:分割结果:多噪声,缺乏区域性 ...

  5. matlab使用kirsch算子进行分割,matlab的图像分割算法

    学术探讨 经验交流 浅析基于 MATLAB 的图像分割方法蒋翠翠 (华中师范大学... 图像分割技术与 MATLAB 仿真 精品文档中南民族大学毕业论文(设计) 学院: 专业: 计算机科学学院 自动化 ...

  6. 【图像分割】走进基于深度学习的图像分割

    深度学习中的图像分割 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤.现有的图像分割方法主要分以下几类:基于阈值的分割方法.基于 ...

  7. 想学图像分割,强烈建议从这5篇图像分割算法综述

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 极市平台 引言 在过去的一年中,计算机视觉领域出现了 ...

  8. 大盘点 | 2020年5篇图像分割算法最佳综述

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨cynthia yawain 编辑丨极市平台 本文为极市平台原创整理,转载请联系极市小编. 导读 ...

  9. 综述的综述!5 篇2020 年「图像分割算法」最佳综述论文详解

    在过去的一年中,计算机视觉领域出现了许多优秀的工作,并推动了相关领域的技术发展与进步.极市平台对2020年出现的全部计算机视觉综述论文进行了分方向梳理.本篇文章为2020年图像分割方向的综述论文汇总, ...

最新文章

  1. SLAM图优化g2o
  2. CodeForces - 1339C Powered Addition(思维+贪心)
  3. linux用xshell编辑文件,Linux远程管理器xshell和xftp使用教程
  4. 509. 斐波那契数(JavaScript)
  5. SpringBoot如何整合定时任务调度
  6. 书法的艺术 —— 大家的作品
  7. java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解
  8. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论...
  9. org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.demo.pojo.IdCard
  10. Process Explorer工具
  11. js pdf文件 如何调用打印机打印_js直接打印pdf文件内容
  12. vba随机抽取人名不重复_excel启用宏,通过vba实现从数字数组里随机获取N个不重复的数字...
  13. ocx注册以及检测(转)
  14. C# 将方形图片剪切为圆形(winForm)
  15. linux内核audit,linux下的audit服务
  16. CPU(中央处理器)和GPU(图像处理器)区别
  17. 姓氏排序程序 Js 版(小程序共享)
  18. 用HTML/CSS制作一个美观的个人简介网页——学习周记1
  19. 【社区团购平台排名】社区团购平台有哪些?
  20. WIN10环境英伟达9系显卡tensorflow安装记录及调试过程 CUDA8.0+tensorflow-gpu1.4+CuDNN6.0

热门文章

  1. 做ctf题目的时候运行程序就会显示ImportError: cannot import name ‘flag‘ from ‘secret‘ 求大佬解答
  2. 怎么做手游性能测试?
  3. 用Postman测试网页接口
  4. 数字孪生是什么,数字孪生能干什么?一文读懂
  5. 9*9数独游戏C++开发
  6. 阿里云数据库(RDS)查看空间使用情况
  7. 宽和窄俯卧撑哪个更难_窄距俯卧撑到底该多窄?
  8. 学计算机女生找不到男朋友,女生找不到男朋友,大多都是这三个原因!
  9. 实时网速显示_实例_python
  10. 浏览器-网页标题的图标