高斯模糊

高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降低细节层次。这种模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果。 从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波器。

高斯模糊运用了高斯的正态分布的密度函数,计算图像中每个像素的变换。

根据一维高斯函数,可以推导得到二维高斯函数:

其中r是模糊半径,r^2 = x^2 + y^2,σ是正态分布的标准偏差。在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。

其实,在iOS上实现高斯模糊是件很容易的事儿。早在iOS 5.0就有了Core Image的API,而且在CoreImage.framework库中,提供了大量的滤镜实现。

+(UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur

{

CIContext *context = [CIContext contextWithOptions:nil];

CIImage *inputImage= [CIImage imageWithCGImage:image.CGImage];

//设置filter

CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];

[filter setValue:inputImage forKey:kCIInputImageKey]; [filter setValue:@(blur) forKey: @"inputRadius"];

//模糊图片

CIImage *result=[filter valueForKey:kCIOutputImageKey];

CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];

UIImage *blurImage=[UIImage imageWithCGImage:outImage];

CGImageRelease(outImage);

return blurImage;

}

在Android上实现高斯模糊也可以使用原生的API—–RenderScript,不过需要Android的API是17以上,也就是Android 4.2版本。

/**

* 使用RenderScript实现高斯模糊的算法

* @param bitmap

* @return

*/

public Bitmap blur(Bitmap bitmap){

//Let's create an empty bitmap with the same size of the bitmap we want to blur

Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);

//Instantiate a new Renderscript

RenderScript rs = RenderScript.create(getApplicationContext());

//Create an Intrinsic Blur Script using the Renderscript

ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));

//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps

Allocation allIn = Allocation.createFromBitmap(rs, bitmap);

Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);

//Set the radius of the blur: 0 < radius <= 25

blurScript.setRadius(20.0f);

//Perform the Renderscript

blurScript.setInput(allIn);

blurScript.forEach(allOut);

//Copy the final bitmap created by the out Allocation to the outBitmap

allOut.copyTo(outBitmap);

//recycle the original bitmap

bitmap.recycle();

//After finishing everything, we destroy the Renderscript.

rs.destroy();

return outBitmap;

}

我们开发的图像框架cv4j也提供了一个滤镜来实现高斯模糊。

GaussianBlurFilter filter = new GaussianBlurFilter();

filter.setSigma(10);

RxImageData.bitmap(bitmap).addFilter(filter).into(image2);

可以看出,cv4j实现的高斯模糊跟RenderScript实现的效果一致。

其中,GaussianBlurFilter的代码如下:

public class GaussianBlurFilter implements CommonFilter {

private float[] kernel;

private double sigma = 2;

ExecutorService mExecutor;

CompletionService service;

public GaussianBlurFilter() {

kernel = new float[0];

}

public void setSigma(double a) {

this.sigma = a;

}

@Override

public ImageProcessor filter(final ImageProcessor src){

final int width = src.getWidth();

final int height = src.getHeight();

final int size = width*height;

int dims = src.getChannels();

makeGaussianKernel(sigma, 0.002, (int)Math.min(width, height));

mExecutor = TaskUtils.newFixedThreadPool("cv4j",dims);

service = new ExecutorCompletionService<>(mExecutor);

// save result

for (int i=0; i

final int temp = i;

service.submit(new Callable() {

public Void call() throws Exception {

byte[] inPixels = src.tobyte(temp);

byte[] temp = new byte[size];

blur(inPixels, temp, width, height);

// H Gaussian

blur(temp, inPixels, height, width);

// V Gaussain

return null;

}

}

);

}

for (int i = 0; i < dims; i++) {

try {

service.take();

}

catch (InterruptedException e) {

e.printStackTrace();

}

}

mExecutor.shutdown();

return src;

}

/**

*

here is 1D Gaussian ,

*

* @param inPixels

* @param outPixels

* @param width

* @param height

*/

private void blur(byte[] inPixels, byte[] outPixels, int width, int height)

{

int subCol = 0;

int index = 0, index2 = 0;

float sum = 0;

int k = kernel.length-1;

for (int row=0; row

int c = 0;

index = row;

for (int col=0; col

sum = 0;

for (int m = -k; m< kernel.length; m++) {

subCol = col + m;

if(subCol < 0 || subCol >= width) {

subCol = 0;

}

index2 = row * width + subCol;

c = inPixels[index2] & 0xff;

sum += c * kernel[Math.abs(m)];

}

outPixels[index] = (byte)Tools.clamp(sum);

index += height;

}

}

}

public void makeGaussianKernel(final double sigma, final double accuracy, int maxRadius) {

int kRadius = (int)Math.ceil(sigma*Math.sqrt(-2*Math.log(accuracy)))+1;

if (maxRadius < 50) maxRadius = 50;

// too small maxRadius would result in inaccurate sum.

if (kRadius > maxRadius) kRadius = maxRadius;

kernel = new float[kRadius];

for (int i=0; i

kernel[i] = (float)(Math.exp(-0.5*i*i/sigma/sigma));

double sum;

// sum over all kernel elements for normalization

if (kRadius < maxRadius) {

sum = kernel[0];

for (int i=1; i

sum += 2*kernel[i];

} else

sum = sigma * Math.sqrt(2*Math.PI);

for (int i=0; i

double v = (kernel[i]/sum);

kernel[i] = (float)v;

}

return;

}

}

空间卷积

二维卷积在图像处理中会经常遇到,图像处理中用到的大多是二维卷积的离散形式。

以下是cv4j实现的各种卷积效果。

cv4j 目前支持如下的空间卷积滤镜

filter

名称

作用

ConvolutionHVFilter

卷积

模糊或者降噪

MinMaxFilter

最大最小值滤波

去噪声

SAPNoiseFilter

椒盐噪声

增加噪声

SharpFilter

锐化

增强

MedimaFilter

中值滤波

去噪声

LaplasFilter

拉普拉斯

提取边缘

FindEdgeFilter

寻找边缘

梯度提取

SobelFilter

梯度

获取x、y方向的梯度提取

VarianceFilter

方差滤波

高通滤波

MaerOperatorFilter

马尔操作

高通滤波

USMFilter

USM

增强

cv4j 是gloomyfish和我一起开发的图像处理库,目前还处于早期的版本。

目前已经实现的功能:

这周,我们对 cv4j 做了较大的调整,对整体架构进行了优化。还加上了空间卷积功能(图片增强、锐化、模糊等等)。接下来,我们会做二值图像的分析(腐蚀、膨胀、开闭操作、轮廓提取等等)

总结

以上就是本文关于Java编程实现高斯模糊和图像的空间卷积详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

高斯模糊java代码_Java编程实现高斯模糊和图像的空间卷积详解相关推荐

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

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

  2. 高斯模糊java代码_Java 实现高斯模糊算法

    接上篇文章<高斯模糊算法的原理>,本文我们借助 java 来实现高斯模糊算法,并使用高斯模糊算法处理实际图片. 高斯模糊就是图像和高斯函数的卷积.等价于傅里叶变换后乘上高斯函数再逆变换回来 ...

  3. 3D屏保JAVA代码_java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test; import java.awt.Frame; import java.awt.Grap ...

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

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

  5. java值参_Java陷阱之慎用入参做返回值详解

    正常情况下,在Java中入参是不建议用做返回值的.除了造成代码不易理解.语义不清等问题外,可能还埋下了陷阱等你入坑. 问题背景 比如有这么一段代码: @Named public class AServ ...

  6. jetty java 实例_java 在Jetty9中使用HttpSessionListener和Filter实例详解

    这篇文章主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下 java 在Jetty9中使用HttpSessionListene ...

  7. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  8. 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能

    机械臂控制软件,上位机软件 此机器人上位软件. 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能,子程序编程功能,逻辑判断语句功能,示教编程功能(支持手柄),变量位置编程功能, ...

  9. java中北大学ppt总结+课后习题第二章(小宇特详解)

    java中北大学ppt总结+课后习题第二章(小宇特详解) 基本数据类型 Java语言有8种基本数据类型. 逻辑类型:boolean.1字节 整数类型: 1字节整数类型:byte. 2字节整数类型:sh ...

最新文章

  1. tensorflow打印模型结构_Tensorflow上手1: Print与py_func
  2. 看完阿逗比年度炫技大会,我什么都不敢信了
  3. Gromacs文件-Chapter1
  4. 高tps、低延迟_如何在不到1ms的延迟内完成100K TPS
  5. 团队组成五个基本要素_【记录】综合分部宁波分队团队拓展活动
  6. 36岁自学C语言,C语言的数据类型
  7. java怎么判断mysql中是否存在我们查找的索引_10张图告诉你,MySQL 是如何查找数据的?...
  8. excel甘特图模板_最简单的Excel甘特图制作方法,只用一条公式,项目进度一目了然...
  9. c语言的详细编译过程
  10. Path Sum Path Sum II
  11. NSIS:在线下载并安装程序
  12. Python暴力破解WIFI(超详细破解教程+UI设计教程+步步解析)
  13. 简单了解cms(内容管理系统)
  14. windows 控制台提示:请求的操作需要提升
  15. day 9/16 css三大特性和盒子模型
  16. 移动页面HTML5自适应手机屏幕宽度几种办法
  17. Java 在线编程编译工具上线,直接运行Java代码
  18. Android 模拟登陆正方教务系统(一)
  19. html设置手写输入,手写登陆页面
  20. Kafka对Java程序员有多重要?连阿里都再用它处理亿万级数据统计

热门文章

  1. 如何写一份有质量的简历?
  2. 用select语句来代替show create table
  3. 【工作一年总结】做自己喜欢的事时是会发光的,可是老天,能让这光芒更强烈些吗?
  4. python去掉字符串之间的逗号
  5. 服务器损坏是什么意思微信,微信数据库损坏是什么原因?
  6. serverlet分页
  7. 【工具】这21个自动化部署
  8. MySQL讲义第 30 讲——select 查询之子查询
  9. 三种获取苹果设备UID的方式
  10. 芯片MAX3421E (MAXIM)