文档章节

java版高斯算法

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

直接上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基础学习_概述_day01总结

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

黑泽明军
02/02
0
0
Java程序员必读书单,家族又添新成员

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

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

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

半饱即好
06/26
0
0
这个帖子就上传一些自己 百度云中的资源吧~~

贡献一下我的资源(各个地方偷得) 还有一些我书签中的网页吧(18+哦,哈哈) 2018-9-17 update1 应该都失效了,等补连接。 ------------------------------------------------------------...

妹子快加微信
2017/08/15
0
0
基于java版jieba分词实现的tfidf关键词提取

版权声明:本文为博主原创文章,欢迎转载,但请注明出处,谢谢愿意分享知识的你~~ https://blog.csdn.net/qq_32690999/article/details/83246799 基于java版jieba分词实现的tfidf关键词提取 ...

蓝色枫魂
10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

码云项目100,水一发

简单回顾一下: 早期构想最多的,是希望能将PHP一些类和编码分区做得更细,所以很多尝试。但不得不说,PHP的功能过于单一,是的,也许写C/C++扩展,可以解决问题,那我为什么不用C#或者Golan...

曾建凯
今天
3
0
Spring应用学习——AOP

1. AOP 1. AOP:即面向切面编程,采用横向抽取机制,取代了传统的继承体系的重复代码问题,如下图所示,性能监控、日志记录等代码围绕业务逻辑代码,而这部分代码是一个高度重复的代码,也就...

江左煤郎
今天
4
0
eclipse的版本

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环...

mdoo
今天
3
0
SpringBoot源码:启动过程分析(一)

本文主要分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 还是老套路,先把分析过程的时序图摆出来:时序图-SpringBoot2.10启动分析 二.源码分析 首...

Jacktanger
今天
6
0
小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部