图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)

编程实现图像的二值化,分析不同的阈值对二值化图像的影响。

问题描述

传统的机器视觉通常包括两个步骤:预处理和物体检测。而沟通二者的桥梁则是图像分割(Image Segmentation)。图像分割通过简化或改变图像的表示形式,使得图像更易于分析。最简单的图像分割方法是二值化(Binarization)。

图像二值化(Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。

由于二值图像数据足够简单,许多视觉算法都依赖二值图像。通过二值图像,能更好地分析物体的形状和轮廓。二值图像也常常用作原始图像的掩模(又称遮罩、蒙版,Mask):它就像一张部分镂空的纸,把我们不感兴趣的区域遮掉。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding)进行二值化。其将大于某个临界灰度值的像素灰度设为灰度极大值,小于这个值的为灰度极小值,从而实现二值化。

阈值法又分为全局阈值(Global Method)和局部阈值(Local Method),又称自适应阈值(Adaptive Thresholding)。本次实验主要实现全局阈值,阈值的选取基于以下三种方法:

  • 平均值法
  • 双峰法
  • OTSU法

平均值法

为了应对每张图片的灰度值大不相同,阈值取为图像本身的平均值.

import cv2
import numpy as np
import matplotlib.pyplot as pltimg_name0 = 'lena_gray.bmp'
img0 = cv2.imread(img_name0)plt.imshow(img0)
plt.show()

def mean_binarization(img):img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)threshold = np.mean(img_gray)img_gray[img_gray>threshold] = 255img_gray[img_gray<=threshold] = 0# For displaying a grayscale image set up the colormapping using the parameters cmap='gray', vmin=0, vmax=255.plt.imshow(img_gray, cmap='gray')plt.show()return img_grayimg_gray0 = mean_binarization(img0)

双峰法

如果物体与背景的灰度值对比明显,直方图就会包含双峰(bimodal histogram),它们分别为图像的前景和背景。而它们之间的谷底即为边缘附近相对较少数目的像素点,一般来讲,这个最小值就为最优二值化的分界点,通过这个点可以把前景和背景很好地分开。

from collections import Counterdef hist_binarization(img):img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hist = img_gray.flatten()plt.subplot(121)plt.hist(hist, 256)cnt_hist = Counter(hist)most_commons = cnt_hist.most_common(2)# get the grey values of bimodal histogrambegin, end = most_commons[0][0], most_commons[1][0]if begin > end:begin, end = end, beginprint(f'{begin}: {end}')cnt = np.iinfo(np.int16).maxthreshold = 0for i in range(begin, end+1):if cnt_hist[i] < cnt:cnt = cnt_hist[i]threshold = iprint(f'{threshold}: {cnt}')img_gray[img_gray>threshold] = 255img_gray[img_gray<=threshold] = 0plt.subplot(122)plt.imshow(img_gray, cmap='gray')plt.show()return img_grayimg_gray1 = hist_binarization(img0)

上述直方图两峰值没有间距,故未能较好体现双峰法的作用.

OTSU法

不难发现,上述双峰法具有明显的缺陷,因为直方图是不连续的,有非常多尖峰和抖动,要找到准确的极值点十分困难。日本工程师大津展之为这个波谷找到了一个合适的数学表达,并于1979年发表。这个二值化方法称为大津算法(Otsu’s method)。

从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致类间差别变小。因此,使类间方差最大的分割意味着错分概率最小。

优化目标

k∗=arg⁡max⁡k∈Lσ2k^* = \mathop { \arg \max } \limits _{k\in L} \sigma ^2k∗=k∈Largmax​σ2

σ2=(MG∗p1−m)2p1(1−p1)\sigma ^2 = \frac{(MG*p1-m)^2}{p1(1-p1)}σ2=p1(1−p1)(MG∗p1−m)2​

推导

由所选定的阈值 kkk 将所有像素分为两类 C1( 小于等于 kkk ) 和 C2(大于 kkk ),两类像素的均值分别为 m1m1m1、m2m2m2,全局均值为 MGMGMG.属于 C1、C2 的概率分别为 p1p1p1、p2p2p2. L 是图像的像素级(0~255)

根据方差定义,得到

σ2=p1(m1−MG)2+p2(m2−MG)2\sigma ^2 = p1(m1-MG)^2 + p2(m2-MG)^2σ2=p1(m1−MG)2+p2(m2−MG)2

p1∗m1+p2∗m2=MGp1*m1+p2*m2=MGp1∗m1+p2∗m2=MG

p1+p2=1p1+p2=1p1+p2=1

其中,

p1=∑i=0kpip1=\sum _{i=0} ^k p_ip1=i=0∑k​pi​

m1=∑i=0kipip1m1 = \frac{\sum _{i=0} ^k ip_i}{p1} m1=p1∑i=0k​ipi​​

m2=∑i=k+1Lipip2m2 = \frac{\sum _{i=k+1} ^L ip_i}{p2} m2=p2∑i=k+1L​ipi​​

pip_ipi​ 是灰度值为 i 的像素点出现的频率(或概率)

σ2=p1p2(m1−m2)2\sigma ^2 = p1p2(m1-m2)^2σ2=p1p2(m1−m2)2.

进一步化简上式,

MG=∑i=0LipiMG=\sum _{i=0} ^{L} ip_iMG=i=0∑L​ipi​

m=∑i=0kipim=\sum _{i=0} ^{k} ip_im=i=0∑k​ipi​

其中,mmm 是灰度阈值 kkk 的累加均值(相对整张图片而言的均值,而 m1 是 C1 类的类内均值),MGMGMG 是全局均值,和前文所述一致,则

m1=mp1m1=\frac{m}{p1}m1=p1m​

m2=MG−mp2m2=\frac{MG-m}{p2}m2=p2MG−m​

由此可的最终的类间方差公式:

σ2=(MG∗p1−m)2p1(1−p1)\sigma ^2 = \frac{(MG*p1-m)^2}{p1(1-p1)}σ2=p1(1−p1)(MG∗p1−m)2​

def otsu(img):img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)h, w = img_gray.shape[:2]pixel = h * wthreshold_k = 0max_var = .0for k in range(255):c1 = img_gray[img_gray <= k]p1 = len(c1) / pixelif p1 == 0:continueelif p1 == 1:breakMG = np.sum(img_gray) / pixelm = np.sum(c1) / pixeld = (MG*p1 - m) ** 2 / (p1 * (1 - p1))if d > max_var:max_var = dthreshold_k = kimg_gray[img_gray <= threshold_k] = 0img_gray[img_gray > threshold_k] = 255print(f"{threshold_k}")plt.imshow(img_gray, cmap='gray')plt.show()return img_grayimg_gray2 = otsu(img0)

结果分析

OTSU算法得到的阈值产生了比上述两者都好的分割效果,其按图像的灰度特性,将Lena分成背景和前景两部分,接着遍历阈值,找到使得前景、背景二类间方差最大的阈值,作为二值化的阈值.

©️Sylvan Ding 转载注明出处!

图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)相关推荐

  1. C#,图像二值化(04)——全局阈值的凯勒算法(Kittler Thresholding)及源程序

    1.Kittler算法(最小误差法)概述 最小误差法是 J. Kittler & J. Illingworth 1986年在<MINIMUM ERROR THRESHOLDING> ...

  2. C#,图像二值化(17)——全局阈值的ISODATA算法(亦称作InterMeans法)及其源程序

    二值算法综述请阅读: C#,图像二值化(01)--二值化算法综述与二十三种算法目录https://blog.csdn.net/beijinghorn/article/details/128425225 ...

  3. OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  4. 图像二值化_三角阈值法

    前言 一.三角阈值法是什么? 二.算法原理 1.算法 总结 参考文献 前言 图像二值化有很多方法,比较经典的为OTSU,三角阈值法,本文主要想一探三角阈值法的算法原理. 一.三角阈值法是什么? 三角阈 ...

  5. C#,图像二值化(13)——全局阈值的双峰平均值算法(Bimodal Thresholding)与源程序

    1.图像二值化概述 图像二值化是将彩色图像转换为黑白图像.大多数计算机视觉应用程序将图片转换为二进制表示.图像越是未经处理,计算机就越容易解释其基本特征. 二值化过程 在计算机存储器中,所有文件通常以 ...

  6. 自适应阈值图像二值化

    一.二值化 关于二值化的介绍,以前的博客中有介绍,这里就不再描述了,二值化介绍:二值化分为固定阈值二值化和自适应阈值二值化,固定阈值二值化方式是我们常用的二值化方式,需要自己摸索一个经验阈值,不断调整 ...

  7. OpenCV+python:图像二值化

    1,图像二值化概念及方法 一个像素点的颜色是由RGB三个值来表现的,所以一个像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,它们也都是同样大小的矩阵. 在图像处理中,用RGB三个分量(R ...

  8. 二值化图像的欧拉数_Android OpenCV(八):图像二值化

    图像二值化 简介 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程.在数字图像处理中,二值图像占有非常重要的 ...

  9. Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...

最新文章

  1. less 命令(转)
  2. SQL Server 镜像构建
  3. 黑客暗网叫卖Zoom账号密码,1分钱能买71个,加密大佬教袁征做人,17年前开源软件现在又火了...
  4. day17-jdbc 6.Connection介绍
  5. find out the service list changed with given user which have item category group
  6. asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存
  7. anychart说明文档
  8. RHCS集群原理概述
  9. C++学习笔记-windows底层粗略认识
  10. Intent.ACTION_PICK
  11. 前端笔记 | CSS定位
  12. 我的Android进阶之旅------gt;Android嵌入图像InsetDrawable的使用方法
  13. Android 获得设备状态信息、Mac地址、IP地址
  14. 费用型采购订单后台配置
  15. 网工行业里的多面手,数据通信工程师2022年最新系统学习路线整理
  16. 计算机专业学什么代码,计算机科学与技术专业代码,本科计算机科学与技术专业代码查询...
  17. 【小米路由器3】breed刷机救砖-nand flash硬改SPI flash-编程器救砖(解决ttl无法救砖问题)
  18. CIDR地址规划方法
  19. 高性能服务器架构之路-MongoDB(一):MongoDB快速入门(java版)(草稿)
  20. 如何在老旧电脑上安装 M.2 固态硬盘提升电脑性能

热门文章

  1. 推荐系统算法(3)InfoQ系列翻译文章,2016
  2. ios设备管理软件 2.16.9官网Mac/Windows下载电脑版功能介绍
  3. 电话会议蓝牙耳机推荐哪款?电话会议打电话方便的耳机推荐
  4. 图像超分辨率评价指标
  5. 【华为OD机试】最大股票收益【2023 B卷|100分】
  6. 使用Python测试霍夫圆检测
  7. 互联网晚报 | 1/31 星期二 |​ 四川回应生育登记取消结婚限制;光线传媒股价大跌;LVMH老板放狠话坚决打击代购行为...
  8. 大学生创新创业训练计划项目——无线充电装置(附工程文件)
  9. JAVA FTP 上传文件
  10. lsmod | grep kvm无输出的解决办法