VTK知识学习(36)-图像平滑

server/2025/1/18 17:04:00/

1、前言

        图像平滑常用于图像的预处理中,如计算梯度时先对图像进行平滑处理,可以减少噪声对梯度的影响。图像平滑一般是通过模板卷积运算实现。模板可以看作一个大小为nxn的小图像,例如 3x3、5x5等,模板的每个像素都对应一个系数值。模板卷积运算的过程先是将模板中心依次与图像每个像素重合,然后通过模板各个系数与图像对应像素相乘来计算模板对应像素的加权平均值,最后将运算结果赋给图像中模板中心对应的像素。

2、均值滤波

1)概述

        均值滤波是一种常用的平滑方法,其对应的模板各个像素的值相同且和为1。在VTK中没有直接实现均值滤波的类,但是可以通过图像卷积运算来实现均值滤波。卷积运算通过vtkImageConvolve 类实现。只要用 vtkImageConvolve 类设置相应的卷积模板,便可以实现多种空域图像滤波。

2)代码
 private void TestMeanFilter(){//读取图像vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\lena-gray.jpg");reader.Update();// 考虑到进行卷积运算时数据范围的变化和精度要求// 需要先将图像像素数据类型由unsigned char转换为floatvtkImageCast originalCastFilter = vtkImageCast.New();originalCastFilter.SetInputConnection(reader.GetOutputPort());originalCastFilter.SetOutputScalarTypeToFloat();originalCastFilter.Update();//实现图像的卷积运算,两个输入:一个是计算的图像,一个是卷积模板数组vtkImageConvolve convoleFilter = vtkImageConvolve.New();convoleFilter.SetInputConnection(originalCastFilter.GetOutputPort());double[] kernel={0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04 };IntPtr dataPtr = Marshal.AllocHGlobal(sizeof(double) * kernel.Length);Marshal.Copy(kernel, 0, dataPtr, kernel.Length);convoleFilter.SetKernel5x5(dataPtr);convoleFilter.Update();//再将 float类型转换为unsigned char 进行图像显示vtkImageCast convCastFilter = vtkImageCast.New();convCastFilter.SetInputData(convoleFilter.GetOutput());convCastFilter.SetOutputScalarTypeToUnsignedChar();convCastFilter.Update();ShowImageBy2(reader.GetOutput(), convCastFilter.GetOutput());}
3)效果

4)说明

        卷积运算时数据范围的变化和精度有要求,需要先将图像像素数据类型由unsigned char 转换成 float 数据类型。

        数据类型转换通过 vtkImageCast 实现,对应的设置函数为SetOutputScalarTypeToFloat()。接着需要定义卷积算子和卷积模板。

        vtklmageConvolve 类可实现图像的卷积运算,它需要两个输入:一个是需要进行卷积的图像,这里为vtkJPEGReader 读取的图像数据;另一个是卷积模板数组。

        SetKermel5x5()函数接收一个 5x5的卷积模板数组,即定义的kermel数组。执行Update()后即可完成卷积运算。

        注意,卷积模板对应的系数之和应该为1,否则需要对计算结果进行归一化处理。另外该类中还定义了3x3和7x7的卷积模板设置函数,使用过程是一样的。卷积运算完成后再次通过 vtkImageCast 类将 foat数据类型转换为unsigned char 数据类型进行图像显示。

3、高斯平滑

1)概述

        高斯平滑的原理类似于均值滤波。均值滤波模板的系数都是一样的,而高斯平滑则是需要根据像素与模板中心的距离来定义权重。权重的计算方法是采用高斯分布,即离中心越远权重越小。

2)代码
private void TestGaussianFilter(){//读取图像vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\lena-gray.jpg");reader.Update();//默认执行三维高斯滤波 vtkImageGaussianSmooth gaussianSmooth = vtkImageGaussianSmooth.New();gaussianSmooth.SetInputConnection(reader.GetOutputPort());gaussianSmooth.SetDimensionality(2);gaussianSmooth.SetRadiusFactor(5);  //设置高斯模板的大小 当超出该模板的范围时,系数取0gaussianSmooth.SetStandardDeviation(3);  //用于设置高斯分布函数的标准差gaussianSmooth.Update();ShowImageBy2(reader.GetOutput(), gaussianSmooth.GetOutput());}
3)效果

4)说明

        vtkImageGaussianSmooth 类默认是执行三维高斯滤波,SetDimensionality()根据需要设置相应的维数。SetRadiusFactor()用于设置高斯模板的大小,当超出该模板的范围时,系数取0。SetStandardDeviation()用于设置高斯分布函数的标准差。

4、中值滤波

1)概述

        VTK 中用类 vtkImageHybridMedian2D 来实现二维图像的中值滤波。其实现原理是采用一个5x5 的模板,逐次将模板中心对应到图像的每个像素上,将模板图像覆盖的像素的中值作为当前像素的输出值。

2)代码
 private void TestMedianFilter(){//读取图像vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\lena-gray.jpg");reader.Update();//中值滤波 不需要设置任何参数  有效保持图像边缘,并对椒盐噪声有较好的抑制作用。vtkImageHybridMedian2D hybridMedian2D = vtkImageHybridMedian2D.New();hybridMedian2D.SetInputData(reader.GetOutput());hybridMedian2D.Update();ShowImageBy2(reader.GetOutput(), hybridMedian2D.GetOutput());}
3)效果

4)说明

        vtkImageHybridMedian2D类的使用,不需要用户设置任何参数。该方法能够有效保持图像边缘,并对椒盐噪声有较好的抑制作用。若要实现三维图像的中值滤波,则使用vtkImageHybridMedian3D类。

5、各向异性滤波

1)概述

        高斯平滑方法在平滑噪声的同时模糊了图像的重要边缘信息。各向异性滤波是一种基于偏微分方程的滤波技术,建立于热量的各向异性扩散理论。各向异性滤波在图像的平坦区域选择大尺度平滑,而在边缘区域则选择小尺度的平滑,在抑制噪声的同时也保持了图像的边缘信息。VTK中用 vkImageAnisotropicDiffusion2D 类和 vtkImageAnisotropicDiffusion3D 类分别实现对二维和三维图像的各向异性扩散滤波。

2)代码
 private void TestAnistropicFilter(){//读取图像vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\lena-gray.jpg");reader.Update();//通过迭代方法实现 vtkImageAnisotropicDiffusion2D diffusion2D = vtkImageAnisotropicDiffusion2D.New();diffusion2D.SetInputConnection(reader.GetOutputPort());diffusion2D.SetNumberOfIterations(10); //设置迭代的次数diffusion2D.SetDiffusionThreshold(20); //扩散的阈值diffusion2D.Update();ShowImageBy2(reader.GetOutput(), diffusion2D.GetOutput());
}
3)效果

4)说明

        vtkImageAnisotropicDiffusion2D 类通过迭代方法实现,其中 SetNumberOfIterations()用于设置迭代的次数。各向异性扩散滤波原理是在梯度较小的像素处进行较大幅度扩散,而在大梯度处则只进行细微的扩散。该类中定义了一个扩散的值 DiffusionThreshold,并通过SetDiffusionThreshold()设置,只有当像素梯度小于该阈值时才会进行扩散。另外,该类中还有一个梯度类型变量 GradientMagnitudeThreshold,该变量用来设置梯度算子类型。当该变量为1时,梯度通过中心差分方法计算;否则,需要比较当前像素与每个相邻像素。当前像素与相邻像素梯度小于 DifusionThreshold 时进行扩散处理。


http://www.ppmy.cn/server/159401.html

相关文章

海康MV-EB435i立体相机SDK安装(ROS 2)

文章目录 一、简介二、驱动配置小结 一、简介 MV-EB435i相机是一款低成本、小体积、配置全面的立体相机,凭借硬件级的深度图像处理方案,相机可在高性能输出的同时维持低功耗的水平。相机采用海康MV3D SDK,并提供跨平台支持,广泛应…

32单片机综合应用案例——物联网(IoT)环境监测站(四)(内附详细代码讲解!!!)

无论你身处何种困境,都要坚持下去,因为勇气和毅力是成功的基石。不要害怕失败,因为失败并不代表终结,而是为了成长和进步。相信自己的能力,相信自己的潜力,相信自己可以克服一切困难。成功需要付出努力和坚…

Windows CMD 常用命令

文章目录 1. 前言2. 如何进入 CMD3. 常用文件与目录操作命令3.1 切换盘符3.2 cd 改变目录3.3 dir 查看目录内容3.4 创建、删除目录3.5 创建、删除文件 4. 文件与内容操作4.1 复制、移动文件4.2 批量复制 — xcopy / robocopy 5. 网络相关命令5.1 ipconfig 查看本机 IP5.2 测试网…

【华为战报】2024年12月 HCIP考试战报!

了解更多往期考试→点击查看: 【考试战报】 点击查看:​​​​​​0学试学 | 【华为课程】视频合集 2024年12月 微思 | HCIP 考试战报 部分学员成绩单 部分学员证书

Dart语言的字符串处理

Dart语言的字符串处理 目录 引言字符串的定义与基本特性字符串的创建字符串的操作字符串拼接字符串截取字符串替换字符串分割字符串查询字符串格式化正则表达式在字符串处理中的应用字符串编码与解码示例代码总结 1. 引言 在现代编程中,字符串处理是一个非常重要…

【优选算法】四数之和(双指针算法)

必须有为成功付出代价的决心,然后想办法付出这个代价。 目录 1.【题目链接】 2.【算法原理】 3.【代码】 1.【题目链接】 18. 四数之和 - 力扣(LeetCode) 2.【算法原理】 与前面三数之和原理很像 解法一:排序 暴力枚举 …

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中,文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言,提供了丰富的文件操作函数,使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…

2025年01月16日Github流行趋势

项目名称:tabby 项目地址url:https://github.com/TabbyML/tabby 项目语言:Rust 历史star数:27449 今日star数:1439 项目维护者:wsxiaoys, apps/autofix-ci, icycodes, liangfung, boxbeam 项目简介&#xf…