接上篇文章《高斯模糊算法的原理》,本文我们借助 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 实现高斯模糊算法相关推荐

  1. 高斯模糊java代码_Java实现高斯模糊算法处理图像

    高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...

  2. 高斯模糊java代码_Java编程实现高斯模糊和图像的空间卷积详解

    高斯模糊 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降 ...

  3. 高斯模糊java代码_JAVA bitmap的高斯模糊代码

    /** 水平方向模糊度 */ private staticfloat hRadius= 6; /** 竖直方向模糊度 */ private staticfloat vRadius= 6; /** 模糊 ...

  4. 票据ticket实现方式java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  5. 售票java代码_Java代码实践12306售票算法(二)

    周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1初始化一列车厢的票据信息 /** * 生成 ...

  6. 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)

    java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...

  7. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  8. 线性查找法java代码_Java线性查找和二分查找

    Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...

  9. C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证

    CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...

最新文章

  1. 8 基于管道的持久化存储 scrapy
  2. LeetCode Add and Search Word - Data structure design(字典树)
  3. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
  4. Asp.net core中Migration工具使用的交流分享
  5. mysql 位操作支持
  6. 红米note3支持html,红米Note3什么配置参数?红米Note3标配有什么?
  7. excel设置曲线图横坐标值
  8. headerIP php_PHP正确获取客户端IP地址
  9. c++ STL之queue
  10. 【迅雷VIP体验】免费获得迅雷会员,享受高速下载通道
  11. etree不能使用,etree.HTML()不能使用。
  12. 【算法练习】82.重复的DNA序列——哈希表
  13. 【物联网控制技术】--第一章--【自动控制】【反馈控制】【调节过程】【系统要求】【典型的外部输入信号】
  14. 利用腾讯云轻量服务器快速搭建网站CDN
  15. 百度邓凯鹏:飞桨视觉技术解析与应用
  16. C语言实现三子棋(代码详解)
  17. 全球与中国手持式凿岩机市场供需情况分析及十四五趋势预测报告2022-2027年版
  18. 啊哈算法—解救小哈(广度优先搜索)
  19. 信息系统项目管理师考试是自学好还是找培训好?
  20. php博客系统答辩ppt,个人博客系统设计与实现答辩PPT.ppt

热门文章

  1. 内容耦合 c语言例子,耦合性 内聚加实例
  2. ThinkPHP6.0 入门【一】,安装,运行,测试,配置
  3. 无线投屏软件有什么,电脑端怎么同步手机画面?
  4. 解决关于mybatis-plus修改字段时会自动忽略值为null的字段
  5. 用java制作扑克牌_Java实现扑克牌洗牌和发牌
  6. 为什么技术好但是年级大的人不好找工作
  7. android uid.system,android.uid.system
  8. Smokeping 网络性能监控 安装使用说明
  9. Linux系统的时间、日期和月历命令的使用方法
  10. Windows 7系统开机报错ERROR 0199