图像二值化避坑指南:为什么你的Otsu阈值效果不理想?

从‘双峰’到‘单峰’:深入理解OTSU大津法的局限性与适用场景(附C代码验证) 本文深入探讨了OTSU大津法在图像阈值分割中的局限性与适用场景,特别针对非理想双峰直方图的失效机理进行分析。通过C代码验证和实验数据,揭示了算法在背景主导、光照不均等条件下的表现,并提出了预处理增强和混合阈值等改进策略,为工业检测和医学影像等实际应用提供决策框架。 阅读详情

图像二值化避坑指南:为什么你的Otsu阈值效果不理想?

在计算机视觉和图像处理的实际项目中,二值化往往是预处理流程中至关重要的一步。它像一把手术刀,将我们关心的前景目标从复杂的背景中清晰地剥离出来。很多工程师在初次接触时,会不假思索地选择Otsu(大津法)作为默认的全局阈值算法——毕竟它名声在外,号称“自适应”、“无需人工干预”,OpenCV里一行代码就能调用。然而,现实往往比理想骨感。你是否遇到过这样的情况:处理一张CT扫描图,骨骼的轮廓本该清晰可见,Otsu给出的结果却是一片模糊,或者将大量噪声误判为目标?又或者,在分析一张光照不均的工业零件图像时,算法完全失效,分割出的区域支离破碎?

如果你点头了,那么这篇文章正是为你准备的。Otsu算法并非万能钥匙,它的高效与优雅建立在几个核心假设之上。一旦这些假设在现实世界的复杂图像面前不成立,算法就会“失灵”。本文将带你深入Otsu失效的现场,剖析其背后的数学原理与局限性,并为你提供一套从预处理、算法选择到效果评估的完整避坑与解决方案。我们将结合医学影像(如CT、MRI)、文档扫描、工业检测等具体案例,让你不仅知其然,更能知其所以然,在下次面对棘手的图像时,能够胸有成竹地选择或构建最合适的分割策略。

1. 重温Otsu:优雅背后的严格假设

在讨论它为何失效之前,我们必须清晰地理解Otsu算法究竟在优化什么。这不仅仅是调用一个API,更是理解其能力边界的关键。

Otsu算法的核心思想极其优美:它试图找到一个灰度阈值,将图像的所有像素划分为两类(前景和背景),使得这两类之间的“差异”最大化。这个“差异”被数学定义为类间方差。算法遍历所有可能的灰度级,计算以该灰度级为阈值分割后的类间方差,并选择使方差最大的那个灰度级作为最佳阈值。

用更直观的话来说,Otsu希望前景和背景各自内部的像素灰度尽可能相似(类内紧凑),而前景和背景两者之间的平均灰度差异尽可能大(类间分离)。当图像的灰度直方图呈现明显的双峰形态时——一个峰代表背景,另一个峰代表前景——这个优化目标就能完美地找到位于两峰之间的谷底作为阈值。

注意:Otsu是一种全局阈值方法。这意味着它对整张图像只计算一个阈值。它也是一种无参数方法(从使用者角度看),因为阈值由数据本身决定。但它对图像的统计特性有隐含的、严格的要求。

让我们用一段简化的Python代码来揭示其计算过程,这比单纯看公式更直观:

import numpy as np

def otsu_threshold(hist, total_pixels):
    """
    手动计算Otsu阈值。
    hist: 图像的灰度直方图(256维向量)。
    total_pixels: 图像总像素数。
    返回最佳阈值。
    """
    variances = []
    for t in range(1, 255): # 遍历所有可能的阈值
        # 计算两类权重(概率)
        w0 = np.sum(hist[:t]) / total_pixels
        w1 = 1.0 - w0
        if w0 == 0 or w1 == 0:
            variances.append(0)
            continue

        # 计算两类平均灰度
        intensity_range = np.arange(256)
        mean0 = np.sum(intensity_range[:t] * hist[:t]) / (w0 * total_pixels)
        mean1 = np.sum(intensity_range[t:] * hist[t:]) / (w1 * total_pixels)

        # 计算类间方差
        between_var = w0 * w1 * (mean0 - mean1) ** 2
        variances.append(between_var)

    # 返回使类间方差最大的阈值
    return np.argmax(variances) + 1 # 加1因为从1开始遍历

从这段代码可以看出,算法的性能完全依赖于直方图的形状。下面这个表格总结了Otsu算法理想的工作场景与依赖的假设:

假设条件理想情况现实挑战
直方图形状清晰、分离良好的双峰可能是单峰、多峰、平坦或重叠严重的双峰
前景/背景面积比两者面积大致相当可能一方极小(如微小缺陷检测)或极大
噪声水平低噪声或噪声均匀存在椒盐噪声、高斯噪声或非均匀光照导致的伪影
目标对比度前景与背景灰度对比度高低对比度图像,前景与背景灰度非常接近

当这些假设被打破时,Otsu给出的阈值就会偏离我们的直观期望,导致分割失败。接下来的章节,我们将深入每一种“破局”场景。

2. 典型失效场景深度剖析与案例

2.1 低对比度图像:当山峰变成丘陵

这是Otsu最常见的“滑铁卢”。在医学影像中尤为普遍,例如某些软组织的MRI图像,或者早期病灶与正常组织灰度差异极小的CT片。此时,直方图的两个峰靠得非常近,甚至完全融合成一个宽泛的单峰。

案例:肺结节早期筛查CT图像 假设有一张肺部CT切片,一个微小的、对比度不高的疑似结节嵌入在肺实质中。结节的灰度可能只比周围组织高10-20个灰度级(在0-255范围内)。Otsu算法在计算类间方差时,由于两类的均值差异 (mean0 - mean1) 很小,即使权重乘积 w0 * w1 可能不错,最终的类间方差值也提不上去。算法可能会选择一个将图像大致分为明暗两部分的阈值,但完全无法突出那个微小的结节。结节要么被归入背景“消失”,要么被分割得残缺不全。

为什么失效? Otsu的优化目标——最大化类间方差——在低对比度下失去了威力。方差本身衡量的是离散程度,当两个类的中心本就接近时,再怎么优化,它们的分离程度也有限。算法可能找到一个局部最优解,但这个解对于人类期望的“目标-背景”分割毫无意义。

2.2 噪声干扰:直方图的“毛刺”误导选择

图像噪声会严重污染灰度直方图。椒盐噪声会在直方图两端(0和255附近)产生尖刺;高斯噪声则会使原本尖锐的峰变得宽扁,并可能产生虚假的小峰。

案例:工业相机拍摄的金属表面划痕检测 在光照条件不理想或相机传感器一般的情况下,图像可能包含大量噪声。Otsu算法在遍历阈值计算类间方差时,这些直方图上的“毛刺”会显著影响权重 w0, w1 和均值 mean0, mean1 的计算。例如,如果背景区域因噪声产生了一些极亮的像素点,它们可能会拉高背景类的平均灰度,导致算法找到一个错误的阈值,使得本应属于背景的暗噪声点被误判为前景。

# 模拟噪声对Otsu的影响(概念性代码)
clean_hist = ... # 干净图像的双峰直方图
# 添加高斯噪声效应:使直方图峰变宽,谷变浅
noisy_hist = np.convolve(clean_hist, np.array([0.1, 0.2, 0.4, 0.2, 0.1]), mode='same')
# 添加椒盐噪声效应:在两端增加脉冲
noisy_hist[0] += spike_at_0
noisy_hist[255] += spike_at_255

# 分别用clean_hist和noisy_hist计算Otsu阈值,结果很可能不同
threshold_clean = otsu_threshold(clean_hist, total_pixels)
threshold_noisy = otsu_threshold(noisy_hist, total_pixels)
print(f"干净图像阈值: {threshold_clean}, 噪声图像阈值: {threshold_noisy}")

2.3 非双峰直方图:Otsu的“原则性”失败

Otsu的数学基础决定了它最擅长处理两类问题。当图像包含多个主要灰度区域时(例如前景包含明暗不同的两部分,或背景不均匀),直方图可能呈现三个或更多的峰。

案例:自然场景下的目标分割 想象一张照片:一个人(穿着深色衣服)站在一棵树(中等灰度)前,背景是明亮的天空。这张图像的直方图可能会有三个峰:对应天空(高亮)、树木(中灰)、人物(深色)。Otsu强行将像素分为两类的做法在此刻是徒劳的。无论阈值选在哪里,都会将本应属于不同类的像素合并,导致分割结果无法使用。例如,阈值可能将树木和人物合并为“前景”,天空作为“背景”,但这完全不是我们想要的人物分割。

案例:光照不均的图像 这是非双峰直方图的一个特例,但极其常见。例如,文档扫描时由于光源位置,图像一侧亮一侧暗。整张图像的直方图是两端(亮区和暗区)直方图的叠加,结果可能是一个非常宽泛、没有明显低谷的分布。Otsu计算出的全局阈值对于图像的亮区可能太暗,对于暗区又可能太亮,导致分割结果一半过曝一半欠曝。

3. 预处理技巧:为Otsu创造“理想条件”

既然Otsu对输入如此挑剔,我们能否在将图像送入Otsu之前,先对它进行“改造”,使其更符合双峰、高对比、低噪声的假设呢?答案是肯定的,预处理是提升Otsu成功率的关键步骤。

  • 降噪滤波:这是对付噪声干扰的第一道防线。

    • 高斯模糊:温和的线性滤波器,能有效平滑高斯噪声,但可能使边缘变模糊。核大小需要权衡。
    • 中值滤波:非线性滤波器,对椒盐噪声有奇效,且能较好地保留边缘。一个 3x3 或 5x5 的窗口通常就足够了。
    • 双边滤波:在平滑的同时能保持边缘,但计算量较大。适用于对边缘保留要求高的场景。

    提示:滤波器的选择取决于噪声类型。在实践中,可以先用中值滤波去除椒盐噪声,再用轻微的高斯滤波平滑剩余噪声。

  • 对比度增强:针对低对比度图像。

    • 直方图均衡化:将图像的直方图分布拉伸到整个灰度范围,可以显著提升整体对比度。OpenCV中的 cv2.equalizeHist() 非常方便。
    • CLAHE:对比度受限的自适应直方图均衡化。这是直方图均衡化的改进版,通过限制局部对比度增强来避免放大噪声和产生过度人工感。在医学影像处理中尤其常用。
    • Gamma校正:通过非线性变换调整图像的灰度响应。gamma < 1 提升暗部细节,gamma > 1 提升亮部细节。可以用来有选择地增强目标区域与背景的差异。
  • 背景校正:解决光照不均问题。

    • 顶帽变换:适用于暗背景上的亮目标。通过原图减去开运算结果(先腐蚀再膨胀)来估计并移除背景。
    • 拟合与扣除:对于缓慢变化的背景,可以用一个低阶多项式曲面或高斯曲面来拟合背景亮度,然后从原图中减去这个拟合的背景。

让我们看一个结合了降噪和对比度增强的预处理流水线示例:

import cv2
import numpy as np

def preprocess_for_otsu(image):
    """一个针对低对比度、有噪声图像的预处理示例流程"""
    # 1. 转换为灰度图(如果输入是彩色)
    if len(image.shape) == 3:
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    else:
        gray = image.copy()

    # 2. 中值滤波去除椒盐噪声
    denoised = cv2.medianBlur(gray, 3)

    # 3. 使用CLAHE增强对比度
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    enhanced = clahe.apply(denoised)

    # 4. 轻微高斯模糊进一步平滑(可选)
    final = cv2.GaussianBlur(enhanced, (3, 3), 0.5)

    return final

# 使用预处理后的图像进行Otsu分割
preprocessed_img = preprocess_for_otsu(original_img)
_, otsu_result = cv2.threshold(preprocessed_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

经过这样的预处理,许多原本会让Otsu失效的图像,其直方图可能会被“塑造”得更接近理想的双峰形态。

4. 超越Otsu:替代方案与混合策略

当预处理也无法挽救,或者图像本身特性就与Otsu的假设根本冲突时,我们需要考虑其他算法。没有一种算法是完美的,但总有一种更适合你的场景。

算法/策略核心思想适用场景与Otsu对比
自适应阈值为图像中每个像素点根据其邻域灰度分布计算局部阈值。光照不均、背景纹理复杂。放弃全局单一阈值,采用局部阈值,能处理Otsu无法解决的光照梯度问题。
迭代选择法从一个初始阈值开始,根据分割结果迭代更新阈值,直至收敛。简单快速,对某些特定图像有效。比Otsu更直观,但可能收敛到局部最优,且对初始值敏感。
基于熵的方法最大化前景和背景的信息熵之和。当目标与背景的灰度分布有特定信息特性时。理论基础不同,有时在Otsu失效的案例上表现更好。
聚类方法如K-means (K=2),将像素灰度值作为特征进行聚类。本质也是寻找两类中心,可作为Otsu的替代视角。计算量通常大于Otsu,但思想类似,对于某些分布可能更鲁棒。
混合策略例如,先用自适应阈值处理光照不均,再在局部区域内使用Otsu。复杂场景,单一算法力有未逮。结合多种方法优点,是解决工程问题的常用思路。

重点探讨自适应阈值: 这是Otsu在光照不均问题上的“天然替代者”。OpenCV中通过 cv2.adaptiveThreshold 实现。

# 自适应阈值示例
adaptive_thresh = cv2.adaptiveThreshold(
    gray_image, 
    255, # 最大值
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 方法:邻域加权平均(高斯窗口)
    cv2.THRESH_BINARY, # 二值化类型
    11, # 邻域块大小(必须为奇数)
    2   # 从平均值或加权平均值中减去的常数
)

参数 blockSize 决定了局部邻域的大小,C 是一个微调常数。这种方法为图像中每个像素都计算了一个阈值,从而能够应对缓慢变化的光照。

如何选择?一个简单的决策流程:

  1. 观察直方图:首先画出图像的灰度直方图。如果是清晰双峰,Otsu是首选。
  2. 检查光照均匀性:肉眼观察或分区域统计灰度均值。如果明显不均,直接考虑自适应阈值。
  3. 评估噪声:如果噪声严重,先进行预处理(滤波),再尝试Otsu。
  4. 考虑目标尺寸:如果前景目标非常小,Otsu可能因面积权重问题失效,需尝试其他方法或进行后处理。
  5. 实验验证:在代表性数据集上快速测试几种方法,用下一节提到的评估指标进行量化比较。

5. 效果评估与实战调优:不只是肉眼看看

分割结果的好坏不能只靠“看起来不错”来判断,尤其是对于医学影像或工业检测这类严肃应用。我们需要客观的评估指标和系统的调优方法。

定量评估指标(在有Ground Truth的情况下):

假设我们有二值分割结果图 R 和真实标注图 GT。

指标计算公式物理意义
准确率(TP + TN) / (TP + TN + FP + FN)所有像素中分类正确的比例。在不平衡数据中可能失真。
精确率TP / (TP + FP)预测为前景的像素中,真正是前景的比例。衡量“找得准不准”。
召回率TP / (TP + FN)真实的前景像素中,被预测出来的比例。衡量“找得全不全”。
F1-Score2 * Precision * Recall / (Precision + Recall)精确率和召回率的调和平均数,综合衡量指标。
IoUTP / (TP + FP + FN)交集除以并集,衡量重叠程度,非常常用。

其中,TP(真阳), TN(真阴), FP(假阳), FN(假阴) 通过对比 R 和 GT 得到。

在没有Ground Truth时的实用评估方法:

  1. 区域一致性:检查分割出的连通区域是否内部灰度均匀,边界是否清晰、连续。过多的碎小区域或粗糙的边界通常意味着效果不佳。
  2. 对参数/预处理的鲁棒性:轻微调整预处理参数(如滤波核大小、对比度增强强度),观察分割结果是否发生剧烈变化。鲁棒性好的方法更可靠。
  3. 下游任务反馈:如果二值化是为后续的测量、识别或计数服务,那么最终这些任务的准确率就是最直接的评估标准。例如,在细胞计数中,分割结果直接输入计数器,计数准确性就是终极指标。

实战调优日志: 在实际项目中,我习惯为每个棘手的图像案例建立一个简单的调优日志。下面是一个示例格式:

图像ID: CT_001.dcm
问题描述: 低对比度肺结节,结节与周围组织灰度差约15。
首次Otsu结果: 失败,结节未被分割出。
预处理尝试1: 直方图均衡化 -> Otsu。结果: 略有改善,但引入噪声,产生假阳性。
预处理尝试2: CLAHE (clipLimit=2.0, tileGridSize=8x8) -> 中值滤波(3x3) -> Otsu。
结果: 结节被较完整分割,假阳性减少。F1-Score提升至0.82。
替代方案尝试: 直接使用自适应阈值(高斯, blockSize=21, C=5)。
结果: 结节区域分割尚可,但背景肺纹理也被部分分割,边界不如方案2清晰。
最终选择: 预处理尝试2的方案。理由: 在保证结节召回率的同时,精确率更高,有利于后续的假阳性筛选。

通过这样系统化的分析、预处理、替代方案尝试和评估,你就能逐步积累起应对各种复杂图像二值化问题的经验,不再盲目依赖Otsu,也不再对失败的结果感到困惑。记住,在计算机视觉的工程实践中,理解工具的局限性,并学会为不同的问题挑选或组合不同的工具,远比掌握任何一个单一算法更重要。

二值化方法 一、全局阈值法 1.固定阈值方法 该方法是对于输入图像中的所有像素点统一使用同一个固定阈值。其基本思想如下: 其中,T为全局阈值。 缺点:很难为不同的输入图像确定最佳阈值。 2.Otsu算法 Otsu算法又称最大类间方差法 先明确两个概念: (1)均值 (2)方差 图像的阈值化处理,就是将图像分为两个部分,高于阈值的部分,和小于阈值的部分。(暂不考虑多阈值的情况)。那么,如果将图像的每一个像素点的强度作为一个数据集合中的单元,那么,阈值化就相当于是一个二... 阅读详情

相关推荐

图像二值化核心技术:从OTSU到自适应阈值,实战避坑指南

图像处理的基础概念之一,二值化是将灰度或彩色图像转换为仅包含黑白两色的过程,其核心原理在于通过设定阈值来分离前景与背景。这项技术是实现计算机视觉中目标识别、测量与分析的关键预处理步骤,具有极高的技术价值。在工程实践中,针对不同应用场景如文档扫描、工业质检和车牌识别,需灵活选用全局阈值法(如经典的OTSU算法)或局部自适应阈值法。本文聚焦于**OTSU算法**与**自适应阈值**这两种核心方法,深入剖析其原理、参数调优及在复杂光照下的实战应用,帮助开发者构建鲁棒的图像分析基础。

weixin_29046611的博客 283

图像处理避坑指南:为什么你的二值化效果总不理想?从直方图分析到参数调优全解析

本文深入解析图像二值化效果不理想的常见问题,从直方图分析到参数调优提供全面解决方案。针对全局阈值、自适应阈值等算法,详细讲解其适用场景与调优技巧,帮助开发者提升文档扫描、OCR预处理等场景中的图像处理效果。

weixin_30952535的博客 323

图像二值化实战指南:从OTSU算法到自适应阈值的场景应用

本文深入解析图像二值化的核心技术与场景应用,重点对比了OTSU算法与自适应阈值方法。OTSU算法通过最大化类间方差自动寻找全局最佳阈值,适用于光照均匀的文档扫描场景;而自适应阈值则采用“分区治理”策略,通过计算局部阈值有效应对光照不均问题,是工业视觉检测等复杂场景的利器。文章提供了详细的操作指南与参数调试建议,并总结了从观察直方图到选择方法的实战决策树。

weixin_29099217的博客 607

从单体到云原生:Go微服务迁移全流程拆解,手把手教学

1024程序员节献礼!手把手教你用Go实现云原生微服务实战,从单体架构迁移全流程拆解,涵盖服务拆分、容器化部署与服务治理。适用于高并发场景,提升系统弹性与可维护性,Go语言高效实践方案值得收藏。

ProceNest的博客 786

OTSU一维算法概述

OTSU一维算法,我自己的理解是自适应阈值分割法,通过对灰度图的处理自行得到一个最佳的阈值,并最后用这个阈值二值化灰度图,参考了商丘师范学院的胡颖老师的>一文,但是我用的时候效果不是很理想,于是自己进行了稍微的变动, OTSU算法:就是计算出灰度图最佳阈值的算法 1.先对灰度

qinjianganying的专栏 1万+

5种阈值算法,3种失败原因,100%让你的图片二值化不再“变灰“!

C#图像二值化实战指南:从基础原理到高级优化,全面解析5种阈值算法的适用场景与实现细节。关键发现: 算法选择决定效果:固定阈值准确率仅45%,Otsu算法可达95% 光照处理是核心:局部自适应使光照不均图像识别率提升28% 混合策略最优:自动算法选择方案实现92%平均准确率 性能权衡:Otsu算法以0.5ms处理时间换取50%准确率提升 数据证明:合理选择阈值算法可使图像识别效果提升2倍以上,开发者应根据具体场景在精度与效率间取得平衡。

java专栏 1504

opencv-python:12_图像阈值(二值化、固定阈值、自适应阈值、Otsu二值化、cv2.threshold,cv2.adaptiveThreshold)

图像阈值 固定阈值,自适应阈值,Otsu 二值化等 相关函数: cv2.threshold,cv2.adaptiveThreshold 等。 全局阈值和局部阈值 一、图像二值化 定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。 灰度值0:黑,灰度值255:白 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。

余喵爱吃鱼的博客 4732

OpenCV图像阈值:简单阈值、自适应阈值、OTSU、TRIANGLE

简单阈值(全局阈值) 全局阈值意味着整幅图像以一个固定的值进行分割。 阈值化,即图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。 在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值

thequitesunshine007的博客 5304

Python - OpenCV 图像二值化处理

图像二值化处理时图像处理过程中非常常见的一种操作,在python中比较常用的主要是opencv,pil两个第三库,对比来看的话,opencv使用要更加的方便灵活, 文本主要介绍以下基于opencv的图像二值化处理方法。 首相我们来看一种比较简单的图像二值化处理方法。 全局阈值二值化 主要思路就是设置一个阈值,低于该阈值的像素置为0(黑色),高于该阈值的像素置为255(白色),下面来看代码 def image_binarization(img): # 将图片转为灰度图 .

小小晓晓阳的博客 3万+

opencv学习笔记七:使用cv2.threshold实现全局和OTSU阈值二值化

首先介绍一下函数:ret, dst = cv2.threshold(src, thresh, maxval, type)的各参数含义 src: 输入图,只能输入单通道图像,通常来说为灰度图 thresh: 阈值 maxval: 当像素值超过了阈值或者小于阈值,根据type所决定的要赋予像素点的值 type 含义 cv2.THRESH_BINARY 超过阈值部分取maxval(最...

耐心的小黑的博客 4821

OTSU算法:图像二值化中的最佳阈值确定技术

在图像处理领域,二值化技术是将图像从灰度或彩色转换为黑白两种颜色的过程。这种技术的目的是简化图像数据,使图像处理变得更为高效和快速。二值化图像在目标检测、模式识别和机器视觉等领域有着广泛的应用。例如,对于文档扫描后的图像,进行二值化处理可以轻松将文字与背景分离,便于后续的OCR(Optical Character Recognition,光学字符识别)处理。再比如,对于医学图像,二值化可以更明显地区分出病灶区域和健康组织。

weixin_28931507的博客 947

图像二值化算法

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding)进行二值化。 根据阈值选取方式的不同,可以分为全局阈值和局部阈值。

伊木子曦的博客 4884

保姆级教程:在PyCharm里用Continue插件一键接入DeepSeek API(含乱码修复)

本文详细介绍了如何在PyCharm中通过Continue插件无缝集成DeepSeek API,提供从环境准备到高级配置的全流程指南,包括解决常见的乱码问题。通过本教程,开发者可以轻松实现AI编程助手的高效调用,提升代码编写和调试效率。

weixin_30275415的博客 850

Python+OpenCV二值化避坑指南:为什么你的车牌识别总失败?从阈值选择到OTSU算法详解

本文深入探讨了在车牌识别项目中,使用Python和OpenCV进行图像二值化时常见的陷阱与解决方案。针对复杂光照导致识别失败的问题,文章从基础的全局阈值选择讲起,重点解析了自适应阈值和OTSU算法的原理、应用场景与参数调优技巧,并提供了实战融合策略,帮助开发者构建鲁棒的图像预处理流程。

q5r6s7的博客 871

SAP采购含税价转换的底层逻辑解析:ABAP例程如何实现价税分离计算

本文深入解析SAP系统中采购含税价与不含税价的转换机制,重点介绍VOFM例程和ABAP代码实现价税分离计算的方法。通过详细讲解数学原理、税率体系及SAP定价引擎架构,为开发人员提供完整的解决方案,帮助提升采购业务中的价格处理效率和准确性。

weixin_29237635的博客 451

用yolov8训练自己的模型并调取摄像头实时检测,新手小白超友好教程!逻辑梳理,从0开始逐步实操❤

帮新手小白学会用yolov8,包含多篇高质量博客整理

Lhhhhds的博客 2941

opencv otsu二值化

在第一部分中我们提到过 retVal,当我们使用 Otsu 二值化时会用到它。那么它到底是什么呢?   在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其...

luoganttcc的博客 2821

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化

基础版笔记链接: python3+opencv学习笔记汇总目录(适合基础入门学习) 基础版二值化讲解 opencv学习笔记10:阈值分割 图像二值化原理 二值化方法:全局阈值,局部阈值 具体原理见上面链接 图像二值化实现 全局阈值 通常情况,我们一般不知道设定怎样的阈值thresh才能得到比较好的二值化效果,只能去试。如对于一幅双峰图像(理解为图像直方图中存在两个峰),我们指定的阈值应尽量在两个峰之间的峰谷。这时,就可以用第四个参数THRESH_OTSU,它对一幅双峰图像自动根据其直方图计算出合适的阈值(

总裁余(余登武)博客 3369

基于Agent与大模型的性能测试脚本自动化生成实践

性能测试是软件质量保障的关键环节,其核心在于模拟真实用户负载以评估系统在高并发下的表现。传统脚本编写依赖人工,效率低下且易出错。通过引入智能体(Agent)与大语言模型(LLM)技术,可实现从自然语言描述或接口文档到可执行脚本的自动化转换。Agent负责任务规划与工具调用,LLM则提供强大的意图理解与代码生成能力,二者结合能精准解析测试场景、自动处理参数化与接口关联等复杂逻辑。该技术方案显著提升了脚本生成效率与准确性,尤其适用于持续集成、海量接口回归等需要快速构建测试场景的工程实践。本文以JMeter和Lo

weixin_28718769的博客 261

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 407

【C++ OpenCV】阈值二值化、阈值反二值化、截断、阈值取零、阈值反取零、自适应阈值使用方法以及时机

阈值:简单来说就是一把分割图像像素的标尺,在二值化处理中有固定阈值和自适应阈值两种形式。那么什么时候用固定阈值,什么时候使用自适应阈值呢?答:当图像,且目标和背景容易区分时,可以采用固定阈值当图像,且有,虽然使用大津法和三角形法也可以自己寻找阈值,但整个图像阈值都是相同,所以最终分割效果较差。所以,可以用,或者将整个图像成几行几列,对每个部分运用大津法或者三角形法,最后将图形整合,这样每一部分的阈值就不相同,分割效果也会更好。

dagengen12138的博客 7375

1.2、基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

XU157303764的博客 2911

opencv二值化详解

二值化 学习了二值化,我通过看了很多资料,希望通过总结和大家一起学习,一起努力,有错误,希望大家指正 在处理图片操作时,二值化在图片领域占有很大作用 在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓 opencv中,提供了多种二值化方法 以8位图为例(即值为0-255) 方法one: cv2.THRESH_BINARY 像素灰度...

qq_36665643的博客 2万+

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 682

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【图像分割】基于OTSU法实现图像分割,香农熵阈值迭代 最佳阈值 直方图附Matlab代码

图像分割是计算机视觉中的一个基本任务,其目标是将图像分成多个具有不同特征的区域,以便于后续的图像分析和理解。在众多图像分割方法中,基于阈值分割法凭借其简单、快速、易于实现的特点而被广泛应用。而OTSU算法作为一种经典的自动阈值分割方法,利用图像直方图的统计特征来寻找最佳阈值,从而实现图像的二值化分割。本文将深入探讨基于OTSU法实现图像分割的原理,并结合香农熵阈值迭代算法来提升分割效果。我们将从图像直方图、OTSU算法原理、香农熵阈值迭代算法以及应用示例等方面进行详细阐述。1. 图像直方图。

matlab_dingdang的博客 1158

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: LPS22HH气压传感器6种FIFO模式详解:从Bypass到Continuous的动态切换
下一篇: ModelSim仿真效率提升:如何正确使用Run All避免重复工作(附实例代码)
php55
博客等级 码龄15年 51粉丝 1553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值