文档章节

java版高斯算法

 我要五个字
发布于 2016/04/20 08:58
字数 918
阅读 555
收藏 8

直接上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技术之父离开Oracle的原因

Java创始人詹姆斯·高斯林(James Gosling)9日在博客中称,已经在4月2日从甲骨文(Oracle)退休,现在还没有在别的地方任职。 高 斯林在博文中写道:“说到我为什么辞职,这是一个非常难于回答...

红薯
2010/04/12
1K
7
[Code] 收集各种语言对图片的处理算法实现 图片模糊

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.......

Qiujuer
2014/12/07
707
1
java版高斯算法,实现图片模糊效果

求一个用java写的高斯算法,研究了一天没成果,已在崩溃边缘

我要五个字
2016/04/19
1K
6
Java创始人高斯林声称已加盟谷歌

据国外媒体报道,Java创始人詹姆斯高斯林(James Gosling)周一发表博客文章称,他已经加入了谷歌公司。 高斯林在去年甲骨文收购Sun时离开公司。虽然当时业内并不清楚他离开的真正原因,但据...

红薯
2011/03/29
2.1K
30
AWS 推出长期支持的 OpenJDK 免费分发版本 —— Amazon Corretto

简评:听说 Oracle JDK 要收费了,Oracle 要限制 Java 的商业或生产用途,针对这个问题,AWS 将会推出 Amazon Corretto。 Java 是 AWS 用户使用的最流行的编程语言之一,亚马逊一直致力于支持...

极光推送
2018/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
41分钟前
0
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部