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

图像二值化(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=kLargmaxσ2

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

推导

https://blog.csdn.net/m0_54351828/article/details/120642025

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

根据方差定义,得到

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

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

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

其中,

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

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

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

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

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

进一步化简上式,

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

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

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

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

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

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

σ2=(MG∗p1−m)2p1(1−p1)\sigma ^2 = \frac{(MG*p1-m)^2}{p1(1-p1)}σ2=p1(1p1)(MGp1m)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 转载注明出处!💗

参考文献

  1. Otsu大津算法公式推导及python实现
  2. OTSU算法(大津法—最大类间方差法)原理及实现
  3. 二值化_初探图像二值化
  4. 一文搞懂图像二值化算法

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

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

相关文章

全球最快AI超级计算机开动,每秒4百亿亿浮点运算!正拼接最大宇宙3D地图

来源&#xff1a;venturebeat宇宙是在不断膨胀的吗&#xff1f;是的&#xff01;而令宇宙不断膨胀的「罪魁祸首」就是暗能量。作为是宇宙中最神秘的物质&#xff0c;它看不见摸不着&#xff0c;为了捕捉它&#xff0c;人类在地球上建立了许多相关实验&#xff0c;但都成效甚微。…

基于YOLOv5的中式快餐店菜品识别系统

基于YOLOv5的中式快餐店菜品识别系统[金鹰物联智慧食堂项目] 摘要 本文基于YOLOv5v6.1提出了一套适用于中式快餐店的菜品识别自助支付系统&#xff0c;综述了食品识别领域的发展现状&#xff0c;简要介绍了YOLOv5模型的历史背景、发展优势和网络结构。在数据集预处理过程中&am…

谋局科技创新:两院院士大会释放重要信号

来源&#xff1a;经济参考报作者&#xff1a;班娟娟、钟源从坚持把科技自立自强作为国家发展的战略支撑&#xff0c;到加快建设科技强国&#xff0c;实现高水平科技自立自强&#xff1b;从加强原创性、引领性科技攻关&#xff0c;坚决打赢关键核心技术攻坚战&#xff0c;到强化…

图像加减运算

图像的加减运算 原创文章&#xff1a;转载请注明出处 ©️ Sylvan Ding 图像相加 图像相加常常被用来进行图片降噪处理。令 g(x,y)g(x,y)g(x,y) 是无噪声理想图像 f(x,y)f(x,y)f(x,y) 被高斯加性噪声 η(x,y)\eta (x,y)η(x,y) 污染后的图像&#xff0c;即 g(x,y)f(x,y)η…

随机森林是我最喜欢的模型

来源&#xff1a;机器之心TensorFlow 决策森林 (TF-DF) 现已开源&#xff0c;该库集成了众多 SOTA 算法&#xff0c;不需要输入特征&#xff0c;可以处理数值和分类特征&#xff0c;为开发者节省了大量时间。在人工智能发展史上&#xff0c;各类算法可谓层出不穷。近十几年来&a…

拉普拉斯锐化[原理及Python实现](含拉氏标定、拉普拉斯标定)

拉普拉斯锐化 [原理及Python实现]&#xff08;含拉氏标定、拉普拉斯标定&#xff09; 原创文章&#xff1b;转载请注明出处&#xff1a;©️ Sylvan Ding 锐化处理的主要目的是突出灰度的过度部分。图像锐化的用途多种多样&#xff0c;应用范围从电子印刷和医学成像到工业…

以太坊 方法签名

最近在工作中使用web3j调用合约&#xff0c;发现一个比较头疼的问题&#xff1f;复杂一点的合约参数多了&#xff0c;函数的方法签名老是出错。在这之前调用合约方法一直都是拼接合约的函数签名以及参数。为了能快速的获取每个合约的函数签名&#xff0c;我在思考是否便捷可行解…

训练 GPT-3,为什么原有的深度学习框架吃不消?

来源&#xff1a;AI前线作者&#xff1a;一流科技 CEO 袁进辉近年来&#xff0c;深度学习被广泛应用到各个领域&#xff0c;包括计算机视觉、语言理解、语音识别、广告推荐等。在这些不同领域中&#xff0c;一个共同的特点就是模型规模越来越大&#xff0c;比如 GPT-3 模型的参…

Canny边缘检测原理及其python实现

Canny边缘检测原理及其python实现 转载请注明出处&#xff1a;©️ Sylvan Ding Canny边缘检测算法 多数分割算法均基于灰度值的两个基本性质之一&#xff1a;不连续性和相似性。图像的边缘检测就是基于灰度的不连续性&#xff08;灰度突变&#xff09;来实现图像分割的。…

离奇的梦境,能够防范大脑过拟合

来源&#xff1a;混沌巡洋舰 1 )梦让我们对世界的理解不再那么简单化关于为什么大脑进化出夜间做梦&#xff1f;神经科学界提出了各种假说&#xff0c;诸如通过梦来调节情绪&#xff0c;巩固记忆&#xff0c;或梦可以帮助我们选择性的遗忘&#xff0c;对我们应对现实世界的问题…

RGB空间中的彩色图像分割原理及其python实现

RGB空间中的彩色图像分割 ⭐️ 为尊重原创性&#xff01;转载请注明出处&#xff1a;©️ Sylvan Ding’s Blog 概述 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法&#xff0c;并用python实现了各个算法。之后将二者的优势结合&#xff0c;提出了改进后的曼哈顿…

路飞学城Python-Day171

Evernote Export 线性结构&#xff1a;python的列表操作列表是如何存储的&#xff1a;顺序存储的&#xff0c;是一块连续的内存&#xff0c;内存是一堆格子&#xff0c;列表是一串连续的编号32位机器上一个整数占4个字节数组和列表有2点不同&#xff0c;1.数组的元素类型要求是…

HarmonyOS 2面世!是没有退路还是时机成熟?中国操作系统崛起元年或已到来

来源&#xff1a;21Tech(News-21)作者&#xff1a;倪雨晴编辑&#xff1a;张星6月2日晚间&#xff0c;华为鸿蒙操作系统HarmonyOS迎来重要时刻&#xff0c;华为正式发布多款搭载HarmonyOS 2的新产品&#xff0c;包括HUAWEI Mate 40系列新版本、Mate X2新版本、HUAWEI WATCH 3系…

操作系统:线程同步

操作系统&#xff1a;线程同步 使用Linux无名信号量实现了读写者线程的互斥和同步。 实验环境 环境&#xff1a;Linux语言&#xff1a;CCMake&#xff1a;3.17.1GCC&#xff1a;7.5.0IDE&#xff1a;Clion 2020.3.1 实验目标 理解进程同步的两种制约关系&#xff1a;互斥与…

中国工程院2021年院士增选第二轮候选人名单公布

来源&#xff1a;先进制造业中国工程院2021年院士增选进入第二轮评审候选人名单&#xff08;按候选人姓名拼音排序&#xff09;未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城…

vsftpd部署流程和常见问题详解

vsftpd部署流程和常见问题详解 ⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂&#xff0c;没有一篇是可以彻底解决问题的&#xff0c;有些问题虽简单&#xff0c;但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法&#xff0c;详述用户创建过…

谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

来源&#xff1a;Google AI Blog编辑&#xff1a;yaxin, LQ &#xff08;新智元&#xff09;突触&#xff0c;是神经网络的「桥梁」。我们知道&#xff0c;人类大脑有860亿个神经元&#xff0c;因为有了突触&#xff0c;才可以把神经元上的电信号传递到下一个神经元。长久以来&…

智慧食堂项目策划书(商业计划书/立项计划)

金鹰物联智慧食堂项目策划书&#xff08;商业计划书/立项计划&#xff09; ©️ 金鹰物联项目组&#xff0c;转载请注明出处&#xff01; ⭐️ 技术部分请参考博文&#xff1a;基于YOLOv5的中式快餐店菜品识别系统 文章目录金鹰物联智慧食堂项目策划书&#xff08;商业计划…

pipelineDB学习笔记-2. Stream (流)

一、流的定义&#xff1a; 所谓的“流”&#xff08;stream&#xff09;在pipelineDB中是指那些被允许的数据库客服端推送到 Continuous View&#xff08;连续视图&#xff09; 的时序化数据的一种“抽象”。流中的每一个raw(数据列)或者event(事件)&#xff0c;看起来是和普通…

银行家算法之Python实现[操作系统实验]

银行家算法 银行家算法是著名的死锁避免算法&#xff0c;其思想是&#xff1a;把操作系统视为银行家&#xff0c;操作系统管理的资源相当于银行家管理的资金&#xff0c;进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程…