opencv—常用函数学习_“干货“_5
目录
十五、图像分割
简单阈值分割 (threshold)
自适应阈值分割 (adaptiveThreshold)
颜色范围分割 (inRange)
分水岭算法 (watershed)
泛洪填充 (floodFill)
GrabCut算法 (grabCut)
距离变换 (distanceTransform)
最大稳定极值区域检测 (MSER)
均值漂移滤波 (pyrMeanShiftFiltering)
十六、连通域
计算连通组件 (connectedComponents)
计算连通组件并返回统计信息 (connectedComponentsWithStats)
解释
http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)
散的正在一部分一部分发,不需要VIP。
资料整理不易,有用话给个赞和收藏吧。
十五、图像分割
在OpenCV中,图像分割是将图像分割成不同区域或对象的过程,常用于对象检测、识别和图像分析。下面介绍一些常用的图像分割函数及其使用示例。
| 图像分割函数 | ||||
| threshold | adaptiveThreshold | inRange | watershed | floodFill |
| 简单阈值分割 | 自适应阈值分割 | 颜色范围分割 | 分水岭算法 | 泛洪填充 |
| grabCut | distanceTransform | MSER | pyrMeanShiftFiltering | |
| GrabCut算法 | 距离变换 | 最大稳定极值区域检测 | 均值漂移滤波 | |
简单阈值分割 (threshold)
import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 应用简单阈值分割
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
自适应阈值分割 (adaptiveThreshold)
# 应用自适应阈值分割
adaptive_thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)
cv2.imshow('Adaptive Threshold Image', adaptive_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
颜色范围分割 (inRange)
# 读取彩色图像
color_image = cv2.imread('path_to_image.jpg')# 定义颜色范围
lower_bound = np.array([0, 120, 70])
upper_bound = np.array([10, 255, 255])# 转换到HSV颜色空间
hsv_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2HSV)# 应用颜色范围分割
mask = cv2.inRange(hsv_image, lower_bound, upper_bound)
cv2.imshow('Mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
分水岭算法 (watershed)
# 读取图像并转换为灰度图
gray = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 确定背景区域
kernel = np.ones((3, 3), np.uint8)
sure_bg = cv2.dilate(binary, kernel, iterations=3)# 确定前景区域
dist_transform = cv2.distanceTransform(binary, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)# 确定未知区域
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)# 标记连通组件
_, markers = cv2.connectedComponents(sure_fg)# 为确保背景为1,增加1
markers = markers + 1# 将未知区域标记为0
markers[unknown == 255] = 0# 应用分水岭算法
markers = cv2.watershed(color_image, markers)
color_image[markers == -1] = [0, 0, 255]cv2.imshow('Watershed', color_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
泛洪填充 (floodFill)
# 应用泛洪填充
flood_filled = color_image.copy()
h, w = flood_filled.shape[:2]
mask = np.zeros((h + 2, w + 2), np.uint8)
cv2.floodFill(flood_filled, mask, (0, 0), (255, 0, 0))cv2.imshow('Flood Fill', flood_filled)
cv2.waitKey(0)
cv2.destroyAllWindows()
GrabCut算法 (grabCut)
# 初始化掩码
mask = np.zeros(color_image.shape[:2], np.uint8)# 定义矩形
rect = (50, 50, 450, 290)# 定义模型
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)# 应用GrabCut算法
cv2.grabCut(color_image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
grabcut_image = color_image * mask2[:, :, np.newaxis]cv2.imshow('GrabCut', grabcut_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
距离变换 (distanceTransform)
# 应用距离变换
dist_transform = cv2.distanceTransform(binary, cv2.DIST_L2, 5)
cv2.imshow('Distance Transform', dist_transform)
cv2.waitKey(0)
cv2.destroyAllWindows()
最大稳定极值区域检测 (MSER)
# 创建MSER对象
mser = cv2.MSER_create()# 检测MSER区域
regions, _ = mser.detectRegions(gray)# 绘制检测到的区域
output = color_image.copy()
for p in regions:hull = cv2.convexHull(p.reshape(-1, 1, 2))cv2.polylines(output, [hull], 1, (0, 255, 0))cv2.imshow('MSER', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
均值漂移滤波 (pyrMeanShiftFiltering)
# 应用均值漂移滤波
mean_shift_image = cv2.pyrMeanShiftFiltering(color_image, 21, 51)
cv2.imshow('Mean Shift Filtering', mean_shift_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这些示例展示了如何使用OpenCV中的各种图像分割函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像分割任务。
十六、连通域
在OpenCV中,连通域分析是图像处理中的一个重要步骤,用于检测和标记图像中的连通区域。主要有两个函数:connectedComponents 和 connectedComponentsWithStats。下面介绍这些函数及其使用示例。
| 连通域分析函数 | |
| connectedComponents | connectedComponentsWithStats |
| 计算连通组件 | 计算连通组件并返回统计信息 |
计算连通组件 (connectedComponents)
import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 应用阈值处理
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 计算连通组件
num_labels, labels = cv2.connectedComponents(binary_image)# 显示结果
label_hue = np.uint8(179 * labels / np.max(labels))
blank_ch = 255 * np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])# 转换到BGR颜色空间
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)# 设置背景为黑色
labeled_img[label_hue == 0] = 0cv2.imshow('Connected Components', labeled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
计算连通组件并返回统计信息 (connectedComponentsWithStats)
# 计算连通组件及统计信息
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image)# 输出每个连通组件的统计信息
for i in range(num_labels):print(f"Component {i}:")print(f" Bounding box: {stats[i, cv2.CC_STAT_LEFT]}, {stats[i, cv2.CC_STAT_TOP]}, "f"{stats[i, cv2.CC_STAT_WIDTH]}, {stats[i, cv2.CC_STAT_HEIGHT]}")print(f" Area: {stats[i, cv2.CC_STAT_AREA]}")print(f" Centroid: {centroids[i]}")# 显示结果
label_hue = np.uint8(179 * labels / np.max(labels))
blank_ch = 255 * np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])# 转换到BGR颜色空间
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)# 设置背景为黑色
labeled_img[label_hue == 0] = 0cv2.imshow('Connected Components with Stats', labeled_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
解释
connectedComponents:此函数返回连通组件的数量和每个像素所属的标签。connectedComponentsWithStats:此函数除了返回标签外,还返回每个连通组件的统计信息(如边界框、面积)和重心。
这些示例展示了如何使用OpenCV中的连通域分析函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的连通域检测和分析任务。
相关文章:
opencv—常用函数学习_“干货“_5
目录 十五、图像分割 简单阈值分割 (threshold) 自适应阈值分割 (adaptiveThreshold) 颜色范围分割 (inRange) 分水岭算法 (watershed) 泛洪填充 (floodFill) GrabCut算法 (grabCut) 距离变换 (distanceTransform) 最大稳定极值区域检测 (MSER) 均值漂移滤波 (pyrMean…...
JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)
JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA) CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…...
Redis的安装配置及IDEA中使用
目录 一、安装redis,配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…...
ubuntu 物理内存爆炸而不使用虚拟内存的问题
ubuntu 物理内存不足时有时候会不去使用虚拟内存,让虚拟内存空闲,而直接关闭占用内存的进程,如果在进行模型测试或训练时,就会导致训练或测试进程被杀死。 1. 修改 swappiness: cat /proc/sys/vm/swappiness sudo sysc…...
Python实现音频均衡和降噪
使用librosa库来读取音频文件,音频处理是一个复杂过程,这里只是简单的进行降噪和均衡。 import librosa import soundfile as sf def improve_audio_quality(input_file, output_file): # 读取音频文件 audio, sample_rate librosa.load(input_…...
【JavaScript 算法】贪心算法:局部最优解的构建
🔥 个人主页:空白诗 文章目录 一、贪心算法的基本概念贪心算法的适用场景 二、经典问题及其 JavaScript 实现1. 零钱兑换问题2. 活动选择问题3. 分配问题 三、贪心算法的应用四、总结 贪心算法(Greedy Algorithm)是一种逐步构建解…...
Azcopy Sync同步Azure文件共享
文章目录 Azcopy Sync同步文件共享一、工作原理二、安装 AzCopy在 Windows 上在 Linux 上 三、资源准备1. 创建源和目标 Azure 存储账户2. 创建源和目标文件共享3. 确定路径4. 生成源和目的存储账户的共享访问签名(SAS)令牌配置权限示例生成的 URL 四、A…...
单例模式 饿汉式和懒汉式的区别
单例模式(Singleton Pattern)是设计模式中最简单、最常见、最容易实现的一种模式。它确保一个类仅有一个实例,并提供一个全局访问点。单例模式主要有两种实现方式:饿汉式(Eager Initialization)和懒汉式&am…...
Python中的模块和包的定义以及如何在Python中导入和使用它们
在Python中,模块(Module)和包(Package)是组织代码以便重用和共享的基本单元。它们使得Python代码更加模块化,易于管理和维护。 模块(Module) 模块是一个包含Python代码的文件&…...
设计模式使用场景实现示例及优缺点(结构型模式——组合模式)
结构型模式 组合模式(Composite Pattern) 组合模式使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元…...
《系统架构设计师教程(第2版)》第11章-未来信息综合技术-06-云计算(Cloud Computing) 技术概述
文章目录 1. 相关概念2. 云计算的服务方式2.1 软件即服务 (SaaS)2.2 平台即服务 (PaaS)2.3 基础设施即服务 (IaaS)2.4 三种服务方式的分析2.4.1 在灵活性2.4.2 方便性方 3. 云计算的部署模式3.1 公有云3.2 社区云3.3 私有云3.4 混合云 4. 云计算的发展历程4.1 虚拟化技术4.2 分…...
网络安全工作者如何解决网络拥堵
网络如同现代社会的血管,承载着信息的血液流动。然而,随着数据流量的激增,网络拥堵已成为不容忽视的问题,它像是一场数字世界的交通堵塞,减缓了信息传递的速度,扰乱了网络空间的秩序。作为网络安全的守护者…...
电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法
mfc140u.dll是什么?为什么电脑会出现mfc140u.dll丢失?那么mfc140u.dll丢失会给电脑带来什么影响?mfc140u.dll丢失怎么办?今天详细给大家一一探讨一下mfc140u.dll文件与mfc140u.dll丢失的多种不同解决方法分享! 一、mfc…...
ospf的MGRE实验
第一步:配IP [R1-GigabitEthernet0/0/0]ip address 12.0.0.1 24 [R1-GigabitEthernet0/0/1]ip address 21.0.0.1 24 [R1-LoopBack0]ip address 192.168.1.1 24 [ISP-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [ISP-GigabitEthernet0/0/1]ip address 21.0.0.2 24…...
开发指南047-前端模块版本
平台前端框架内置了一个文件version.vue <template> <div> <br> 应用名称: {{name}} <br> 当前版本:{{version}} <br> 服务网关: {{gateway}} </div> </template> <scrip…...
c#中的字符串方法
Concat() String.Concat(字符串1 字符串n) 字符串拼接 Contains () 字符串1.Contains(字符串2) 字符串1是否包含字符串2返回布尔值 CopyTo() 字符串1.CopyTo(0,空数组,0,5); 从哪开始 复制到哪里 从哪开始存 存储的个数 tartsWith 字符串1.StartsWith("字符串") 以…...
成像光谱遥感技术中的AI革命:ChatGPT
遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力,ChatGPT在遥感中的应用,人工智能在…...
学习分布式事务遇到的小bug
一、介绍Seata 在处理分布式事务时我用到是Seata,Seata的事务管理中有三个重要的角色: TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…...
ElasticSearch学习之路
前言 为什么学ElasticSearch? 数据一般有如下三种类型: 结构化数据,如:MySQL的表,一般通过索引提高查询效率非结构化数据,如:图片、音频等不能用表结构表示的数据,一般保存到mong…...
(C++二叉树02) 翻转二叉树 对称二叉树 二叉树的深度
226、翻转二叉树 递归法: 交换两个结点可以用swap()方法 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(root NULL) return NULL;TreeNode* tem root->left;root->left root->right;root->right tem;invertTree(root->l…...
收藏干货:MySQL/PG/人大金仓/达梦语法差异对照表
📌 专栏:国产数据库信创实战🔖 标签: #数据库语法差异 #MySQL转人大金仓 #MySQL转达梦 #PG语法适配 #信创数据库迁移 #SQL兼容改造 #国产数据库适配 #SpringBoot3数据库适配📝 文章摘要信创国产化迁移过程中࿰…...
YOLOv5实战解析——激活函数的选择与调优
1. 激活函数在YOLOv5中的核心作用 第一次接触YOLOv5时,我被它的检测精度惊艳到了。但真正让我困惑的是:为什么同样的网络结构,换个激活函数效果就天差地别?后来在调试一个工业质检项目时,我才彻底明白激活函数的重要性…...
以太网口模块PCB设计全解析:从信号完整性到EMC的实战指南
1. 项目概述:为什么以太网口模块的PCB设计值得深究?干了这么多年硬件设计,画过的板子不计其数,但每次遇到带以太网口的项目,心里还是会多一份谨慎。这玩意儿看着简单,RJ45插座加个变压器,再连到…...
LabVIEW虚拟仪表开发:从图形化编程到工业测控系统实战
1. 虚拟仪表:从概念到实践的革新 作为一名在工业自动化领域摸爬滚打了十多年的硬件工程师,我经历过从纯硬件调试到软硬件结合的漫长过程。早期,面对一个复杂的测试系统,我们往往需要堆满一桌子的真实仪器——示波器、信号发生器、…...
告别刷机兼容性噩梦:AnyKernel3如何让Android内核适配变得轻松
告别刷机兼容性噩梦:AnyKernel3如何让Android内核适配变得轻松 【免费下载链接】AnyKernel3 AnyKernel, Evolved 项目地址: https://gitcode.com/gh_mirrors/an/AnyKernel3 还在为不同Android设备的内核适配而烦恼吗?每次发布新内核都要为不同ROM…...
TEngine与服务器集成:.NET Core 8.0前后端一体化开发指南
TEngine与服务器集成:.NET Core 8.0前后端一体化开发指南 【免费下载链接】TEngine Unity 商用级别开发框架,原生内置 AI 工作流支持,集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案,构建高效、安…...
全域矩阵系统的底层逻辑:从流量分散到流量聚合的技术解法
矩阵运营最大的坑,不是做不起来,是做着做着就散了。账号在A平台火了,B平台没动静;今天发了20条,明天只剩3条能坚持——问题的本质不是能力不够,是缺乏一套把分散流量聚合起来的全域矩阵系统架构。一、全域流…...
电力系统时序一致性保障:elec-ops-prediction的长时序稳定性约束实现
电力系统时序一致性保障:elec-ops-prediction的长时序稳定性约束实现 【免费下载链接】elec-ops-prediction elec-ops-prediction 是 CANN 社区 Electrical Engineering SIG(电力行业兴趣小组)旗下的电力负荷预测算子库, 聚焦于电…...
掌握FreeRDP的5个核心场景:从基础连接到企业级部署实战指南
掌握FreeRDP的5个核心场景:从基础连接到企业级部署实战指南 【免费下载链接】FreeRDP FreeRDP is a free remote desktop protocol library and clients 项目地址: https://gitcode.com/gh_mirrors/fr/FreeRDP 作为开源远程桌面协议的标杆实现,Fr…...
四旋翼无人机深度强化学习控制框架与实战优化
1. 四旋翼无人机端到端深度强化学习框架解析四旋翼无人机的自主飞行控制一直是机器人学领域的核心挑战。传统PID控制虽然稳定可靠,但在复杂动态环境中表现受限。深度强化学习(DRL)通过模拟环境交互实现智能决策,为无人机控制带来了…...
