Python----计算机视觉处理(Opencv:自适应二值化,取均值,加权求和(高斯定理))

server/2025/3/13 16:29:21/

一、自适应二值化

        与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片 上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求 了,于是就出现了自适应二值化。

二、取均值

        假如我们使用的小区域是3*3的,那么就会从图片的左上角开始(也就是像素值为162的地方)计算其邻 域内的平均值,如果处于边缘地区就会对边界进行填充,填充值就是边界的像素点。

         对于左上角像素值为162的这个点,161(也就是上图中括号内的计算结果,结果会进行取整)就是 根据平均值计算出来的阈值,接着减去一个固定值C,得到的结果就是左上角这个点的二值化阈值了, 接着根据选取的是阈值法还是反阈值法进行二值化操作。紧接着,向右滑动计算每个点的邻域内的平均 值,直到计算出右下角的点的阈值为止。我们所用到的不断滑动的小区域被称之为核,比如3*3的小区 域叫做3*3的核,并且核的大小都是奇数个,也就是3*3、5*5、7*7等。

三、加权求和

        对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布。

        高斯概率函数是相对于二维坐标产生的,其中(x,y)为点坐标,要得到一个高斯滤波器模板,应先对高 斯函数进行离散化,将得到的值作为模板的系数。例如:要产生一个3*3的高斯权重核,以核的中心位 置为坐标原点进行取样,其周围的坐标如下图所示(x轴水平向右,y轴竖直向上)

(−𝟏,𝟏)

(𝟎,𝟏)

(𝟏,𝟏)

(−𝟏,𝟎)

(𝟎,𝟎)

(𝟏,𝟎)

(−𝟏,−𝟏)

(𝟎,−𝟏)

(𝟏,−𝟏)

 将坐标带入上面的公式中,即可得到一个高斯权重核。

        而在opencv里,当kernel(小区域)的尺寸为1、3、5、7并且用户没有设置sigma的时候(sigma <= 0),核 值就会取固定的系数,这是一种默认的值是高斯函数的近似。

kernel尺寸核值
1[1]
3[0.25,0.5,0.25]
5[0.0625,0.25,0.375,0.25,0.0625]
7[0.03125,0.109375,0.21875,0.28125,0.21875,0.109375,0.03125]

        通过这个高斯核,即可对图片中的每个像素去计算其阈值,并将该阈值减去固定值得到最终阈值,然后 根据二值化规则进行二值化。 

 某像素点的阈值计算过程如下图所示:

        首先还是对边界进行填充,然后计算原图中的左上角(也就是162像素值的位置)的二值化阈值,其计 算过程如上图所示,再然后根据选择的二值化方法对左上角的像素点进行二值化,之后核向右继续计算 第二个像素点的阈值,第三个像素点的阈值…直到右下角(也就是155像素值的位置)为止。

        当核的大小不同时,仅仅是核的参数会发生变化,计算过程与此是一样的。 

四、自适应

python">cv2.adaptiveThreshold:是用来对单通道图进行自适应二值化的。
第一个参数:单通道图
第二个参数:二值化过程中所用到的最大值
第三个参数:计算阈值的方法: 1. 平均值法  cv2.ADAPTIVE_THRESH_MEAN_C  2. 使用高斯核的加权平均法 cv2.ADAPTIVE_THRESH_GAUSSIAN_C
第四个参数:二值化的方法:1. 阈值法 THRESH_BINARY, 2. 反阈值法 THRESH_BINARY_INV
第五个参数: blocksize : 核的大小,通常为奇数  3*3, 5*5
第六个参数: 要减去的常数C的大小: 通常是正数,但也有可能是0或负数

导入模块

python">import cv2

读取图片 

python">img=cv2.imread('lena.png')

灰度化 

python">img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

自适应 

python">img_adaptive=cv2.adaptiveThreshold(img_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,7,5)

结果 

python">cv2.imshow('img_adaptive',img_adaptive)
cv2.waitKey(0)

完整代码 

import cv2  img = cv2.imread('lena.png')  # 将彩色图像转换为灰度图像  
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 使用自适应阈值算法对灰度图像进行二值化处理  
# cv2.adaptiveThreshold() 的参数:  
# 1. 输入图像 (img_gray)  
# 2. 最大值 (255): 二值化后像素的最大值  
# 3. 自适应阈值方法 (cv2.ADAPTIVE_THRESH_GAUSSIAN_C): 使用高斯加权邻域平均值  
# 4. 阈值类型 (cv2.THRESH_BINARY): 二值化类型  
# 5. 领域大小 (7): 奇数,阈值计算时邻域的大小  
# 6. 常数 (5): 从计算的阈值中减去的常数  
img_adaptive = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 5)  # 显示处理后的自适应二值化图像  
cv2.imshow('img_adaptive', img_adaptive)  # 等待用户按键后关闭窗口  
cv2.waitKey(0)  

五、库函数

adaptiveThreshold()

python">cv.adaptiveThreshold(	src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]	) ->	dst
方法描述
src源 8 位单通道图像。
maxValue分配给满足条件的像素的非零值
adaptiveMethod要使用的自适应阈值算法
thresholdType阈值类型必须为 THRESH_BINARY 或 THRESH_BINARY_INV
blocksize用于计算像素阈值的像素邻域的大小:3、5、7 等。
C从平均值或加权平均值中减去的常数。通常,它是正的,但也可能是零或负的
adaptiveMethod——Enumerator
FLOODFILL_FIXED_RANGE 

Python: cv.FLOODFILL_FIXED_RANGE

如果设置了相关参数,则会考虑当前像素与种子像素之间的差异。否则,会考虑相邻像素之间的差异(也就是说,范围是浮动的)。
FLOODFILL_MASK_ONLY 

Python: cv.FLOODFILL_MASK_ONLY

如果设置了该参数,则该函数不会改变图像(新值将被忽略),并且仅会按照上述描述在标志的第 8 到第 16 位中指定的值填充掩码。此选项仅在具有掩码参数的函数变体中才有意义。

http://www.ppmy.cn/server/174664.html

相关文章

05.基于 TCP 的远程计算器:从协议设计到高并发实现

&#x1f4d6; 目录 &#x1f4cc; 前言&#x1f50d; 需求分析 &#x1f914; 我们需要解决哪些问题&#xff1f; &#x1f3af; 方案设计 &#x1f4a1; 服务器架构 &#x1f680; 什么是协议&#xff1f;为什么要设计协议&#xff1f; &#x1f4cc; 结构化数据的传输问题 …

SAIL-RK3576核心板应用方案——无人机视觉定位与地面无人设备通信控制方案

本方案以 EFISH-RK3576-SBC工控板 或 SAIL-RK3576核心板 为核心&#xff0c;结合高精度视觉定位、实时通信与智能控制技术&#xff0c;实现无人机与地面无人设备的协同作业。方案适用于物流巡检、农业植保、应急救援等场景&#xff0c;具备高精度定位、低延迟通信与强环境适应性…

Flutter三棵树是什么,为什么这么设计

目录 1. 三棵树的定义与职责 (1) Widget 树 (2) Element 树 (3) RenderObject 树 2. 三棵树的协同工作流程 3. 为什么设计三棵树&#xff1f; (1) 性能优化 (2) 逻辑解耦 (3) 灵活性 4. 三棵树的设计优势总结 示例&#xff1a;动态列表更新 常见面试追问 Flutter 的…

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…

【安卓逆向】安卓病毒介绍及其简单案例分析

目录 引言 一、Android 病毒介绍及分析方法 1.1 Android 病毒预览 1.2 Android 病毒分析必备知识 1.3 Android 病毒的常见类型及恶意行为 1.3.1 常见病毒类型 1.3.2 常见病毒行为 1.4 病毒激活条件 1.5 Android 病毒的传播方式 1.6 Android 病毒分析的一般方法 二…

Linux练级宝典->动态库和静态库

动静态库的原理 我们知道可执行文件前的4步骤 预编译->编译->汇编->链接 预处理&#xff1a; 完成头文件展开、去注释、宏替换、条件编译等&#xff0c;最终形成xxx.i文件。编译&#xff1a; 完成词法分析、语法分析、语义分析、符号汇总等&#xff0c;检查无误后将…

《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》

在科技飞速发展的今天&#xff0c;量子计算与经典算法的融合成为了前沿领域的焦点。DeepSeek-M8的“量子神经网络混合架构”&#xff0c;宛如一把钥匙&#xff0c;开启了经典算法与量子计算协同推理的全新大门&#xff0c;为诸多复杂问题的解决提供了前所未有的思路。 量子计算…

MySQL中 IN 到底走不走索引?

文章目录 前言数据库表结构查询sqlEXPLAIN介绍EXPLAIN 的输出每列解释 强制走索引查询时添加条件(复合索引字段)查询小时查询分钟 总结 前言 在 MySQL 中&#xff0c;IN 语句是否能够利用索引取决于多个因素&#xff0c;包括但不限于查询的具体形式、表的统计信息、索引的选择…