当前位置: 首页 > news >正文

【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

【Opencv–adaptiveThreshold】自适应阈值图像二值化

文章目录

  • 【Opencv--adaptiveThreshold】自适应阈值图像二值化
    • 1. 介绍
    • 2. adaptiveThreshold函数
      • 2.1 函数调用
      • 2.2 补充说明
    • 3. 代码示例
    • 4. 效果
      • 4.1 原图(ori.img)
      • 4.2 处理后
    • 5. 参考

1. 介绍

在这里 cv2.threshold函数 介绍了普通的opencv图像阈值处理函数。但threshold 的图像阈值处理对于某些光照不均的图像,这种全局阈值分割的方法并不能得到好的效果。

图像阈值化操作中,我们更关心的是从二值化图像中分离目标区域和背景区域,仅仅通过固定阈值很难达到理想的分割效果。在图片中的灰度是不均匀的,所以通常情况下图片中不同区域的阈值是不一样的。这样就需要一种方法根据图像不同区域亮度或灰度分布,计算其局部阈值来进行阈值处理。这种方法就是自适应阈值化图像处理,实际上这可以称为局部阈值法,在OpenCV中adaptiveThreshold就是这种方法。

2. adaptiveThreshold函数

2.1 函数调用

import cv2
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
  • 参数说明:

    • src:源图像,8位的灰度图。
    • maxValue:用于指定满足条件的像素设定的灰度值
    • adaptiveMethod:使用的自适应阈值算法,有2种类型ADAPTIVE_THRESH_MEAN_C算法(局部邻域块均值)或ADAPTIVE_THRESH_GAUSSIAN_C(局部邻域块高斯加权和)。
      • ADAPTIVE_THRESH_MEAN_C的计算方法是计算出邻域的平均值再减去第六个参数C的值;
      • ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出邻域的高斯均匀值再减去第六个参数C的值。
      • 处理边界时使用BORDER_REPLICATE | BORDER_ISOLATED模式。
    • thresholdType:阈值类型,只能是THRESH_BINARY或THRESH_BINARY_INV二者之一,具体参考上面“图像阈值处理”的表格
    • blockSize:表示邻域块大小,用来计算区域阈值,一般选择3、5、7……
    • C:表示常数,它是一个从均匀或加权均值提取的常数,通常为正数,但也可以是负数或零
  • 返回值:

    • dst:处理后的图像

2.2 补充说明

  1. 亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。
  2. 在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓。因此函数adaptiveThreshold除了将灰度图像二值化,也可以进行边缘提取。
  3. 之所以能进行边缘提取,是因为当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数。
  4. 当把blockSize设为比较大的值时,如blockSize=21 or 31 or 41时,adaptiveThreshold便是二值化函数
  5. blockSize必须为大于1的奇数(这里解释一下,size为偶数的话,该block的中心点就不确定了,因此为奇数。)
  6. 如果使用平均值方法,平均值mean为180,差值delta为10,maxValue设为255。那么灰度小于170的像素为0,大于等于170的像素为255,如果是反向二值化,灰度小于170的像素为255,大于等于170的像素为0。

3. 代码示例

import cv2img = cv2.imread('ori.jpg', 0)img1 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 3, 5)
cv2.imwrite("new1.jpg", img1)img2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 31, 5)
cv2.imwrite("new1.jpg", img2)

4. 效果

4.1 原图(ori.img)

在这里插入图片描述

4.2 处理后

  • new1.img
    在这里插入图片描述
  • new2.jpg
    在这里插入图片描述

可以看到,

  • 当blockSize小时,轮廓识别效果明显,突出边缘区域。
  • 而blockSize大时,就是一个二值化图像。

5. 参考

【1】https://blog.csdn.net/LaoYuanPython/article/details/108558834

相关文章:

【Opencv--自适应图像二值化】cv2.adaptiveThreshold()

【Opencv–adaptiveThreshold】自适应阈值图像二值化 文章目录【Opencv--adaptiveThreshold】自适应阈值图像二值化1. 介绍2. adaptiveThreshold函数2.1 函数调用2.2 补充说明3. 代码示例4. 效果4.1 原图(ori.img)4.2 处理后5. 参考1. 介绍 在这里 cv2.…...

洛谷P8601[蓝桥杯][2013年第四届真题]剪格子

题目描述如图 11 所示,33 的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是 60。本题的要求就是请你编程判定:对给定的 mn 的格子中的整数,是否可以分割为两个部分,使…...

配置alias实现快速生成.gitignore文件

git工具:版本控制开发工具。 cscope工具:用于浏览C源码的工具,类似于ctags。在代码根目录下执行cscope -Rbq,然后产生三个索引文件(cscope.out、cscope.in.out和cscope.po.out三个文件)。 在Linux下使用vi…...

MySQL数据库调优————GROUP BY及DISTINCT优化

GROUP BY 三种处理GROUP BY的方式 松散索引扫描(Loose Index Scan)紧凑索引扫描(Tight Index Scan)临时表(Temporary table) 三种方式的性能一次递减 松散索引扫描 无需扫描满足条件的所有索引键即可返…...

LRU缓存算法

双向链表哈希表(非线程安全) https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/ /*** LRU算法: 哈希表双向链表实现* 1. 双向链表按照被使用的顺序来存储, 靠近头部的节点是最近使用的, 靠近尾部的节…...

@Configuration注解

Configuration注解介绍 Configuration注解,用于标注一个类是一个spring的配置类(同时,也是一个bean),配置类中可以使用ComponentScan、Import、ImportResource 和 Bean等注解的方式定义beanDefinition。 Target(Elem…...

基于springboot+vue的食疗系统

基于springbootvue的食疗系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&…...

sklearn学习-朴素贝叶斯

文章目录一、概述1、真正的概率分类器2、sklearn中的朴素贝叶斯二、不同分布下的贝叶斯1、高斯朴素贝叶斯GaussianNB2、探索贝叶斯:高斯朴素贝叶斯擅长的数据集3、探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度总结一、概述 1、真正的概率分类器 算法…...

分享112个HTML艺术时尚模板,总有一款适合您

分享112个HTML艺术时尚模板,总有一款适合您 112个HTML艺术时尚模板下载链接:https://pan.baidu.com/s/1D3-mfPOud-f3vy9yLl-bmw?pwdfph2 提取码:fph2 Python采集代码下载链接:采集代码.zip - 蓝奏云 时尚平面模特网站模板 潮…...

用GDB远程调试运行于QEMU的程序

1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 测试环境 本文使用 Ubuntu 16.04.4 LTS QEMU 环境进行调试。 3. 用 GDB 调试 QEMU 内程序 3.1 编写用来调试的程序 我们用 ARM32 来进行调试…...

20 堆排序

文章目录1 堆排序的概念2 堆排序基本思想3 堆排序步骤图解说明4 堆排序的代码实现1 堆排序的概念 1) 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn)&#xf…...

2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 2023最新文件快递柜系统网站源码 | 匿名口令分享 | 临时文件分享 很多时候,我们都想将一些文件或文本传送给别人,或者跨端传递一些信息,但是我们又不…...

分片策略(二)

分片策略 基本概念 分片键 用于分片的字段,是将数据库或表拆分的字段,比如,我可以使用user_id作为分片键将用户数据分到不同的表中,这里的user_id就是分片键,除了这种单字段分片,ShardingSphere还支持多…...

Qt之调色板类QPalette的使用

文章目录QPalette调色板类前言代码知识点讲解QPalette调色板类 前言 Qt提供的调色板类QPalette专门用于管理部件的外观显示,相当于部件或对话框的调色板,管理他们所有的颜色信息。每个部件都包含一个QPalette对象,在显示时,按照…...

Kotlin 32. Kotlin 多语言支持

Kotlin 多语言支持 对于 Kotlin 来说&#xff0c;当我们新建一个项目时&#xff0c;会默认在 values/ 文件夹下&#xff0c;生成一个 strings.xml 文件。比如说&#xff0c; <resources><string name"app_name">exampleNewProject</string> <…...

【Flutter入门到进阶】Dart进阶篇---DartVM单线程设计原理

1 虚拟机的指令执行设计 1.1 虚拟机的分类 基于栈的虚拟机&#xff0c;比如JVM虚拟机 基于寄存器的虚拟机&#xff0c;比如Dalvik虚拟机 1.2 虚拟机的概念 首先问一个基本的问题&#xff0c;作为一个虚拟机&#xff0c;它最基本的要实现哪些功能&#xff1f; 他应该能够模拟…...

Dem和NvM(NVRAM Manager)的交集

NVRAM&#xff08;NvM&#xff09;提供了在NVRAM中存储数据Block的机制。 NVRAM Block&#xff08;最大大小取决于配置&#xff09;被分配给Dem&#xff0c;并由Dem实现事件状态信息和相关数据的永久存储&#xff08;例如通电复位&#xff09;。 ECU 状态管理器&#xff08;Ec…...

AI神经网络CNN/RNN/DNN/SNN的区别对比

@版权声明: 本文由 ChatGpt 创作; BiliBili: https://www.bilibili.com/video/BV17D4y1P7pM/?share_source=copy_web&vd_source=6d217e0ff6387a749dc570aba51d36fd 引言 随着人工智能技术的发展,神经网络作为人工智能的核心技术之一,被广泛应用于图像识别、语音识别、…...

【JavaWeb】一文学会JPA

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要介绍JPA的概念、注解实现ORM规范…...

【安卓逆向】APK修改与反编译回编译

【安卓逆向】反编译修改APK回编译使用工具流程步骤Apktool相关安装与使用常用命令备查APK签名命令备查实战练习反编译查看修改的地方使用Apktool反编译得到产物文件夹并进行修改回编APK实用场景在日常开发我们可能需要替换某些资源或者修改某些代码&#xff0c;但是我们没有源码…...

Go反射reflect包高级用法

Go语言反射机制探秘&#xff1a;深入reflect包高级用法 Go语言的反射机制通过reflect包为开发者提供了强大的运行时类型检查与操作能力。尽管反射会带来一定的性能开销&#xff0c;但在需要动态处理类型、实现泛型逻辑或构建框架时&#xff0c;它往往是不可替代的工具。本文将…...

2025.07.15【甲基化】methylKit实战指南:从Bioconductor安装到差异甲基化区域精准注释

1. methylKit&#xff1a;甲基化数据分析的瑞士军刀 第一次接触甲基化数据分析时&#xff0c;我被各种专业术语和复杂流程搞得晕头转向。直到发现了methylKit这个神器&#xff0c;才真正体会到什么叫"一站式解决方案"。作为R语言环境下最成熟的甲基化分析工具之一&a…...

逆向阿里系227滑块,除了n值,这几个固定参数(a/t/p/x5secdata)你确定拿对了吗?

逆向阿里系227滑块&#xff1a;那些被低估的固定参数陷阱 在逆向工程的世界里&#xff0c;我们常常被那些复杂的算法和动态生成的值所吸引&#xff0c;却忽略了那些看似简单却同样关键的固定参数。就像建造一座高楼&#xff0c;大家总是关注最显眼的钢结构&#xff0c;却很少有…...

告别背包焦虑:TQVaultAE如何彻底改变《泰坦之旅》装备管理体验

告别背包焦虑&#xff1a;TQVaultAE如何彻底改变《泰坦之旅》装备管理体验 【免费下载链接】TQVaultAE Extra bank space for Titan Quest Anniversary Edition 项目地址: https://gitcode.com/gh_mirrors/tq/TQVaultAE 对于《泰坦之旅》玩家来说&#xff0c;最令人沮丧…...

Obsidian: 图片管理插件-Local Images Plus与Paste Image Rename的进阶配置指南

1. 为什么需要图片管理插件 如果你经常用Obsidian写笔记&#xff0c;肯定遇到过这样的烦恼&#xff1a;从网页复制粘贴的图片默认存放在系统剪贴板&#xff0c;关闭笔记后图片就消失了&#xff1b;或者随手粘贴的图片文件名杂乱无章&#xff0c;过段时间根本分不清是哪篇笔记的…...

STM32H755双核MCU的以太网配置:避开Cache缓存和MPU的那些坑(CubeIDE实战)

STM32H755双核MCU以太网配置实战&#xff1a;Cache与MPU的深度优化指南 在嵌入式系统开发中&#xff0c;以太网通信已成为工业控制、物联网网关等场景的标配功能。而STM32H7系列凭借其双核架构和丰富的外设资源&#xff0c;成为高性能嵌入式应用的理想选择。然而&#xff0c;当…...

trackerjacker硬件推荐:选择最佳无线网卡提升监控效果

trackerjacker硬件推荐&#xff1a;选择最佳无线网卡提升监控效果 【免费下载链接】trackerjacker Like nmap for mapping wifi networks youre not connected to, plus device tracking 项目地址: https://gitcode.com/gh_mirrors/tr/trackerjacker trackerjacker是一款…...

5分钟搞定OpenClaw+Qwen3.5-9B:飞书机器人自动化办公配置

5分钟搞定OpenClawQwen3.5-9B&#xff1a;飞书机器人自动化办公配置 1. 为什么选择OpenClawQwen3.5-9B组合 上周五下午4点&#xff0c;当我第7次手动整理会议纪要时&#xff0c;突然意识到一个问题&#xff1a;为什么不让AI帮我完成这些重复性工作&#xff1f;经过周末两天的…...

StructBERT中文语义匹配系统开发者案例:语义向量用于排序模型特征

StructBERT中文语义匹配系统开发者案例&#xff1a;语义向量用于排序模型特征 1. 项目核心价值&#xff1a;从“虚高”到“精准”的跨越 如果你做过搜索推荐或者内容去重&#xff0c;大概率遇到过这样的头疼事&#xff1a;两段明明不相关的文本&#xff0c;用传统的语义模型一…...

Phi-3-Mini-128K多模型协作实践:与Claude Code协同完成复杂编程任务

Phi-3-Mini-128K多模型协作实践&#xff1a;与Claude Code协同完成复杂编程任务 1. 引言 你有没有遇到过这样的情况&#xff1f;面对一个稍微复杂的编程任务&#xff0c;比如要搭建一个带用户管理的小型Web应用&#xff0c;你让一个AI助手来帮忙。它可能很快给你生成了一段登…...