图像分割 - 阈值处理 - 全局阈值处理

article/2025/9/19 14:09:51

目录

1. 介绍

2. 代码实现

3. 代码讲解


1. 介绍

当目标和背景像素的灰度分布非常不同的时候,可以对整个图像使用全局阈值

在大多数的应用中,图像之间通常存在足够的变化,全局阈值是一种合适的办法。所以,需要一种对图像做阈值估计的算法。为了获取合适的阈值,可以利用直方图进行迭代计算:

算法步骤如下:

  1. 随机设置一个阈值的初始值 T
  2. 用 T 分割图像,这将会产生两个像素区域。一个是灰度值 <= T 所有像素组成的子区域 G1,一个是灰度值 >T 所有像素组成的子区域 G2
  3. 对G1、G2 两个子区域分别计算平均灰度值m1、m2
  4. 利用m1、m2得到新的阈值:T = (m1 + m2)/ 2
  5. 重复2-4,直到两个阈值T的差值小于某个预设定的值ΔT为止

当目标和背景之间存在一个非常清晰的波谷的时候,上述的算法很有效,

一般来说,初始的阈值T设定为整幅图像的平均灰度值

2. 代码实现

完整代码:

import cv2
import numpy as npdef global_threshold_processing(x):   # x 为传入的图像hist = cv2.calcHist([x], [0], None, [256], [0, 256])  # 图像的灰度直方图  shape = (256,1)grayScale = np.arange(256).reshape(1, -1)             # 灰度级 [0,255]  shape =(1,256)sum_pixels = x.shape[0] * x.shape[1]                  # 图像总共像素点的个数sum_gray = np.dot(grayScale, hist)                    # 每个灰度值像素的个数 * 对应灰度值 = 所有的像素灰度值的和T = np.around(sum_gray / sum_pixels).astype(np.uint).item()         # 初始阈值T,设定为整幅图像的平均灰度值theta = 1while True:         # 迭代算法gray_c1 = grayScale[:, :T + 1]                     # 灰度值 <= T 的子区域 G1 的灰度级 (0,T)hist_c1 = hist[:T + 1, :]                          # 子区域G1 的直方图 (0,T),对应每个灰度值的像素点sum_gray_G1 = np.dot(gray_c1, hist_c1)             # G1 区域所有像素点灰度值总和 = (0,T)的灰度值 * 对应像素点的个数sum_pixels_G1 = np.sum(hist_c1)                    # G1 区域所有像素点的个数m1 = sum_gray_G1 / sum_pixels_G1                   # G1 区域平均灰度值sum_pixels_G2 = sum_pixels - sum_pixels_G1         # G2 区域所有像素点的个数 : 所有像素点 - G1 区域像素点个数sum_gray_G2 = sum_gray - sum_gray_G1               # G2 区域所有像素点的灰度值总和 :所有灰度值 - G1 灰度值m2 = sum_gray_G2 / sum_pixels_G2                   # G2 区域平均灰度值T_new = np.around((m1 + m2) / 2).astype(np.uint).item()  # 计算新的阈值if abs(T - T_new) < theta:T = T_newbreakelse:T = T_newx[x >= T] = 255         # 阈值处理x[x < T] = 0return T,ximg = cv2.imread("img.png",0)ret,dst = global_threshold_processing(img.copy())print(ret)
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

图像处理结果:返回的阈值T = 113

图像处理结果:返回的阈值T = 129  

和书上不一样的原因是因为,这里为了显示做了缩放,里面的插值方式会影响图像的灰度值 

如果不做缩放会是这样:T = 125 

3. 代码讲解

算法实现的步骤已经给了注释,这里做简单的讲解

opencv中的计算直方图,会返回一个(256,1)的矩阵,256是灰度级。因此返回值是256行,1列的矩阵。里面的索引是0-255,对应256和灰度值,每个索引上面的值是像素点的个数

 

 

因此将hist和256个灰度值相乘就是总像素灰度值的和,这里是sum_gray

 


然后,np.around 是np数组的四舍五入

 


http://chatgpt.dhexx.cn/article/bMDkZrYL.shtml

相关文章

硬阈值 软阈值

1 定义 1.1 硬阈值 硬阈值的定义如下&#xff1a; 相当于 1.2 软阈值 软阈值的定义如下&#xff1a; 相当于 1.3 二者对比&#xff08;可视化解释&#xff09; 这是一张很经典地表述软阈值和硬阈值区别的图&#xff0c;其中软阈值是蓝色的线&#xff0c;他没有突变&#xff1…

神经网络阈值是什么意思,神经网络阈值怎么设置

BP神经网络中初始权值和阈值的设定 1、首先需要了解BP神经网络是一种多层前馈网络。2、以看一下在matlab中BP神经网络的训练函数&#xff0c;有梯度下降法traingd,弹性梯度下降法trainrp&#xff0c;自适应lr梯度下降法traingda等。 3、在matlab中命令行窗口中定义输入P&…

图像处理--阈值处理

图像二值化 图像二值化就是将图像上的像素点的灰度值设置为两个值&#xff0c;一般为0&#xff08;表示黑色&#xff09;和255&#xff08;表示白色&#xff09;&#xff0c;可以将整个图像呈现出明显的黑白效果。 最常用的方法就是先将图像灰度处理&#xff0c;然后设定一个阈…

两种划分阈值的方法

风险等级划分的时候可以降低主观性的一些系统方法 方法一&#xff1a;分层聚类法 凝聚层次聚类/分裂层次聚类 重点&#xff1a;确定层次聚类的簇数&#xff0c;画出树状图&#xff0c;基本就能得到你的区间范围&#xff0c;但数据量大的时候还是得再用代码跑 方法二&#xf…

“阀值”与“阈值”的区别

真相请看下图红色框里内容&#xff08;手动微笑&#xff09; 啥&#xff1f;&#xff1f;你跟我说没看懂&#xff0c;好吧&#xff0c;说的再明白点&#xff0c;“阀&#xff08;f&#xff09;值”是一个错误的用词&#xff0c;其正确用法是“阈&#xff08;y&#xff09;值”。…

【p116】

#查询score表中为196004&#xff0c;课程号为1201的学生成绩 #查询student表中姓周的学生情况 #查询数学成绩第2~5名的信息 #查询通信专业最高分的学生的情况 #查询1004课程的最高分,最低分&#xff0c;平均成绩 #查询至少有3名学生选修且以4开头的课程号和平均分数 #将计算机专…

《JDK学习》使用JDK的keytool生成p12证书

由于前段时间在研究itext技术中的签章技术中遇到了数字签名的问题&#xff0c;需要用到p12证书&#xff0c;因此就撰写一篇用我们jdk自带的keytool 工具生成p12证书的方法供各位交流。 keytool 简介 keytool 是java 用于管理密钥和证书的工具. 其功能包括&#xff1a; 创建并管…

日志 P11,P12

日志&#xff1a; 复制一个04.内容与03是一样的. 标准日志文件&#xff1a; 在mybatis-config.xml中写入setting设置&#xff0c;配置日志文件&#xff08;注意setting只能放在properties与typeAliases的中间&#xff09;。 setting中参数的内容可以在mybatis官方文档查找。…

xcode ios 怎么导入p12证书

注意&#xff1a;在哪台电脑上生成的根证书才能在哪台电脑上导出p12&#xff0c;在另外的电脑上是没有导出p12的选项的&#xff08;或者是灰的点不了&#xff09; 1.双击p12文件&#xff0c;将其导入到钥匙串&#xff0c;或者直接把p12文件拖入到钥匙串里 2.如下图&#xff0c;…

iOS证书(.p12)和描述文件(.mobileprovision)申请

原文链接 : iOS证书(.p12)和描述文件(.mobileprovision)申请 如果你从事过iOS开发&#xff0c;大概都会了解到iOS有两种证书和描述文件&#xff1a; 证书类型使用场景开发(Development)证书和描述文件用于开发测试&#xff0c;在 HBuilderX 中打包后可在真机环境调试发布(Dist…

java工具keytool生成p12数字证书文件

最近做毕设的时候需要用到数字证书&#xff0c;于是就用java来生成 Keytool是用于管理和证书的工具&#xff0c;位于%JAVA_HOME%/bin目录** 首选找到keytool.exe 然后在上面的路径显示框中输入CMD&#xff0c;然后回车 进入后输入以下代码 keytool -genkeypair -alias serv…

P12:Sequential的使用

1、CIFAR10 model的结构&#xff1a; 2、定义网络&#xff1a; class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.conv1 Conv2d(3, 32, 5, stride1, padding2)self.maxpool1 MaxPool2d(kernel_size2)self.conv2 Conv2d(32, 32, kernel_size5,…

仅使用p12文件和mobileprovision文件打包

前言&#xff1a;iOS发展到现在&#xff0c;必须使用开发者账号才能运行&#xff0c;打包&#xff1b;但有时候跟别人合作开发&#xff0c;别人不会把开发者账号密码给你&#xff0c;只给了一个P12证书和mobileprovision描述文件(如下图) 我们需要利用这两个文件打包。 1.双击…

P12 JWindow 窗口

P12 JWindow 窗口 1.概述2.JWindow 代码实例3.效果演示4.实现鼠标拖动 JWindow 窗口5.效果演示 系统&#xff1a;Win10 Java&#xff1a;1.8.0_333 IDEA&#xff1a;2020.3.4 Gitee&#xff1a;https://gitee.com/lijinjiang01/JavaSwing 1.概述 JWindow&#xff1a;一个容器&…

p12文件和provision profile文件作用

一&#xff1a;p12 当我们用大于三个mac设备开发应用时&#xff0c;想要申请新的证书&#xff0c;如果在我们的证书里&#xff0c;包含了3个发布证书&#xff0c;2个开发证书&#xff0c;可以发现再也申请不了开发证书和发布证书了 一般在我们的证书界面中应该只有一个开发证书…

职级P1到P12等级体系详解

人力资源管理中&#xff0c;职级是一项非常重要的概念&#xff0c;对于企业的薪资管理、晋升制度以及人才培养都有着至关重要的作用。而职级p1到p12则是常见的职级等级体系。 一、职级的含义 职级是指职位在企业内部的等级&#xff0c;通常是按照工作职责、技能要求、工作经验…

Elasticsearch:使用不同的 CA 更新安全证书 (一)

如果你必须添加组织中的新 CA 证书&#xff0c;或者你需要自己生成新 CA&#xff0c;请使用此新 CA 签署新节点证书并指示你的节点信任新 CA 证书。在今天的展示中&#xff0c;我将来演示如何更新一个 Elasticsearch 8.x 集群的 CA 证书。 Elasticsearch&#xff1a;使用不同的…

四大私募量化策略解析——阿尔法、套利、期货CTA、高频交易

近年来,随着证券市场规模的不断扩大,金融衍生产品不断推出, 投资策略和盈利模式发生根本性改变,投资复杂程度日益提高,导致证券市场投资者的构成比例出现了相应的变化。专业投资管理人的占比越来越大,且有加速之势。另一方面,量化对冲投资策略以其中低风险稳定收益的特性,将成为…

算法交易高频交易

产生背景 这程序化交易、自动化订单生成器和自动化订单路由系统主要被卖方公司用于执行下列业务&#xff1a;委托/自营交易、代理机构/客户的设施以及跨多资产类别。交易策略&#xff0c;包括指数替换、风险修正和期转现的清算等。当期货市场相对于现货市场的定价过高的时候&a…