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

OpenCV的图像分割

1、基本概念

图像分割是计算机视觉和图像处理中的一个关键步骤,它指的是将图像划分为多个区域或对象的过程。这些区域或对象在某种特性(如颜色、形状、纹理或亮度等)上是一致的或相似的,而在不同区域之间则存在明显的差异。图像分割的目标是从图像中提取出感兴趣的部分,以便于后续的图像分析和理解。
具体来说,图像分割可以进一步细分为不同的类型,包括:

  1. 阈值分割:这是最简单的一种分割方法,它基于图像的灰度值或颜色值来设定一个或多个阈值,从而将图像分割为不同的区域。例如,在二值化过程中,选择一个阈值,将高于该阈值的像素设为白色,低于该阈值的像素设为黑色。
  2. 基于边缘的分割:这种方法依赖于图像中的边缘信息,即灰度值或颜色值发生显著变化的位置。通过检测这些边缘,可以将图像划分为不同的部分。
  3. 基于区域的分割:这种方法根据像素的相似性将图像划分为区域。常见的算法包括区域生长和分裂合并等。
  4. 基于图论的分割:如最小割/最大流算法等,将图像视为一个图,像素作为图的节点,节点之间的相似性作为边的权重,通过求解图的最优划分来实现图像分割。
  5. 基于深度学习的分割:近年来,随着深度学习技术的发展,基于卷积神经网络(CNN)的图像分割方法取得了显著的效果。这些方法通过学习大量的训练数据来自动提取图像特征,并实现对图像的精确分割。例如,全卷积网络(FCN)、U-Net等模型在医学图像分割、场景理解等领域得到了广泛应用。

2、OpenCV的分割API

2.1 threshold

cv.threshold 是 OpenCV 库中用于图像阈值化处理的一个非常重要的函数,使用最多的就是其中包含的OTSU分割方法,又称大津法。其函数原型和参数详细解释如下:

retval, dst = cv.threshold(src, thresh, maxval, type[, dst])

参数详细解释

  1. src:输入图像。这可以是 8 位的灰度图,也可以是 32 位的浮点数图像。但在实际应用中,阈值处理通常在灰度图像上进行。
  2. dst:输出图像。与输入图像具有相同的大小和类型。函数处理后的图像将存储在这里。
  3. thresh:这是用于将像素分类的阈值。如果源图像中某个像素的灰度值大于或等于这个阈值,则目标图像中对应像素的灰度值将被设置为 maxval(对于某些阈值类型,如 THRESH_BINARY);否则,将被设置为 0(对于 THRESH_BINARY 类型)。
  4. maxval:当像素值超过(或在某些阈值类型下,小于)阈值时应该赋予的新值。对于二值化操作,这个值通常是 255,表示白色。
  5. type:阈值类型,决定了阈值操作的具体方式。常见的阈值类型包括:
  • cv::THRESH_BINARY(或 cv2.THRESH_BINARY 在 Python 中):二值化。大于阈值的像素被设置为 maxval,小于阈值的像素被设置为 0。
  • cv::THRESH_BINARY_INV(或 cv2.THRESH_BINARY_INV):反二值化。与 THRESH_BINARY 相反,小于阈值的像素被设置为 maxval,大于阈值的像素被设置为 0。
  • cv::THRESH_TRUNC(或 cv2.THRESH_TRUNC):截断。大于阈值的像素被设置为阈值本身,小于阈值的像素保持不变。
  • cv::THRESH_TOZERO(或 cv2.THRESH_TOZERO):设为零。大于阈值的像素保持不变,小于阈值的像素被设置为 0。
  • cv::THRESH_TOZERO_INV(或 cv2.THRESH_TOZERO_INV):反向设为零。小于阈值的像素保持不变,大于阈值的像素被设置为 0。
  • cv::THRESH_OTSU 和 cv::THRESH_TRIANGLE:这两种类型用于自动计算最佳阈值,而不是使用固定的阈值。它们通常与其他阈值类型结合使用,以获取更好的分割效果。函数返回实际使用的阈值。

OTSU的分割方法,对于图像直方图为双峰的场景,分割效果较好。示例代码如下:

import cv2 as cv
import numpy as npdef OTSU(input):_, bw = cv.threshold(input, 128, 255, cv.THRESH_OTSU)return bwif __name__ == '__main__':image = cv.imread('sky.jpg', cv.IMREAD_GRAYSCALE)bw = OTSU(image)result = np.concatenate([image, bw], axis=1)cv.imwrite('otsu.jpg', result)cv.imshow('bw', bw)cv.waitKey()

在这里插入图片描述

2.2 adaptiveThreshold

adaptiveThreshold是OpenCV中的自适应分割函数,这个函数允许为图像的不同部分应用不同的阈值,特别适用于处理光照不均或背景复杂变化的场景,比如文档图像。

void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);

参数说明

  • src:输入的8位单通道图像,通常是灰度图。
  • dst:输出图像,与输入图像有相同的尺寸和类型。
  • maxValue:当像素值超过(或根据阈值类型小于)计算得到的阈值时赋予的像素值。
  • adaptiveMethod:使用的自适应阈值算法。有两种选择:
    • cv::ADAPTIVE_THRESH_MEAN_C:表示使用局部区域的平均值减去C来计算阈值。
    • cv::ADAPTIVE_THRESH_GAUSSIAN_C:表示使用局部区域的高斯加权和减去C来计算阈值。
    • thresholdType:阈值类型,必须是cv::THRESH_BINARY或cv::THRESH_BINARY_INV。
    • THRESH_BINARY:如果像素值大于阈值,则设为最大值,否则设为0。
    • THRESH_BINARY_INV:如果像素值大于阈值,则设为0,否则设为最大值。
  • blockSize:局部区域的大小,用于计算阈值,必须是正奇数。
  • C:从均值或加权均值中减去的常数。
    示例代码如下:
import cv2 as cv
import numpy as np
def Ada(input):bw = cv.adaptiveThreshold(input, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, 5)return bwif __name__ == '__main__':image = cv.imread('doc.jpg', cv.IMREAD_GRAYSCALE)bw = Ada(image)result = np.concatenate([image, bw], axis=1)cv.imwrite('doc-result.jpg', result)cv.imshow('bw', bw)cv.waitKey()

在这里插入图片描述

2.3 边缘分割Canny算子

函数定义

edges = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

参数说明

  • image(InputArray类型):输入图像,应为单通道的8位图像(灰度图像)。在Python中,这个参数直接传入图像变量即可。
  • edges(OutputArray类型):输出图像,用于存放检测到的边缘。这个图像应与原图像具有相同的尺寸和类型。在Python中,这个参数通常是可选的,因为函数会返回一个包含边缘的图像。
  • threshold1(double类型):第一个滞后性阈值(低阈值),用于弱边缘的检测。这个阈值较低,可以捕获更多的边缘细节,但也可能导致噪声被误检为边缘。
  • threshold2(double类型):第二个滞后性阈值(高阈值),用于强边缘的检测。这个阈值较高,可以确保检测到的边缘更加显著和连续。通常,高低阈值的比在2:1到3:1之间效果较好。
  • apertureSize(int类型,默认为3):Sobel算子的尺寸,即用于计算图像梯度的滤波器的孔径大小。这个参数影响边缘检测的灵敏度和精度。
  • L2gradient(bool类型,默认为false):一个计算图像梯度幅值的标识。如果设为true,则使用L2范数来计算梯度幅度(即两个方向倒数的平方和再开方);如果设为false,则使用L1范数(即将两个方向导数的绝对值相加)。L2范数通常能提供更精确的结果,但计算量稍大。

示例代码:

import cv2 as cv
import numpy as np
if __name__ == '__main__':image = cv.imread('lingjian.jpg', cv.IMREAD_GRAYSCALE)bw = cv.Canny(image, 30, 90)result = np.concatenate([image, bw], axis=1)cv.imwrite('lingjian-result.jpg', result)cv.imshow('bw', bw)cv.waitKey()

在这里插入图片描述

3、小结

1、图像处理的分割方法一般都是针对特定的应用场景进行开发,因此,API的调参是工作中常见的任务。
2、二值化是图像分割的特殊情况,图像分割是一项基本的视觉任务。

相关文章:

OpenCV的图像分割

1、基本概念 图像分割是计算机视觉和图像处理中的一个关键步骤,它指的是将图像划分为多个区域或对象的过程。这些区域或对象在某种特性(如颜色、形状、纹理或亮度等)上是一致的或相似的,而在不同区域之间则存在明显的差异。图像分…...

【源码+文档+调试讲解】农产品研究报告管理系统

摘 要 农产品研究报告管理系统是一个旨在收集、整理、存储和分析农产品相关研究数据的综合性平台。农产品研究报告管理系统通常包含一个强大的数据库,它能够处理大量的研究数据,并对这些数据进行有效的管理和备份。农产品研究报告管理系统是现代农业科学…...

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…...

高可用虚拟IP-keepalived

个人觉得华为云这个文档十分详细:使用虚拟IP和Keepalived搭建高可用Web集群_弹性云服务器 ECS_华为云 应用场景:虚拟IP技术。虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个…...

AI多模态技术介绍:视觉语言模型(VLMs)指南

本文作者:AIGCmagic社区 刘一手 AI多模态全栈学习路线 在本文中,我们将探讨用于开发视觉语言模型(Vision Language Models,以下简称VLMs)的架构、评估策略和主流数据集,以及该领域的关键挑战和未来趋势。通…...

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流:用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…...

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…...

ws 配置 IngressRoute 和 http一样

ws 配置 IngressRoute 和 http一样 apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata:name: web-ws-ingressroutenamespace: starp spec:entryPoints:- webroutes:- match: Host(webws.we…...

IMX6ULL的IOMUXC寄存器和SNVS复用寄存器似乎都是对引脚指定复用功能的,那二者有何区别?

IMX6ULL 的 IOMUXC 和 SNVS(Secure Non-Volatile Storage)复用寄存器都是用于配置引脚功能的,但它们的作用范围、目的和使用场景存在明显区别。以下是它们的差异分析: 1. IOMUXC(I/O Multiplexer Control)寄…...

LabVIEW实现动态水球图的方法

水球图是一种直观展示百分比数据的图表,常用于数据监测与展示。LabVIEW 虽不直接支持水球图绘制,但可通过图片控件动态绘制波形,或借助 HTMLCSS 的 Web 控件实现。此外,还可以结合 Python 等第三方工具生成水球图,LabV…...

【江协STM32】11-2/3 W25Q64简介、软件SPI读写W25Q64

1. W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景存储介质:Nor Flash(闪存)时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容…...

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例:对向量进行旋转 典型算例:旋转的复合 2.3 …...

算法日记2:洛谷p3853路标设置(二分答案)

一、题目: 二、解题思路: 2.1:首先,我们二分空旷指数 1、因为题目中要求我们求解最大值最小应该是属于第二类模型2.也就是说,当check()函数为true时候,说明这个空旷指数是成立的,对应的路标数…...

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构(一)远程管理系统(二)资源管理系统(三)SLA 管理系统(四)计费管理系统 二、安全与可靠性保障(一)数据安全防线(…...

Blender常规设置

移动:Shift鼠标中键 旋转:鼠标中键 缩放:Ctrl鼠标中键...

c++ 中的容器 vector、deque 和 list 的区别

表格汇总: 容器存储结构随机访问性能中间插入/删除性能两端插入/删除性能内存管理特点迭代器类型适用场景vector连续存储的动态数组 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n)(需要移动元素)末尾: O ( 1 ) O(1) O(1),头部…...

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码:项目源码 解压项目源码到本地 打开IDEA 左上角:文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件,点击确定,根据图示步骤继续导入项目 查看项目目录&#xff…...

数据集-目标检测系列- 电话 测数据集 call_phone >> DataBall

数据集-目标检测系列- 电话 测数据集 call DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! …...

VUE3 自定义指令的介绍

自定义指令的概述 在 Vue 中,自定义指令是一种机制,允许开发者在模板中直接操作 DOM 元素,执行一些低级别的操作。Vue 提供了几个内置指令(如 v-if、v-for、v-model 等),但当我们需要一些特定功能时&#…...

HTML学习笔记记录---速预CSS(2) 复合属性、盒子模型、边框线、浮动、定位

复合属性写法: {font: font-style font-weitght font-size/line-height font-family} {font: 样式 粗细 字号 字体} (书写瞬间为固定的不可更改) block 块级元素 div inline 行内元素 span inline-block 行内块元素 …...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...