OpenCV图像滤波(13)均值迁移滤波函数pyrMeanShiftFiltering()的使用

news2024/11/24 7:39:49
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

函数执行均值迁移图像分割的初始步骤。
该函数实现了均值迁移分割的过滤阶段,即输出是经过滤波的“海报化”图像,其中颜色梯度和平滑纹理已被平坦化。对于输入图像(或缩小的输入图像,见下文)的每一个像素 (X,Y),函数都会执行均值迁移迭代,也就是说,在联合空间-色彩超空间中考虑像素 (X,Y) 的邻域:
( x , y ) : X − sp ≤ x ≤ X + sp , Y − sp ≤ y ≤ Y + sp , ∣ ∣ ( R , G , B ) − ( r , g , b ) ∣ ∣ ≤ sr (x,y): X- \texttt{sp} \le x \le X+ \texttt{sp} , Y- \texttt{sp} \le y \le Y+ \texttt{sp} , ||(R,G,B)-(r,g,b)|| \le \texttt{sr} (x,y):XspxX+sp,YspyY+sp,∣∣(R,G,B)(r,g,b)∣∣sr
其中 (R,G,B) 和 (r,g,b) 分别是在 (X,Y) 和 (x,y) 上的颜色分量向量(尽管算法并不依赖于所使用的颜色空间,因此任何 3 组件颜色空间都可以使用)。在邻域内找到平均空间值 (X’,Y’) 和平均颜色向量 (R’,G’,B’),它们作为下一次迭代的邻域中心:
( X , Y )   ( X ′ , Y ′ ) , ( R , G , B )   ( R ′ , G ′ , B ′ ) . (X,Y)~(X',Y'), (R,G,B)~(R',G',B'). (X,Y) (X,Y),(R,G,B) (R,G,B).
迭代完成后,初始像素(即迭代开始的像素)的颜色分量设置为最终值(最后一次迭代的平均颜色):
I ( X , Y ) < − ( R ∗ , G ∗ , B ∗ ) I(X,Y) <- (R*,G*,B*) I(X,Y)<(R,G,B)
当 maxLevel > 0 时,构建高斯金字塔,包含 maxLevel+1 层,并首先在最小层上运行上述过程。之后,结果传播到较大的层,并且仅在金字塔较低分辨率层的颜色与当前层的颜色相差超过 sr 的像素上再次运行迭代。这使得颜色区域的边界更加清晰。需要注意的是,结果实际上与在整个原始图像上运行均值迁移程序(即 maxLevel==0)的结果不同。

pyrMeanShiftFiltering 是 OpenCV 中的一个函数,用于实现均值迁移滤波(Mean Shift Filtering)。这是一种非局部均值滤波技术,可以用于图像分割、降噪等多种图像处理任务。

函数原型

void cv::pyrMeanShiftFiltering
(
	InputArray 	src,
	OutputArray 	dst,
	double 	sp,
	double 	sr,
	int 	maxLevel = 1,
	TermCriteria 	termcrit = TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1) 
)		

参数

  • 参数src 源图像,8 位、3 通道。
  • 参数dst 目标图像,与源图像格式和大小相同。
  • 参数sp 空间窗口半径。
  • 参数sr 颜色窗口半径。
  • 参数maxLevel 用于分割的最大金字塔层级。
  • 参数termcrit 终止准则:何时停止均值迁移迭代。

代码示例


#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 加载图像
    cv::Mat img = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_COLOR);

    if (img.empty()) {
        std::cout << "无法加载图像,请检查路径是否正确。" << std::endl;
        return -1;
    }

    cv::Size sz2Sh( 400, 600 );
    cv::resize( img, img, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );

    // 使用 pyrMeanShiftFiltering 对图像进行滤波
    cv::Mat filtered_img;
    double spatial_radius = 10; // 空间窗口半径
    double color_radius = 20;   // 颜色窗口半径
    int max_level = 1;          // 最大金字塔层级
    cv::TermCriteria term_crit(cv::TermCriteria::MAX_ITER+cv::TermCriteria::EPS, 5, 1); // 终止准则
    cv::pyrMeanShiftFiltering(img, filtered_img, spatial_radius, color_radius, max_level, term_crit);

    // 显示结果
    cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
    cv::imshow("Original Image", img);

    cv::namedWindow("Filtered Image", cv::WINDOW_NORMAL);
    cv::imshow("Filtered Image", filtered_img);

    cv::waitKey(0); // 等待按键

    return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 垃圾回收,看一遍就懂

了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程&#xff0c;可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放&#xff0c;防止内存泄漏并优化资源利用率。它就像…

pytorch库 04 神经网络代码基础

文章目录 一、神经网络基本骨架 nn.Module二、卷积层三、池化层四、非线性激活层五、线性层六、模型搭建小练习&#xff1a;CIFAR 10 model 结构七、损失函数与反向传播八、优化器九、现有网络模型的使用与修改十、网络模型的保存与读取十一、一个完整模型训练套路十二、GPU加速…

arm体系结构(1)

一 RAM: 随机存储(主存储器) 速度快、掉电数据丢失 ROM: 只读存储(辅助存储器) 速度慢、掉电数据不丢失 RAM SRAM DRAM SDRAM DDR2、3、4、5 静态 动态 同步 ROM PROM EPROM EEPROM 可编程 可擦除 电可擦可编程 flash:结合RAM和ROM的优点&#xff0c;快、掉…

Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录

ANSI C程序中&#xff0c;用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数&#xff0c;但是编译时提示&#xff1a; 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子&#xff0c;没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…

Python青少年简明教程:为何学习Python编程语言及Python编程环境搭建

Python青少年简明教程&#xff1a;为何学习Python编程语言及Python编程环境搭建 我们写给他人看的文章&#xff0c;使用类语言。人类语言有很多种如汉语&#xff0c;英语&#xff0c;法语等等。 而写给 计算机 执行的 程序文件 &#xff0c;必须使用 编程语言 &#xff0c; 因…

Java 集成测试详解及示例

通过综合指南探索 Java 集成测试的世界。了解工具、流程和最佳实践&#xff0c;并辅以实际示例。 随着软件系统变得越来越大、越来越复杂&#xff0c;组件和服务以错综复杂的方式交互&#xff0c;集成测试已变得不可或缺。通过验证所有组件和模块在组合时是否正常工作&#xff…

三级_网络技术_27_计算机网络环境及应用系统的安装与调试

1.对于频繁改变位置并使用DHCP获取PP地址的DNS客户端&#xff0c;为减少对其资源记录的手动管理&#xff0c;可采取的措施是()。 允许动态更新 使用反向查找区域 增加别名记录 设置较小的生存时间 2.下列Windows 2003系统命令中&#xff0c;可以清空DNS缓存(DNScache)的是…

在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

打靶记录11——Billu_b0x

靶机&#xff1a; https://download.vulnhub.com/billu/Billu_b0x.zip难度&#xff1a; 中&#xff08;两种攻击路线&#xff09; 目标&#xff1a; 取得root权限 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集SQL注入&#xff08;Sqlmap跑不出来&#xff09;…

Spring Boot 3.3 【四】Spring Boot 整合JPA

&#x1f31f; 技术人聊管理 请关注 【技术管理修行】 一、JPA 简介 Spring Data JPA 是 Spring Data 项目的一部分&#xff0c;它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工…

leetCode - - - 栈和队列

目录 1.有效的括号&#xff08; LeetCode 20 &#xff09; 2.最小栈&#xff08; LeetCode 155 &#xff09; 3.接雨水&#xff08; LeetCode 42 &#xff09; 4.逆波兰表达式求值&#xff08;LeetCode 150&#xff09; 5.柱状图中最大的矩形&#xff08;LeetCode 84&…

SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)

上一章学习了LE的基础知识。 1&#xff0c;LE的概述&#xff0c;LE里面包含下面3个大的模块 - LE-WM 仓库管理 / - LE-SHP 发货/ - LE-TRA 运输 2&#xff0c;仓库的结构 - 仓库番号 / -保管域Type(存储区域)/ - 保管区画(存储区)/ - 棚番&#xff08;Storage Bin 仓位&…

IDEA快捷键(Ctrl + tab)非常好用 切换最近使用的编辑器选项卡

文章目录 1、为什么要使用 ctrl tab 快捷键&#xff1f;2、使用 ctrl tab 快捷键 1、为什么要使用 ctrl tab 快捷键&#xff1f; 当我们点击 ctrl alt 鼠标左键点击 进入方法的实现时&#xff0c;这个时候我们会在这个实现类中不断的点击&#xff0c;查看源码&#xff0c…

【安全工具推荐-Search_Viewer资产测绘】

目录 一、工具介绍 二、工具配置 三、传送门 一、工具介绍 Search_Viewer&#xff0c;集Fofa、Hunter鹰图、Shodan、360 quake、Zoomeye 钟馗之眼、censys 为一体的空间测绘gui图形界面化工具&#xff0c;支持一键采集爬取和导出fofa、shodan等数据&#xff0c;方便快捷查看…

竞争与冒险/亚稳态/跨时钟域

竞争与冒险/亚稳态/跨时钟域 文章目录 竞争与冒险/亚稳态/跨时钟域1.亚稳态1.1 好文章1.2 什么是亚稳态1.3亚稳态的解决办法1.3.1 跨时钟域的亚稳态——采用同步机制1.3.1.1 单比特(脉冲和单比特流)的跨时钟域同步1.3.1.1.1 单比特流的跨时钟域同步1.3.1.1.2 脉冲的跨时钟域同步…

.NET辅助角色服务入门简介

在日常开发中&#xff0c;并不是所有的功能都是用户可见的&#xff0c;还在一些背后默默支持的程序&#xff0c;这些程序通常以服务的形式出现&#xff0c;统称为辅助角色服务。今天以一个简单的小例子&#xff0c;简述基于.NET开发辅助角色服务的相关内容&#xff0c;仅供学习…

旅行商问题变体:欧几里德平面中线段最小连接算法

问题描述 假设在欧几里德平面上有有限多条线段&#xff0c;如何将它们连接起来&#xff0c;形成一条最小长度的线段链&#xff1f; 首先&#xff0c;自然可以穷举所有情况&#xff0c;找到最优解。还可以采用动态规划、贪心算法找到局部最优解。 另外&#xff0c;则将其作为T…

定时器延时us(hal库)

目录 定时器延时us 配置cubemx ​编辑​编辑新建模块 代码实现 测试代码 定时器延时us 复制工程模板 配置cubemx 新建模块 新建文件HardWare 添加文件HardWare 添加文件路径 添加HardWare 或者直接输入/HardWare 添加.c和.h文件 .h文件 添加防重复定义代码 #ifnd…

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…

DePT: Decoupled Prompt Tuning

当前的问题:Base-New Tradeoff(BNT)困境 现有的提示调优方法通常无法摆脱Base-New Tradeoff(BNT)困境&#xff0c;即调优/调整的模型对基本任务的泛化效果越好&#xff0c;对新任务的泛化效果就越差(包含不可见的类)&#xff0c;反之新任务的泛化效果越好&#xff0c;所需要的…