【CV】基于阈值处理的图像分割算法!
图像处理
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
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件
本站qq群851320808,加入微信群请扫码:
【CV】基于阈值处理的图像分割算法!相关推荐
- 基于阈值处理的图像分割算法!
图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...
- 【深度学习】基于区域生长的图像分割算法!
图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法.区域生长正是一种基于区域寻找的传统图像分割算法. 区域生长基本原理 区域生长(Region Growth) ...
- 基于区域生长的图像分割算法!
图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法.区域生长正是一种基于区域寻找的传统图像分割算法. 区域生长基本原理 区域生长(Region Growth) ...
- 基于超像素的多视觉特征图像分割算法研究
0.引言 背景: 经典聚类算法:Kmeans.FCM 现有问题: 1)现有算法大都是基于单一的视觉特征而设计的,eg:基于颜色特征的分割. 2)没有考虑像素周围的空间信息:分割结果:多噪声,缺乏区域性 ...
- 大盘点 | 2020年5篇图像分割算法最佳综述
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨cynthia yawain 编辑丨极市平台 本文为极市平台原创整理,转载请联系极市小编. 导读 ...
- 综述的综述!5 篇2020 年「图像分割算法」最佳综述论文详解
在过去的一年中,计算机视觉领域出现了许多优秀的工作,并推动了相关领域的技术发展与进步.极市平台对2020年出现的全部计算机视觉综述论文进行了分方向梳理.本篇文章为2020年图像分割方向的综述论文汇总, ...
- matlab使用kirsch算子进行分割,matlab的图像分割算法
学术探讨 经验交流 浅析基于 MATLAB 的图像分割方法蒋翠翠 (华中师范大学... 图像分割技术与 MATLAB 仿真 精品文档中南民族大学毕业论文(设计) 学院: 专业: 计算机科学学院 自动化 ...
- 【图像分割】走进基于深度学习的图像分割
深度学习中的图像分割 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤.现有的图像分割方法主要分以下几类:基于阈值的分割方法.基于 ...
- 想学图像分割,强烈建议从这5篇图像分割算法综述
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 极市平台 引言 在过去的一年中,计算机视觉领域出现了 ...
最新文章
- 进程间通信的方式(三):消息队列
- yum 下载RPM包而不进行安装
- java反射创建实例_Java反射创建实例
- Ubuntu 问题合集
- IDEA与SVN集成
- sharepoint搭建文档服务器,SharePoint Server教程
- unity小地图制作和方向导航
- 电脑任务栏卡死,解决办法
- 这篇文章来告诉你几个实用的视频转文字的方法
- html 网页背景图片根据屏幕大小CSS自动缩放
- 语音助手——问答型助手架构和设计
- 平头哥面试——数字IC1
- 形式逻辑(08)模态判断 和 推理
- nginx代理MySQL实现数据库远程办公
- 比程序员更好的职业_立即成为更好的程序员的20条技巧
- 黑马程序员--C语言基础之--变量、内部函数与外部函数
- AI-自然语言处理-自然语言处理介绍
- Proj4js西安坐标系定义分享
- 《小强升职记》读书笔记(上)
- C++版本发展简史:新特性介绍