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

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术,其基本原理在于通过计算图像模板中邻域内的均值和方差,选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明:

一、基本思想

Kuwahara滤波的基本思想是基于图像局部区域的均匀性来判断并处理像素值。在图像中,边缘和纹理区域往往灰度值变化较大,而平滑区域则灰度值变化较小。因此,通过计算图像模板中各个子区域的均值和方差,可以选择出灰度值最为均匀的区域,并用该区域的均值来替代模板中心像素的灰度值,从而达到平滑图像的效果,同时保留图像的边缘信息。

二、滤波过程

  1. 定义滤波模板
    • 滤波模板通常是一个正方形区域,其大小可以根据需要进行调整。常见的模板大小有3x3、5x5等。
    • 模板被划分为多个重叠的子区域,每个子区域都包含模板中心像素的一部分邻域。
  2. 计算均值和方差
    • 对于模板中的每一个子区域,计算其灰度值的均值和方差。
    • 均值反映了子区域灰度值的平均水平,而方差则反映了子区域灰度值的波动程度。
  3. 选择均匀区域
    • 比较各个子区域的方差,选择方差最小的子区域作为均匀区域。
    • 由于方差最小的子区域灰度值变化最小,因此可以认为该区域的灰度值最为均匀。
  4. 替代中心像素
    • 用均匀区域的均值替代模板中心像素的灰度值。
    • 这样,模板中心像素的灰度值就被更新为周围最均匀区域的灰度值,从而达到平滑图像的效果。

在这里插入图片描述

上图是一个5x5的kuwahara filter,目标像素的值由这4个黑框包括着的4个area确定,area1~area4 这4个区域中像素点的方差最小的区域是我们的目标区域,方差的计算公式由下面的公式给出,确定目标区域之后,目标像素的值等于目标区域中像素点的平均值。

σ a = 1 ( N − 1 ) ∑ ( i ( x , y ) − μ a ) 2 \sigma_a=\sqrt{\frac{1}{(N-1)}\sum(i(x,y)-\mu_a)^2} σa=(N1)1(i(x,y)μa)2

三、opencv实现

使用opencv计算实现Kuawahara滤波时,为了减小局部均值和标准差的计算量,通常为使用积分图进行加速。实现代码如下:

import cv2 as cv
import numpy as npdef Kuwahara(input, win_size = 3):if win_size % 2 == 0:raise ValueError("win_size must be odd.")half_win_size = win_size // 2rows, cols = input.shape#计算积分图s, sq = cv.integral2(input, sdepth=cv.CV_64F, sqdepth=cv.CV_64F)#使用积分图计算win_size x win_size大小窗口的局部均值section_sum = s[0:rows - win_size + 1, 0:cols - win_size + 1] + \s[win_size:rows + 1, win_size:cols + 1] - \s[0:rows - win_size + 1, win_size:cols + 1] - \s[win_size:rows + 1, 0:cols - win_size + 1]section_mean = section_sum /(win_size * win_size)#补边操作section_mean = cv.copyMakeBorder(section_mean, half_win_size, half_win_size,half_win_size, half_win_size,cv.BORDER_REFLECT)#使用积分图计算win_size x win_size大小窗口的局部标准差section_sum_sq = sq[0:rows - win_size + 1, 0:cols - win_size + 1] + \sq[win_size:rows + 1, win_size:cols + 1] - \sq[0:rows - win_size + 1, win_size:cols + 1] - \sq[win_size:rows + 1, 0:cols - win_size + 1]section_mean_sq = section_sum_sq /(win_size * win_size)# 补边操作section_mean_sq = cv.copyMakeBorder(section_mean_sq, half_win_size, half_win_size,half_win_size, half_win_size,cv.BORDER_REFLECT)##方差速算:平方的均值减去均值的平方section_var = section_mean_sq - section_mean ** 2##选择最小的方差对应的均值代替中心像素完成滤波filter_result = input.copy()for r in range(half_win_size, rows - half_win_size):for c in range(half_win_size, cols - half_win_size):var = [section_var[r - half_win_size, c - half_win_size],section_var[r - half_win_size, c + half_win_size],section_var[r + half_win_size, c - half_win_size],section_var[r + half_win_size, c + half_win_size]]mean = [section_mean[r - half_win_size, c - half_win_size],section_mean[r - half_win_size, c + half_win_size],section_mean[r + half_win_size, c - half_win_size],section_mean[r + half_win_size, c + half_win_size]]filter_result[r, c] = np.uint8(mean[np.argmin(var)])return filter_resultif __name__ == '__main__':image = cv.imread("./noise.png", cv.IMREAD_GRAYSCALE)result = Kuwahara(image, 7)cv.imshow('image', image)cv.imshow('kuwa', result)result = np.concatenate((image, result), axis=1)cv.imwrite('kuwahara2.jpg', result)cv.waitKey()

在这里插入图片描述
在这里插入图片描述

四、实际应用

Kuwahara滤波在处理图像时,能够很好地保留图像的边缘信息(强噪声污染的情况下),同时平滑掉图像中的噪声和细节纹理。这使得Kuwahara滤波在图像处理领域具有广泛的应用价值,如图像增强、图像去噪、图像风格化等。
在实际应用中,Kuwahara滤波通常与其他图像处理技术相结合,以达到更好的处理效果。例如,在油画风格化处理中,可以利用Kuwahara滤波来平滑图像并保留边缘信息,从而模拟出油画的特点。此外,在断层特征增强、图像分割等领域,Kuwahara滤波也发挥着重要作用。

相关文章:

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术,其基本原理在于通过计算图像模板中邻域内的均值和方差,选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明: 一、基本思想 Kuwahara滤波的基本思想…...

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换,后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件: ToolboxCreator.exe/ini:toolboxcreator…...

Golang学习笔记_22——Reader示例

Golang学习笔记_19——Stringer Golang学习笔记_20——error Golang学习笔记_21——Reader 文章目录 io.Reader 示例从字符串中读取从文件中读取从HTTP响应中读取从内存的字节切片中读取自定义io.Reader实现 源码 io.Reader 示例 从字符串中读取 func ReadFromStrDemo() {str…...

【2024年华为OD机试】(A卷,100分)- 猜字谜(Java JS PythonC/C++)

一、问题描述 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如 nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序…...

iostat命令详解

iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装: $ sudo apt in…...

Linux:操作系统简介

前言: 在本片文章,小编将带大家理解冯诺依曼体系以及简单理解操作喜欢,并且本篇文章将围绕什么以及为什么两个话题进行展开说明。 冯诺依曼体系: 是什么: 冯诺依曼体系(Von Neumann architecture&#xff…...

企业级信息系统开发讲课笔记4.12 Spring Boot默认缓存管理

文章目录 1. Spring Boot默认缓存管理2. Spring的缓存机制2.1 缓存机制概述2.2 缓存接口和缓存管理接口3. 声明式缓存注解3.1 @EnableCaching注解3.2 @Cacheable注解3.2.1 value/cacheNames属性3.2.2 key属性3.2.3 keyGenerator属性3.2.4 cacheManager/cacheResolver属性3.2.5 …...

2025制定一个高级java开发路线:分布式系统、多线程编程、高并发经验

1-熟悉分布式系统的设计和应用,熟悉分布式、缓存、消息、负载均衡等机制和实现者优先。 2-熟悉多线程编程,具备高并发经验优先。 技术学习规划:熟悉分布式系统和高并发技术 以下是针对目标要求的系统性学习规划,分为 阶段目标 和…...

20250110_ PyTorch中的张量操作

文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理: 总结 前言 1、torch.cat 函数 torch.cat 函数将两个张量拼接起来,具体地是…...

hadoop-yarn常用命令

一、YARN命令介绍 1. YARN命令简介 YARN提供了一组命令行工具,用于管理和监控YARN应用程序和集群。 2. yarn application命令 (1) yarn application命令的基本语法 yarn application命令的基本语法如下: yarn application [genericOptions] [comma…...

LabVIEW滤波器功能

程序通过LabVIEW生成一个带噪声的正弦波信号,并利用滤波器对其进行信号提取。具体来说,它生成一个正弦波信号,叠加高频噪声后形成带噪信号,再通过低通滤波器滤除噪声,提取原始正弦波信号。整个过程展示了信号生成、噪声…...

【Unity3D日常开发】Unity3D中打开Window文件对话框打开文件(PC版)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章继续讲如何使用Unity3D打开Window文…...

ros2笔记-6.2 使用urdf创建机器人模型

本节主要跟着小鱼老师的视频操作,不同的仿真平台有不同的建模语言,但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…...

【centos】校时服务创建-频率修改

在 NTP 配置中,校时频率通常是由 NTP 协议自动管理的,NTP 会根据网络延迟和时间偏差动态调整校时频率。不过,您可以通过配置文件中的一些参数来影响 NTP 的行为。 如果想要更改 NTP 的校时频率,可以考虑以下几个方面:…...

J.U.C(1)

目录 JUC(一)一:AQS二:reentrantlock原理1:加锁:2:解锁3:可重入锁原理4:可打断原理5:公平锁原理6:条件变量 三:读写锁(ree…...

计算机网络之---静态路由与动态路由

静态路由 静态路由是由网络管理员手动配置并固定的路由方式。路由器通过静态配置的路由条目来转发数据包,而不会自动调整。它不依赖于任何路由协议。 特点: 手动配置:网络管理员需要手动在路由器中配置每条静态路由。不自动更新:…...

Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…...

C++----STL(string)

引言:STL简介 什么是STL STL(standard template libaray-标准模板库): 是 C标准库的重要组成部分(注意:STL只是C标准库里的一部分,cin和cout也是属于C标准库的),不仅是一个可复用的组件库&…...

利用 Java 爬虫从 yiwugo 根据 ID 获取商品详情

在当今数字化时代,数据是商业决策的关键。对于从事国际贸易的商家来说,精准获取商品的详细信息至关重要。yiwugo 是一个知名的国际贸易平台,拥有海量的商品数据。通过 Java 爬虫技术,我们可以高效地从 yiwugo 根据商品 ID 获取详细…...

vue2修改表单只提交被修改的数据的字段传给后端接口

效果: 步骤一、 vue2修改表单提交的时候,只将修改的数据的字段传给后端接口,没有修改得数据不传参给接口。 在 data 对象中添加一个新的属性,用于存储初始表单数据的副本,与当前表单数据进行比较,找出哪些…...

C++中显示与隐式加载dll的使用与区别

一、什么是 DLL?DLL(Dynamic Link Library) 是 Windows 下的动态链接库,包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中,调用 DLL 中的函数有两种主要方式&#xf…...

服务器日志分析实战:用Python追踪HTTP 404错误并可视化异常频率

作为一名爬虫开发者或网站运维人员,服务器日志就像飞机的“黑匣子”——它记录了每个请求的来龙去脉。而404错误(页面未找到)尤其值得关注:它可能是用户输错了网址,可能是你爬虫的URL构造逻辑有漏洞,也可能是网站改版后旧的链接失效了。更严重的是,大量突然涌出的404请求…...

解决Claude Code Token不足问题并享受Taotoken活动价

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决Claude Code Token不足问题并享受Taotoken活动价 应用场景类,聚焦于使用Claude Code时遇到Token配额紧张的开发者&…...

别被忽悠了!2026亲测靠谱的AI论文网站|避坑精选版

2026 年学术写作工具已高度分化,千笔AI与ThouPen为全流程首选,豆包、DeepSeek 为专项强手;避坑关键:拒绝假文献、严控 AIGC 率、优先国内适配、免费试用先行。 一、TOP3 全流程首选(亲测不踩雷) 1. 千笔AI&…...

应对Claude Code访问不稳定,快速切换至Taotoken的应急方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 应对Claude Code访问不稳定,快速切换至Taotoken的应急方案 对于依赖Claude Code进行日常开发或自动化任务的用户来说&a…...

深度解析:UI-TARS视觉语言模型驱动的自动化操作框架核心技术架构

深度解析:UI-TARS视觉语言模型驱动的自动化操作框架核心技术架构 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-…...

AI算法工程师如何进行模型部署?这2个工具+3个技巧,快速上线

对于软件测试从业者来说,模型部署并不是一个陌生的概念——随着AI功能逐渐渗透到各类应用软件中,测试工程师不仅需要验证模型输出的准确性,更需要理解部署流程对模型稳定性、响应速度和结果一致性的影响。很多测试同学会有这样的困惑&#xf…...

模拟电路实现自主循线机器人:无MCU的硬件逻辑设计

1. 项目概述:用最纯粹的模拟电路,造一台会“思考”的机器人每次看到那些在赛道上灵巧穿梭的循线小车,你是不是也手痒,想自己动手做一个?但一听到“单片机”、“编程”、“Arduino”这些词,又觉得门槛太高&a…...

DIY智能USB充电器:基于电流检测与双稳态继电器的零功耗节能方案

1. 项目概述:打造一款智能、节能的USB手机充电器作为一名电子爱好者,我经常折腾各种电源项目。市面上很多手机充电器,包括一些原装货,都存在一个通病:手机充满电后,充电器依然插在插座上,内部电…...

Python Android打包终极指南:5个实战技巧解决移动开发痛点

Python Android打包终极指南:5个实战技巧解决移动开发痛点 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android(简称p4…...