高斯模糊java代码_Java 实现高斯模糊算法
接上篇文章《高斯模糊算法的原理》,本文我们借助 java 来实现高斯模糊算法,并使用高斯模糊算法处理实际图片。
高斯模糊就是图像和高斯函数的卷积。等价于傅里叶变换后乘上高斯函数再逆变换回来(高斯函数的傅里叶变换也是高斯函数),没错就是低通滤波。实现方式可以按照卷积公式算,复杂度 O(n?m?)。考虑到二维高斯函数 G(x,y)可以写成两个一维高斯函数 G(x)和 G(y)的乘积,也就是 G(x)δ(y)和 G(y)δ(x)的卷积,也就是可以 x 和 y 两个方向分别做高斯模糊。O(n?m)卷积核很大的时候也可以用 FFT->相乘->IFFT 的方式实现,复杂度 O((m+n)?log(m+n)),不过高斯模糊的 m 也就是几个像素,就不要考虑这个了。
下面我们使用 java 来实现一个高斯模糊案例。
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test {
static float [][]aa;
//计算高斯后的权重矩阵
final static int shu = 1;
//高斯模糊半径
final static int size = 2*shu+1;
//数组大小
/** * 简单高斯模糊算** @param args* @throws IOException [参数说明]**/
/* @return void [返回类型说明]* @exception throws [违例类型] [违例说明] */
/* @see [类、类#方法、类#成员] */
public static void main(String[] args) throws IOException{
aa = GaosiUtil.get2(GaosiUtil.get2DKernalData(shu,1.5f));
//计算高斯权重
BufferedImage img = ImageIO.read(new File("d://1.jpg"));
System.out.println("图片加载成功"+img);
int height = img.getHeight();
int width = img.getWidth();
int[][] matrix = new int[size][size];
//基础矩阵
int[] values = new int[size*size];
for (int i = 0; i < width; i++){
for (int j = 0; j < height; j++){
readPixel(img, i, j, values);
//获取周边点的值
fillMatrix(matrix, values);
//将周边点个点的值存到缓存矩阵中
img.setRGB(i, j, avgMatrix(matrix));}}
ImageIO.write(img, "jpeg", new File("d:/test1.jpg"));
//保存在 d 盘为 test1.jpeg}
private static void readPixel(
BufferedImage img, int x, int y, int[] pixels){
//读取像素
int xStart = x - shu;
int yStart = y - shu;
int current = 0;
for (int i = xStart; i < size + xStart; i++){
for (int j = yStart; j < size + yStart; j++){
int tx = i;
//处理边界情况左溢出
if (tx < 0){
tx = -tx}else if (
tx >= img.getWidth()){
//处理边界情况右溢出
tx = x;
int ty = j;
if (ty < 0){
ty = -ty;}
else if (ty >= img.getHeight()){
ty = y;}
pixels[current++] = img.getRGB(tx, ty);//获取
}}}
private static void fillMatrix(int[][] matrix, int... values){
int filled = 0;
for (int i = 0; i < matrix.length; i++){
for (int j = 0; j
matrix[i][j] = values[filled++];}}}
private static int avgMatrix(int[][] matrix){
int r = 0;
int g = 0;
int b = 0;
for (int i = 0; i < matrix.length; i++){
for (int j = 0; j
Color c = new Color(matrix[i][j]);
r += c.getRed()*aa[i][j];
g += c.getGreen()*aa[i][j];
b += c.getBlue()*aa[i][j];}}
return new Color(r, g, b).getRGB(); } }
public class GaosiUtil {
//二维高斯算法具体实现
static float sum=0;
public static float[][]
get2DKernalData(int n, float sigma) {
int size = 2*n +1;
float sigma22 = 2*sigma*sigma;
float sigma22PI = (float)Math.PI * sigma22;
float[][] kernalData = new float[size][size];
int row = 0;
for(int i=-n; i<=n; i++) {
int column = 0;
for(int j=-n; j<=n; j++) {
float xDistance = i*i;
float yDistance = j*j;
kernalData[row][column] = (float)Math.exp(-(xDistance + yDistance)/sigma22)/sigma22PI;
column++;}
row++;}
System.out.println("二维高斯结果");
for(int i=0; i
for(int j=0; j
sum +=kernalData[i][j];
System.out.print("/t" + kernalData[i][j]);}
System.out.println();
System.out.println("/t ---------------------------");}
return kernalData; }
public static float[][] get2(float[][] kernalData) {
System.out.println("均值后");
for(int i=0; i
for(int j=0; j
kernalData[i][j] = kernalData[i][j]/sum;
System.out.print("/t" + kernalData[i][j]); }
System.out.println();
System.out.println("/t ---------------------------");}
return kernalData;}}
最后看看处理后的图片效果:
【注:本文源自网络文章资源,由站长整理发布】
web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java 实现高斯模糊算法
高斯模糊java代码_Java 实现高斯模糊算法相关推荐
- 高斯模糊java代码_Java实现高斯模糊算法处理图像
高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...
- 高斯模糊java代码_Java编程实现高斯模糊和图像的空间卷积详解
高斯模糊 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降 ...
- 高斯模糊java代码_JAVA bitmap的高斯模糊代码
/** 水平方向模糊度 */ private staticfloat hRadius= 6; /** 竖直方向模糊度 */ private staticfloat vRadius= 6; /** 模糊 ...
- 票据ticket实现方式java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- 售票java代码_Java代码实践12306售票算法(二)
周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...
- 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...
- java代码_Java 代码实现排序算法
阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...
- 线性查找法java代码_Java线性查找和二分查找
Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...
- C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证
CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...
最新文章
- 8 基于管道的持久化存储 scrapy
- LeetCode Add and Search Word - Data structure design(字典树)
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- Asp.net core中Migration工具使用的交流分享
- mysql 位操作支持
- 红米note3支持html,红米Note3什么配置参数?红米Note3标配有什么?
- excel设置曲线图横坐标值
- headerIP php_PHP正确获取客户端IP地址
- c++ STL之queue
- 【迅雷VIP体验】免费获得迅雷会员,享受高速下载通道
- etree不能使用,etree.HTML()不能使用。
- 【算法练习】82.重复的DNA序列——哈希表
- 【物联网控制技术】--第一章--【自动控制】【反馈控制】【调节过程】【系统要求】【典型的外部输入信号】
- 利用腾讯云轻量服务器快速搭建网站CDN
- 百度邓凯鹏:飞桨视觉技术解析与应用
- C语言实现三子棋(代码详解)
- 全球与中国手持式凿岩机市场供需情况分析及十四五趋势预测报告2022-2027年版
- 啊哈算法—解救小哈(广度优先搜索)
- 信息系统项目管理师考试是自学好还是找培训好?
- php博客系统答辩ppt,个人博客系统设计与实现答辩PPT.ppt
热门文章
- 内容耦合 c语言例子,耦合性 内聚加实例
- ThinkPHP6.0 入门【一】,安装,运行,测试,配置
- 无线投屏软件有什么,电脑端怎么同步手机画面?
- 解决关于mybatis-plus修改字段时会自动忽略值为null的字段
- 用java制作扑克牌_Java实现扑克牌洗牌和发牌
- 为什么技术好但是年级大的人不好找工作
- android uid.system,android.uid.system
- Smokeping 网络性能监控 安装使用说明
- Linux系统的时间、日期和月历命令的使用方法
- Windows 7系统开机报错ERROR 0199