基于Java实现空间滤波完整代码

空间滤波的定义

滤波的本义是指信号有各种频率的成分,滤掉不想要的成分,即为滤掉常说的噪声,留下想要的成分,这即是滤波的过程,也是目的。空间滤波是一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。目的是改善影像质量,包括去除高频噪声与干扰,及影像边缘增强、线性增强以及去模糊等。分为低通滤波(平滑化)、高通滤波(锐化)和带通滤波。

图像需要增强的原因

各类图像处理系统在图像的采集、获取、传送和转换(如成像、复制扫描、传输以及显示等)过程中,均处在复杂的环境中,光照、电磁多变,所有的图像均不同程度地被可见或不可见的噪声干扰。噪声源包括电子噪声、光子噪声、斑点噪声和量化噪声。如果信噪比低于一定的水平,噪声逐渐变成可见的颗粒形状,导致图像质量的下降。除了视觉上质量下降,噪声同样可能掩盖重要的图像细节,在对采集到的原始图像做进一步的分割处理时,我们发现有一些分布不规律的椒盐噪声,为此采取相应的对策就是对图像进行必要的滤波降噪处理。

(1) 中值滤波

PART/01

是将每个像元在以其为中心的M×N邻域内取中间亮度值来代替该像元值,以达到去尖锐“噪声”和平滑图像的目的。具体计算方法与模板卷积方法类似,仍采用活动窗口的扫描方法。取值时,将M×N窗口内所有像元按亮度值的大小排列,取中间值作为中间像元的值。所以M×N取奇数为好。一般来说,图像亮度为阶梯状变化时,取均值平滑比取中值滤波要明显得多,而对于突出亮点的“噪声”干扰,从去“噪声”后对原图的保留程度看取中值要优于取均值。

代码实现:

比如我们要对下面矩阵进行中值滤波运算,

4 4 3 7 6 8 8

4 4 3 7 6 8 8

2 2 15 8 9 9 9

5 5 8 9 13 10 10

7 7 9 12 15 11 11

8 8 11 10 14 13 13

8 8 11 10 14 13 13

输出结果如下图所示:

package NB;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Scanner;

public class zzlb {

public static void main(String[] args) {

    Scanner s=new Scanner(System.in);

    System.out.println("请输入矩阵的行数:");

    int x=s.nextInt();//获取键盘输入的数字

    System.out.println("请输入矩阵的列数:");

    int y=s.nextInt();//获取键盘输入的数字

    int[][]b=new int[x][y];//创建一个二维数组

    int[]p=new int[9];//创建一个可以存放9个元素的一维数组来获取#3*3窗口的像元值

    System.out.println("请输入"+x+"*"+y+"的矩阵:");

    for (int i = 0; i <y; i++) {

        for (int j = 0; j < x; j++) {

            b[i][j]=s.nextInt();//将键盘输入的矩阵存放到二维数组里面

        }

    }

    System.out.print("运算结果如下:\n");

    for (int i = 1; i <y-1; i++) {

        for (int j = 1; j < x-1; j++) {  //锁定到中心像元的位置,从(1,1)开始

            int g=0;

            for (int k =i-1; k <=i+1 ; k++) {

                for (int l =j-1; l <=j+1 ; l++) {

                    p[g++]=b[k][l]; //将3*3矩阵窗口存储到一维数组中

                }

            }

            for (int k = 0; k <p.length-1; k++) {

                for (int l = 0; l < p.length-1-k; l++) {

                    if(p[l]>p[l+1]) {

                        int temp = p[l];

                        p[l]=p[l+1];

                        p[l+1]=temp;//本次采用冒泡排序法对3*3窗口内的像元从小到大排序

                    }

                }

            }

            System.out.print(p[4]+" ");//输出每个3*3模板的中心值,下标都是4

        }

        System.out.println("\n");//输出完一行就换行

    }

}
}

有小伙伴看到就会说:我求的是55的矩阵,为什么输入的是77的矩阵?原因在于我们运用的33矩阵窗口放在矩阵4个角的像元时,需要额外添加邻近的像元来构成33的窗口,对于这个添加的临时像元值一般和最近的像元值保持一致。

(2)罗伯特锐化

PART/02

图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。锐化的方法很多,在此只介绍罗伯特梯度。梯度反映了相邻像元的亮度变化率,也就是说,图像中如果存在边缘,如湖泊、河流的边界,山脉和道路等,则边缘处有较大的梯度值。对于亮度值较平滑的部分,亮度梯度值较小。因此,找到梯度较大的位置,也就找到边缘,然后再用不同的梯度计算值代替边缘处像元的值,也就突出了边缘,实现了图像的锐化。

不过在讲解之前小编先给大家引入一个新的概念——图像卷积运算, 卷积运算:可看作是加权求和的过程,使图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值。它是在空间域上对图像作局部检测的运算,以实现平滑和锐化的目的。具体作法是选定一个卷积函数,又称为“模板”,实际上是一个M×N图像。二维的卷积运算是在图像中使用模板来实现运算的。运算方法从图像左上角开始,选定与模板同样大小的矩阵元素窗口,图像窗口与模板像元对应的亮度值相乘后再相加,最后一般将计算结果放在窗口中心位置(当M和N都是奇数时),代替原来的像元灰度值。然后活动窗口向右移动一个像元再以同样的方法进行卷积运算,逐行扫描,直到全幅影像都扫描一遍,最后生成新图像。罗伯特锐化方法使用的两个模板如下:

F=|aidxi|+|aidyi|,其中a是矩阵中的2*2个元素,i是第i个元素,i<=4,计算结果放在左上角像元,代替之前的灰度值,但是右下角的像元模板范围内没有其他像元了,无法进行计算,为此使用罗伯特锐化方法都要在原始矩阵的最下边和最右边添加一行和一列,值都和最临近的像元灰度值一样。为了直白了断,小编直接上例子吧,比如有某个矩阵,如下图(1)所示,我要用上面两个模板进行罗伯特锐化,首先得在右边和下边分别添加一行和一列,如下图(2)所示:

接下来对左上角像元进行运算:|2*(-1)+30+40+51|+|20+3*(-1)+41+50|=4,

接下来对右上角像元进行运算:|3*(-1)+30+50+51|+|30+3*(-1)+51+50|=4,

接下来对左下角像元进行运算:|4*(-1)+50+40+51|+|40+5*(-1)+41+50|=2,

接下来对右下角像元进行运算:|5*(-1)+50+50+51|+|50+5*(-1)+51+50|=0,最终输出矩阵如下所示:

这种算法的意义在于用交叉的方法检测出像与其领域在上下之间或左右之间或斜方向之间的差异,最终产生一个梯度影像,达到提取边缘信息的目的。

代码实现:

比如我们要对下面矩阵进行中值滤波运算,

2 2 10 10 10 10

2 2 10 10 10 10

2 2 10 10 10 10

2 2 2 2 2 2

2 2 2 2 2 2

2 2 2 2 2 2

输出结果如下图所示:

package NB;

import java.util.Scanner;

public class robet {
public static void main(String[] args) {

    Scanner s1 = new Scanner(System.in);

    System.out.println("请输入矩阵的行数:");

    int x = s1.nextInt();//获取键盘输入的数字

    System.out.println("请输入矩阵的列数:");

    int y = s1.nextInt();//获取键盘输入的数字

    int[][] b = new int[x][y];//创建一个二维数组

    System.out.println("请输入" + x + "*" + y + "的矩阵:");

    for (int i = 0; i < y; i++) {

        for (int j = 0; j < x; j++) {

            b[i][j] = s1.nextInt();

        }///将键盘输入的矩阵存放到二维数组里面

    }

    for (int i =0; i <y-1; i++) {

        for (int j = 0; j <x-1; j++) {

            b[i][j]=Math.abs(b[i][j]-b[i+1][j+1])+Math.abs(b[i+1][j]-b[i][j+1]);

            System.out.print(b[i][j]+" ");

        }//对两个模板进行图像卷积运算后取绝对值相加,并且把结果放到2*2窗口的左上方

        System.out.println("\n");//输出完一行就换行

    }

}
}

到此这篇关于基于Java的空间滤波代码实现的文章就介绍到这了,更多相关Java空间滤波内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java+opencv3.2.0之scharr滤波器

    在opencv中scharr滤波器是配合sobel算子的运算而存在的.当sobel内核为3时,结果可能会产生比较明显的误差,针对这一问题,Opencv提供了scharr函数.该函数只针对大小为3的核,并且运算速率和sobel函数一样快,结果更加精确,但抗噪性不如sobel函数. 使用scharr滤波器计算x或y方向的图像差分,它的参数变量和sobel一样. 函数:Imgproc.Scharr(Mat src, Mat dst, int ddepth, int dx, int dy, double

  • 基于Java实现空间滤波完整代码

    空间滤波的定义 滤波的本义是指信号有各种频率的成分,滤掉不想要的成分,即为滤掉常说的噪声,留下想要的成分,这即是滤波的过程,也是目的.空间滤波是一种采用滤波处理的影像增强方法.其理论基础是空间卷积和空间相关.目的是改善影像质量,包括去除高频噪声与干扰,及影像边缘增强.线性增强以及去模糊等.分为低通滤波(平滑化).高通滤波(锐化)和带通滤波. 图像需要增强的原因 各类图像处理系统在图像的采集.获取.传送和转换(如成像.复制扫描.传输以及显示等)过程中,均处在复杂的环境中,光照.电磁多变,所有的图像

  • 基于Java验证jwt token代码实例

    这篇文章主要介绍了基于Java验证jwt token代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 How to load public certificate from pem file..?地址 1.HS256对称加密 package jwt; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyFactory; im

  • 基于java实现DFA算法代码实例

    DFA简介 DFA全称为:Deterministic Finite Automaton,即确定有穷自动机.(自己百度吧) 直接代码: 敏感词实体类 package com.nopsmile.dfa; public class Keywords { private String pid; private String Content; public Keywords() { } public Keywords(String content) { super(); Content = content

  • Java编程实现基于图的深度优先搜索和广度优先搜索完整代码

    为了解15puzzle问题,了解了一下深度优先搜索和广度优先搜索.先来讨论一下深度优先搜索(DFS),深度优先的目的就是优先搜索距离起始顶点最远的那些路径,而广度优先搜索则是先搜索距离起始顶点最近的那些路径.我想着深度优先搜索和回溯有什么区别呢?百度一下,说回溯是深搜的一种,区别在于回溯不保留搜索树.那么广度优先搜索(BFS)呢?它有哪些应用呢?答:最短路径,分酒问题,八数码问题等.言归正传,这里笔者用java简单实现了一下广搜和深搜.其中深搜是用图+栈实现的,广搜使用图+队列实现的,代码如下:

  • Java网络编程之TCP通信完整代码示例

    一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象. 二.什么是TCP? TCP是一种面向连接的.可靠的.

  • Java加密解密和数字签名完整代码示例

    常见的加密算法 基本的单向加密算法: BASE64严格地说,属于编码格式,而非加密算法 MD5(MessageDigestalgorithm5,信息摘要算法) SHA(SecureHashAlgorithm,安全散列算法) HMAC(HashMessageAuthenticationCode,散列消息鉴别码) 复杂的对称加密(DES.PBE).非对称加密算法: DES(DataEncryptionStandard,数据加密算法) PBE(Password-basedencryption,基于密码

  • 完整音乐播放系统基于Java Springboot + Vue + MyBatis

    目录 摘要 主要设计 功能设计 主要技术 功能截图 用户端首页 登录注册 歌单信息 歌手信息 我的音乐 评论点赞 管理员端 首页 用户管理 歌手管理 歌单管理 部分代码 数据库设计 用户表 评论表 收藏表 歌手歌曲表 歌手表 项目总结 视频演示: springboot+vue音乐网站 摘要 网络技术以及计算机的发展,网友们对网络的要求也日益长高,平常在网上听话用一大堆下载软件下载下来也要管理,又占空间,比如那流行歌曲,下载了听了又要删很不方便·而网络音乐库的实现改变了这一状况.它本身就是一个数字

  • 基于Json序列化和反序列化通用的封装完整代码

    1. 最近项目已经上线了 ,闲暇了几天 想将JSON的序列化以及反序列化进行重新的封装一下本人定义为JSONHelp,虽然Microsoft 已经做的很好了.但是我想封装一套为自己开发的项目使用.方便后期的扩展以及开发使用. 2. 什么是 JSON ? JSON:JavaScript 对象表示法(JavaScript Object Notation).JSON 是存储和交换文本信息的语法.类似 XML.JSON 比 XML 更小.更快,更易解析.  现在开发Web应用程序 JSON 是 必不可少

  • java使用RandomAccessFile类基于指针读写文件实例代码

    java API中提供了一个基于指针操作实现对文件随机访问操作的类,该类就是RandomAccessFile类,该类不同于其他很多基于流方式读写文件的类.它直接继承自Object. public class RandomAccessFile extends Objectimplements DataOutput, DataInput, Closeable{...} 1.使用该类时可以指定对要操作文件的读写模式. 第一种模式是只读模式,第二种模式是读写模式.在创建该类实例时指定. @Test pu

  • 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

随机推荐