OpenCV4.3 Java 编程入门:图像滤波
文章目录
- 1 图像滤波
- 2 模板卷积
- 3 双边滤波:bilateralFilter
- 4 方框滤波
- 5 高斯滤波
- 6 中值滤波
image filtering
bilateral filtering
1 图像滤波
滤波(wave filtering)最开始应用于通信领域,是指滤除信号中特定波段频率的操作,是抑制和防止干扰的重要措施。例如,从雷达接收信号中,过滤掉测量误差和随机干扰,从而实现对飞机在每个时刻的位置、速度、加速度等的计算和预测。
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
对于数字图像信号,噪声表为或大或小的极值,这些极值通过加减作用于图像像素的真实灰度值上,对图像造成亮、暗点干扰,极大降低了图像质量,影响图像复原、分割、特征提取、图像识别等后继工作的进行。要构造一种有效抑制噪声的滤波器必须考虑两个基本问题:能有效地去除目标和背景中的噪声;同时,能很好地保护图像目标的形状、大小及特定的几何和拓扑结构特征 。
滤波的基本目标:
- 消除图像中混入的噪声;
- 为图像识别抽取出图像特征。
基本要求:
- 不能损坏图像轮廓及边缘;
- 图像视觉效果应当更好。,
2 模板卷积
Imgproc 中的滤波函数用于对 2D 图像(Mat)执行各种线性或非线性滤波操作。这意味着,对于源图像(通常为矩形)中的每个像素位置(x,y),考虑其邻域的影响。对于线性滤波器,它是像素值的加权和。对于形态学运算,它是最小值或最大值,依此类推。计算结果存储在相同位置(x,y)的目标图像中。这意味着输出图像的大小将与输入图像的大小相同。通常,这些功能支持多通道阵列,在这种情况下,每个通道都是独立处理的。因此,输出图像的通道数也将与输入图像相同。
另一个共同特征是,与简单的算术函数不同,它们需要外推一些不存在的像素的值。例如,如果要使用高斯3×3滤波器平滑图像,则在处理每行中最左边的像素时,需要它们左边的像素,即图像外部的像素。您可以让这些像素与最左边的图像像素相同(“复制边界”外推方法),或者假设所有不存在的像素都是零(“恒定边界”外推方法),等等。
邻域操作常常借助模板运算来实现,其中模板(也称样板/窗/核)是一幅n∗nn*nn∗n的小图像,模板的功能由模板中的像素值(系数)决定;
模板运算中最常用的是模板卷积,模板卷积在空域实现的主要步骤是:
- 将模板中心与图像中的像素位置重合,漫游遍历图像中的所有像素;
- 将模板上的各个系数与模板下各对应像素和灰度值相乘;
- 将所有乘积相加(或加权相加),并将结果赋值给图像中的对应像素;
图 a 所示是一幅图像的一部分,图 b 为一个 3 x 3 的模板,模板中的数字 kik_iki 为模板系数。模板中心为 k0k_0k0,如果将 k0k_0k0 与图 a 中 s0s_0s0 的位置重合,则模板卷积计算的结果为:
将 R 作为新的值赋给目标图像中 s0s_0s0 对应的位置,就完成了对像素 s0s_0s0 的滤波处理。
3 双边滤波:bilateralFilter
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving)。用维纳滤波或者高斯滤波去降噪,都会有明显地模糊边缘,说明高频细节的信息有丢失。双边滤波器顾名思义,比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离得较远的像素不会对边缘上的像素值影响太多,这样就保证了边缘附近像素值的保存。但是,由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净地滤掉,只能对于低频信息进行较好地滤波。
双边滤波的核函数是空间域核与像素范围域核的综合结果:
- 在平坦区域,临近像素的像素值的差值较小,对应值域权重接近于1,此时空域权重起主要作用,相当于直接对此区域进行高斯模糊。因此,平坦区域相当于进行高斯模糊;
- 在边缘区域,临近像素的像素值的差值较大,对应值域权重接近于0,导致此处核函数下降(因),当前像素受到的影响就越小,从而保持了原始图像的边缘的细节信息;
总体而言,在像素强度变换不大的区域,双边滤波有类似于高斯滤波的效果,而在图像边缘等强度梯度较大的地方,可以保持梯度。
方法定义:
/*** 双边滤波** sigma值:为了简单起见,可以将2个sigma值设置为相同。如果它们很小(<10),过滤器将不会有太大的效果,而如果它们很大(>150),* 它们将有非常强的效果,使图像看起来“卡通化”。* 滤波器大小:大型滤波器(d>5)的速度非常慢,因此建议在实时应用程序中使用d=5,在需要大量噪声过滤的脱机应用程序中使用d=9。** @param src 原始图像* @param dst 处理后的图像 .* @param d 像素邻域的直径。* @param sigmaColor 颜色空间 sigma* @param sigmaSpace 位置空间 sigma. * @param borderType 边框模式用于外推图像外部的像素*/public static void bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace, int borderType);
示例代码:
@Testpublic void bilateralFilterTest() {Mat src = Imgcodecs.imread("images/dog.PNG");Mat dst = new Mat();Imgproc.bilateralFilter(src, dst, 70, 300, 170);HighGui.imshow("dst", dst);HighGui.imshow("src", src);HighGui.waitKey();}
效果:
4 方框滤波
方框滤波可用于图像模糊:
方法定义:
/*** 使用方框滤波器来模糊图像!*** @param src 输入图像* @param dst 输出图像,尺寸和类型与输入图像相同* @param ddepth 输出图像深度,-1 则与原图像相同* @param ksize 卷积核的尺寸* @param anchor 锚点位置,默认为(-1,-1),即卷积核的中心位置;* @param normalize 归一化标志* @param borderType 用于推断图像外部像素的边框模式* SEE: blur, bilateralFilter, GaussianBlur, medianBlur, integral*/public static void boxFilter(Mat src, Mat dst, int ddepth, Size ksize, Point anchor, boolean normalize, int borderType);
方框滤波使用的卷积核:
当 normalize 为 true 时,方框滤波就变成了均值滤波,也就是说均值滤波是方框滤波归一化的特殊情况。
@Testpublic void boxFilterTest() {Mat src = Imgcodecs.imread("images/dog.PNG");Mat dst = new Mat();Imgproc.boxFilter(src, dst, -1, new Size(10,10), new Point(-1,-1));HighGui.imshow("dst", dst);HighGui.imshow("src", dst);HighGui.waitKey();}
效果:
下面的例子,展示了 normalize 开启与否的区别:
@Testpublic void boxFilterTest2() {Mat src = Mat.ones(new Size(10,10), CV_8U);Mat dst = new Mat();Mat dst2 = new Mat();Imgproc.boxFilter(src, dst, -1, new Size(3,3), new Point(-1,-1));Imgproc.boxFilter(src, dst2, -1, new Size(3,3), new Point(-1,-1), false);System.out.println(dst.dump());System.out.println("\n\n");System.out.println(dst2.dump());}
结果:
5 高斯滤波
高斯滤波是使用特定的高斯核,对图像进行卷积!
高斯滤波是一种线性平滑滤波,可以消除高斯噪声,广泛应用于图像处理的降噪过程。通俗地讲,高斯滤波就是对政府图像进行加权平均的过程,每个像素点的值,都是由其本身和邻域内的其他像素值经过加权平均后得到。从数学角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。
高斯模糊生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像。
二维高斯函数:
方法定义:
/*** @param src 输入图像* @param dst 输出图像* @param ksize 高斯核大小,宽高可以不同,但都必须是正奇;都为零时,根据西格玛计算。* @param sigmaX 高斯核在 x 方向的标准差.* @param sigmaY 高斯核在 y 方向的标准差.* @param borderType 像素外推法*/public static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX, double sigmaY, int borderType);
示例代码:
@Testpublic void GaussianBlurTest() {Mat src = Imgcodecs.imread("images/dog.PNG");Mat dst = new Mat();Imgproc.GaussianBlur(src, dst, new Size(4,4), 4,5);HighGui.imshow("dst", dst);HighGui.imshow("src", src );HighGui.waitKey();}
6 中值滤波
中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时,又能保存图像的边缘细节。
方法定义:
/*** @param src 输入图像* @param dst 输出图像* @param ksize 核尺寸; 它必须是奇数且大于1,例如:3, 5, 7 ...*/public static void medianBlur(Mat src, Mat dst, int ksize);
示例代码:
@Testpublic void GaussianBlurTest() {Mat src = Imgcodecs.imread("images/dog.PNG");Mat dst = new Mat();Imgproc.medianBlur(src, dst, 5);HighGui.imshow("dst", dst);HighGui.imshow("src", dst);HighGui.waitKey();}
效果:
OpenCV4.3 Java 编程入门:图像滤波相关推荐
- OpenCV4.3 Java 编程入门:图像直方图
文章目录 1 直方图的概念 2 直方图计算:calcHist 3 示例 1 直方图的概念 从数学上来说,图像直方图是描述图像的各个灰度级的统计特性,它是图像灰度值的函数,统计图像中各个灰度级出现的次数 ...
- OpenCV4.3 Java 编程入门:离散傅里叶变换
文章目录 1 时域,频域,空间域 2 傅里叶变换 3 图像处理:频域增强 4 傅里叶变换定理 5 傅里叶变换特性 6 dft() 函数 1 时域,频域,空间域 首先,需要知道什么是 定义域: 定义域( ...
- OpenCV4.3 Java 编程入门:图片的亮度、对比度、及伽马矫正
文章目录 1 计算公式 2 对比度.亮度矫正 3 伽马矫正 图像亮度和对比度的调整操作,属于图像处理中比较简单的一种--点像素操作! 1 计算公式 点操作仅仅根据输入像素值,结合配置参数,来计算相应的 ...
- Java编程入门与应用 P104—例4-12(学生管理系统——密码的重复验证)
Java编程入门与应用 P104-例4-12 在第一次进入系统时要求管理员设置一个密码,出于安全考虑密码需要输入两次,如果两次输入的密码一致才生效,否则提示失败 import java.util.Sc ...
- Java编程入门与应用 P124——例5-4(计算90度的正弦值、0度的余弦值、1的反正切值、120度的弧度值)
Java编程入门与应用 P124--例5-4 计算90度的正弦值.0度的余弦值.1的反正切值.120度的弧度值 因为参数里都是double值,需要以弧度代替角度来实现 /*** Java编程入门与应用 ...
- Java编程入门---JDK安装
Java编程入门 初步了解方法的定义方式和相互调用 掌握递归调用 理解和使用数组 掌握常见类的基本使用,String字符串.Random随机类.Math数学库类和日期类 程序 程序=算法+数据结构 用 ...
- JAVA编程入门基础
JAVA编程入门 程序=算法+数据结构 用户使用编程语言实现问题域到解域的映射,细节描述算法 1.汇编语言-贴近于硬件设备 2.高级语言-C#.Java-贴近于自然语言-需要编译过程将高级语言所编写的 ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
- Java编程入门与应用 P210 例8-8——演示创建实例的方法
Java编程入门与应用 P210 例8-8--演示创建实例的方法 显式转换和隐式转换的概念 /*** Java编程入门与应用 P210 例8-8--演示创建实例的方法** 显式转换和隐式转换的概念*/ ...
最新文章
- 调侃吴恩达,Diss特斯拉,吐槽OpenAI…《AI寒冬将至》作者点评2019“AI小丑秀”...
- Windows系统 配置Java的JDK环境变量
- SQL SERVER数据页checksum校验算法
- python build-in function
- mats显卡测试软件的使用教程,MATS使用说明
- plsql developer 查看存储过程执行计划_产品简介 | X-Developer一站式研发效能管理平台...
- Hibernate组件作为Map索引(四)
- 协作多智能体强化学习中的回报函数设计
- 数字证书驱动_网上申报中环CA数字证书更新流程(图解)
- ICH E2B | ICSR 电子传输网关对接解决方案
- CGLib动态代理详解
- 【舆情聚焦】 乐视危机舆情监测专项报告
- 35岁之前不应该错过的30本书
- EOJ 2月月赛补题
- 纯洁的心--佩雷尔曼
- Python 贪心法:真分数表示为埃及分数之和
- 【沃顿商学院学习笔记】领导力——Business Impact:03商业如何驱动影响力的案例Some Cases
- 封装link或style中的css规则
- Java23种设计模式 适配器模式【Adapter Pattern】
- 服务器虚拟化巡检报告,vmvare虚拟化平台巡检周报
热门文章
- android studio 加载图片,Android Studio 加载网络图片
- 【详讲】微信小程序分包流程步骤
- 怎样在C++工程中集成C#窗口
- 导向矢量矩阵(steering vector matrix)
- 斐波那契数列指的是这样一个数列:1、1、2、3、5、8....输出前 N 个 斐波那契数,要求每行5个
- SHOI2002滑雪
- HTML标签隐藏与显示方法汇总
- 互斥锁(mutex)
- 川奇机电48v铅酸充电器实物和原理图以及改锂电池充电器
- 股票数据接口level2使用技巧分享!