文档章节

java版高斯算法

 我要五个字
发布于 2016/04/20 08:58
字数 918
阅读 488
收藏 7
点赞 5
评论 0

直接上util代码,改下图片路径直接可以看效果

package com.yr.feiyu.common.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 * 
 * <p class="detail">
 * 描述:高斯模糊
 * </p>
 * @ClassName: GaussianBlurUtil
 * @version V1.0  
 * @date 2016年4月20日 
 * @author <a href="mailto:1435290472@qq.com">zq</a>
 */
public class GaussianBlurUtil {
 
 public static void main(String[] args) throws IOException {
  BufferedImage img = ImageIO.read(new File("e:/c.jpeg"));
  long start = System.currentTimeMillis();
  img = blur(img, 170);
  long end = System.currentTimeMillis();
  ImageIO.write(img, "jpeg", new File("e:/test.jpeg"));//保存为test.jpeg文件
  System.out.println("花费时间:"+(end-start));
  System.out.println("success");
 }
 
 /**
  * 
  * <p class="detail">
  * 功能:模糊执行方法
  * </p>
  * @date 2016年4月20日
  * @author <a href="mailto:1435290472@qq.com">zq</a>
  * @param img        原图片
  * @param radius     模糊权重
  * @return     模糊后图片
  * @throws IOException
  */
 public static BufferedImage blur(BufferedImage img,int radius) throws IOException{
  int height = img.getHeight();
     int width = img.getWidth();
        int[] values = getPixArray(img, width, height);
        values = doBlur(values, width, height, radius);
     img.setRGB(0, 0, width, height, values, 0, width);
     return img;
 }
 
 /**
  * 
  * <p class="detail">
  * 功能:获取图像像素矩阵
  * </p>
  * @date 2016年4月20日
  * @author <a href="mailto:1435290472@qq.com">zq</a>
  * @param im
  * @param w
  * @param h
  * @return
  */
    private static int[] getPixArray(Image im, int w, int h) { 
        int[] pix = new int[w * h]; 
        PixelGrabber pg = null; 
        try { 
            pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w); 
            if (pg.grabPixels() != true) 
                try { 
                    throw new java.awt.AWTException("pg error" + pg.status()); 
                } catch (Exception eq) { 
                    eq.printStackTrace(); 
                } 
        } catch (Exception ex) { 
            ex.printStackTrace();
        } 
        return pix; 
    }
    
    /**
     * 
     * <p class="detail">
     * 功能:高斯模糊算法。
     * </p>
     * @date 2016年4月20日
     * @author <a href="mailto:1435290472@qq.com">zq</a>
     * @param pix
     * @param w
     * @param h
     * @param radius
     * @return
     * @throws IOException
     */
    public static int[] doBlur(int[] pix,int w,int h,int radius) throws IOException {
  int wm = w - 1;
  int hm = h - 1;
  int wh = w * h;
  int div = radius + radius + 1;
  int r[] = new int[wh];
  int g[] = new int[wh];
  int b[] = new int[wh];
  int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  int vmin[] = new int[Math.max(w, h)];
  int divsum = (div + 1) >> 1;
  divsum *= divsum;
  int dv[] = new int[256 * divsum];
  for (i = 0; i < 256 * divsum; i++) {
   dv[i] = (i / divsum);
  }
  yw = yi = 0;
  int[][] stack = new int[div][3];
  int stackpointer;
  int stackstart;
  int[] sir;
  int rbs;
  int r1 = radius + 1;
  int routsum, goutsum, boutsum;
  int rinsum, ginsum, binsum;
  for (y = 0; y < h; y++) {
   rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
   for (i = -radius; i <= radius; i++) {
    p = pix[yi + Math.min(wm, Math.max(i, 0))];
    sir = stack[i + radius];
    sir[0] = (p & 0xff0000) >> 16;
    sir[1] = (p & 0x00ff00) >> 8;
    sir[2] = (p & 0x0000ff);
    rbs = r1 - Math.abs(i);
    rsum += sir[0] * rbs;
    gsum += sir[1] * rbs;
    bsum += sir[2] * rbs;
    if (i > 0) {
     rinsum += sir[0];
     ginsum += sir[1];
     binsum += sir[2];
    } else {
     routsum += sir[0];
     goutsum += sir[1];
     boutsum += sir[2];
    }
   }
   stackpointer = radius;
   for (x = 0; x < w; x++) {
    r[yi] = dv[rsum];
    g[yi] = dv[gsum];
    b[yi] = dv[bsum];
    rsum -= routsum;
    gsum -= goutsum;
    bsum -= boutsum;
    stackstart = stackpointer - radius + div;
    sir = stack[stackstart % div];
    routsum -= sir[0];
    goutsum -= sir[1];
    boutsum -= sir[2];
    if (y == 0) {
     vmin[x] = Math.min(x + radius + 1, wm);
    }
    p = pix[yw + vmin[x]];
    sir[0] = (p & 0xff0000) >> 16;
    sir[1] = (p & 0x00ff00) >> 8;
    sir[2] = (p & 0x0000ff);
    rinsum += sir[0];
    ginsum += sir[1];
    binsum += sir[2];
    rsum += rinsum;
    gsum += ginsum;
    bsum += binsum;
    stackpointer = (stackpointer + 1) % div;
    sir = stack[(stackpointer) % div];
    routsum += sir[0];
    goutsum += sir[1];
    boutsum += sir[2];
    rinsum -= sir[0];
    ginsum -= sir[1];
    binsum -= sir[2];
    yi++;
   }
   yw += w;
  }
  for (x = 0; x < w; x++) {
   rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
   yp = -radius * w;
   for (i = -radius; i <= radius; i++) {
    yi = Math.max(0, yp) + x;
    sir = stack[i + radius];
    sir[0] = r[yi];
    sir[1] = g[yi];
    sir[2] = b[yi];
    rbs = r1 - Math.abs(i);
    rsum += r[yi] * rbs;
    gsum += g[yi] * rbs;
    bsum += b[yi] * rbs;
    if (i > 0) {
     rinsum += sir[0];
     ginsum += sir[1];
     binsum += sir[2];
    } else {
     routsum += sir[0];
     goutsum += sir[1];
     boutsum += sir[2];
    }
    if (i < hm) {
     yp += w;
    }
   }
   yi = x;
   stackpointer = radius;
   for (y = 0; y < h; y++) {
    // Preserve alpha channel: ( 0xff000000 & pix[yi] )
    pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
      | (dv[gsum] << 8) | dv[bsum];
    rsum -= routsum;
    gsum -= goutsum;
    bsum -= boutsum;
    stackstart = stackpointer - radius + div;
    sir = stack[stackstart % div];
    routsum -= sir[0];
    goutsum -= sir[1];
    boutsum -= sir[2];
    if (x == 0) {
     vmin[y] = Math.min(y + r1, hm) * w;
    }
    p = x + vmin[y];
    sir[0] = r[p];
    sir[1] = g[p];
    sir[2] = b[p];
    rinsum += sir[0];
    ginsum += sir[1];
    binsum += sir[2];
    rsum += rinsum;
    gsum += ginsum;
    bsum += binsum;
    stackpointer = (stackpointer + 1) % div;
    sir = stack[stackpointer];
    routsum += sir[0];
    goutsum += sir[1];
    boutsum += sir[2];
    rinsum -= sir[0];
    ginsum -= sir[1];
    binsum -= sir[2];
    yi += w;
   }
  }
  return pix;
 }
}

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 24
码字总数 15717
作品 0
宁波
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0
干货系列1:Java互联网网站开发工程师 的技术提高与晋升路线(技术专精)

前几天写了自己对于Java软件开发工程师职业发展规划方面的一些感悟,陆续收到一些反馈,希望我能再就Java工程师不同的开发(职责)方向谈谈职业发展问题。(上一篇:Java软件开发工程师的自我...

半饱即好
06/26
0
0
java基础学习_概述_day01总结

============================================================================= ============================================================================= 涉及到的知识点有:  ......

黑泽明军
02/02
0
0
RenderScript高斯模糊等与图片处理/计算机视觉-Android

> RenderScript Google 官方RenderScript- https://developer.android.com/guide/topics/renderscript/compute RenderScript在3.0引入,而一些内置的compute kernel在JELLYBEANMR1中引入,为......

shareus
05/03
0
0
用 JNI 进行 Java 编程(5)

结束语和参考资料 结束语 Java 本机接口是 Java 平台中一种设计良好和良好集成的 API。它被设计成用来使您能将本机代码合并到 Java 程序中,也为您提供了一种在用其它编程语言编写的程序中使...

Jerikc
2012/10/08
0
0
什么是J2EE、Java SE、Java EE、Java ME?

目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Ed...

Midnight
2010/12/28
0
0
Sun JVM,JRocket,J9,Harmony, 四种主要的Java虚拟机实现

说在前面 点击链接加入群【JavaEE(SSH+IntelliJIDE+Maven)】:http://jq.qq.com/?wv=1027&k=Qr6905 JVM(Java 虚拟机)目前主要是这4个. 微软JVM死了N多年了,GCJ支持到1.4.2之后,处于停滞状态....

moz1q1
2014/08/20
0
0
URL短地址压缩算法 微博短地址原理解析 (Java实现)

最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷。同时还发现有...

神勇小白鼠
2014/07/29
0
0
学习JVM是如何从入门到放弃的?

只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记。现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书。 学习JVM的目的也很简单: 能够知道JVM是什么,为我们...

Java3y
07/11
0
2
一篇简单易懂的原理文章,让你把JVM玩弄与手掌之中

jvm原理 Java虚拟机是整个java平台的基石,是java技术实现硬件无关和操作系统无关的关键环节,是java语言生成极小体积的编译代码的运行平台,是保护用户机器免受恶意代码侵袭的保护屏障。JVM...

烂猪皮
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

DUBBO 详细介绍

摘要: 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 Registry: 服务目录框架...

明理萝
9分钟前
0
1
4 个快速的 Python 编译器 for 2018

简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试。 Python 其实是一种相当快的语言,但它并不像编译...

极光推送
12分钟前
0
0
spring boot注册多个MQ服务器的问题

关于注册到多个MQ源的文章已经有很多了,这里记录一下声明queue的坑; 如果使用注册bean的方式声明queue,会导致声明的queue同时被注册到所有的MQ源上; //如果使用下面的声明方式,que...

placeholder
13分钟前
0
0
Java面试基础篇——第九篇:BIO,NIO,AIO的区别

现在IO模型主要分三类:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。 先来看看BIO。 1. BIO 服务端接受到请求后,要指派或新建一个线程去处理客户端的IO请求,直到收到断开连接的指令。这么做...

developlee的潇洒人生
18分钟前
0
0
@RequestMapping @ResponseBody 和 @RequestBody 用法与区别

1.@RequestMapping 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为...

特拉仔
20分钟前
1
0
基于 HTML5 结合互联网+ 的 3D 隧道

前言 目前,物资采购和人力成本是隧道业发展的两大瓶颈。比如依靠民间借贷,融资成本很高;采购价格不透明,没有增值税发票;还有项目管控和供应链管理的问题。成本在不断上升,利润在不断下...

xhload3d
22分钟前
0
0
济南小程序热度分析

原文链接:http://www.jnqianle.cn/company/2072.html

tianma3798
23分钟前
1
0
大数据软件

beats 采集 kafka spark hive es grafana zeppelin

ArlenXu
25分钟前
0
0
Mac item2常用快捷键

标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:command + f 分屏 水平分屏:command + d 垂直分屏:c...

说回答
28分钟前
0
0
mac常用软件

1.excel for mac http://www.pc6.com/mac/114205.html

小黑202
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部