`
jishublog
  • 浏览: 861983 次
文章分类
社区版块
存档分类
最新评论

图像处理之基于一维高斯快速模糊

 
阅读更多

数学基础:

二维高斯模糊的数学表达如下:


简单表达为G(x, y) = G(x)G(y)由此,对一个二维的像素矩阵可以分别在水平与垂直方向

进行一维高斯模糊其效果等同与二维高斯模糊效果。由于计算量的减少,速度却比二维

高斯模糊更快。

运行结果:


关键代码解析:

生成一维高斯核的代码如下,其中对高斯核实现归一化预处理

private float[] generateGaussianKeneral(int n, float sigma) {
	float sigma22 = 2*sigma*sigma;
	float Pi2 = 2*(float)Math.PI;
	float sqrtSigmaPi2 = (float)Math.sqrt(Pi2) * sigma ;
	int size = 2*n + 1;
	int index = 0;
	gaussianKeneral = new float[size];
	float sum = 0.0f;
	for(int i=-n; i<=n; i++) {
		float distance = i*i;
		gaussianKeneral[index] = (float)Math.exp((-distance)/sigma22)/sqrtSigmaPi2;
		//System.out.println("\t" + gaussianKeneral[index]);
		sum += gaussianKeneral[index];
		index++;
	}
	
	// nomalization to 1
	for(int i=0; i<gaussianKeneral.length; i++) {
		gaussianKeneral[i] = gaussianKeneral[i]/sum;
		//System.out.println("final gaussian data " + i + " = " + gaussianKeneral[i]);
	} 
	return gaussianKeneral;
}
实现对越界像素值的处理:

public static int clamp(float a) {
	return (int)(a < 0 ?  0 : ((a > 255) ? 255 : a));
}
全部算法源代码如下:

package com.gloomyfish.filter.study;

import java.awt.image.BufferedImage;

public class HVGaussianFilter extends AbstractBufferedImageOp {
	private float[] gaussianKeneral = null;
	private int radius = 2; // default value
	private float sigma = 10;
	public HVGaussianFilter() {
		
	}
	
	public void setSigma(float a) {
		this.sigma = a;
	}
	
	public void setRadius(int size) {
		this.radius = size;
	}
	
	public float[][] getHVGaussianKeneral() {
		float[][] hvKeneralData = new float[5][5];
		for(int i=0; i<5; i++)
		{
			for(int j=0; j<5; j++) 
			{
				hvKeneralData[i][j] = gaussianKeneral[i] * gaussianKeneral[j];
			}
		}
		return hvKeneralData;
	}
	
	@Override
	public BufferedImage filter(BufferedImage src, BufferedImage dest) {
		generateGaussianKeneral(radius, sigma);
        int width = src.getWidth();
        int height = src.getHeight();

        if ( dest == null )
        	dest = createCompatibleDestImage( src, null );

        int[] inPixels = new int[width*height];
        int[] outPixels = new int[width*height];
        getRGB( src, 0, 0, width, height, inPixels);
        blur( inPixels, outPixels, width, height); // H Gaussian
        blur( outPixels, inPixels, height, width); // V Gaussain
        setRGB(dest, 0, 0, width, height, inPixels );
        return dest;
	}

	/**
	 * <p> here is 1D Gaussian        , </p>
	 * 
	 * @param inPixels
	 * @param outPixels
	 * @param width
	 * @param height
	 */
	private void blur(int[] inPixels, int[] outPixels, int width, int height)
	{
		int subCol = 0;
		int index = 0, index2 = 0;
		float redSum=0, greenSum=0, blueSum=0;
        for(int row=0; row<height; row++) {
        	int ta = 0, tr = 0, tg = 0, tb = 0;
        	index = row;
        	for(int col=0; col<width; col++) {
        		// index = row * width + col;
        		redSum=0;
        		greenSum=0;
        		blueSum=0;
        		for(int m=-2; m<=2; m++) {
        			subCol = col + m;
        			if(subCol < 0 || subCol >= width) {
        				subCol = 0;
        			}
        			index2 = row * width + subCol;
            		ta = (inPixels[index2] >> 24) & 0xff;
                    tr = (inPixels[index2] >> 16) & 0xff;
                    tg = (inPixels[index2] >> 8) & 0xff;
                    tb = inPixels[index2] & 0xff;
                    redSum += (tr * gaussianKeneral[m + 2]);
                    greenSum += (tg * gaussianKeneral[m + 2]);
                    blueSum += (tb * gaussianKeneral[m + 2]);
        		}
        		outPixels[index] = (ta << 24) | (clamp(redSum) << 16) | (clamp(greenSum) << 8) | clamp(blueSum);
        		index += height;// correct index at here!!!, out put pixels matrix,
        	}
        }
	}
	
	public static int clamp(float a) {
		return (int)(a < 0 ?  0 : ((a > 255) ? 255 : a));
	}
	
	private float[] generateGaussianKeneral(int n, float sigma) {
		float sigma22 = 2*sigma*sigma;
		float Pi2 = 2*(float)Math.PI;
		float sqrtSigmaPi2 = (float)Math.sqrt(Pi2) * sigma ;
		int size = 2*n + 1;
		int index = 0;
		gaussianKeneral = new float[size];
		float sum = 0.0f;
		for(int i=-n; i<=n; i++) {
			float distance = i*i;
			gaussianKeneral[index] = (float)Math.exp((-distance)/sigma22)/sqrtSigmaPi2;
			//System.out.println("\t" + gaussianKeneral[index]);
			sum += gaussianKeneral[index];
			index++;
		}
		
		// nomalization to 1
		for(int i=0; i<gaussianKeneral.length; i++) {
			gaussianKeneral[i] = gaussianKeneral[i]/sum;
			//System.out.println("final gaussian data " + i + " = " + gaussianKeneral[i]);
		} 
		return gaussianKeneral;
	}

}
转载文章请务必注明!
分享到:
评论

相关推荐

    《数字图像处理》冈萨雷斯 中文+英文 pdf

    本书是数字图像处理经典著作,作者在对32个国家的134个院校和研究所的教师,学生及自学者进行广泛调查的基础上编写了第三版。除保留了第二版的大部分主要内容外,还根据收集的建议从13个方面进行了修订,新增400多幅...

    基于matlab图像处理(平滑、锐化与边缘提取)、求图像中细胞平均半径,均使用matlab实现

    图像处理(平滑、锐化与边缘提取) 理论基础 图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备...

    老师布置的数字图像处理实验 c#(主要参考c#数字图像算法典型实例)

    《图像处理与计算机视觉》课程简介 本课程是计算机专业研究生教学的“图象处理与计算机视觉”专业选修课程的配套实验课程,是以计算机专业研究生为教学对象,强调理论和上机实践相结合的一门课程。重点培养学生的...

    对图像进行不同卷积核的运算实现图像的加噪、低通滤波、高通滤波、边缘检测、高斯滤波等

    给出一个二维灰度或者彩色图像。 1、 实现对图像进行不同卷积核的运算。 2、 实现图像的加噪、低通滤波、高通滤波、边缘检测、高斯滤波等。 3、 对图像进行特效处理(模糊、马赛克、各种其他特效等)。 4、 有图形...

    图形图像处理实用教程

    图形图像处理是计算机应用最广泛的领域之一。计算机图形图像处理软件的种类很多,本书在简单介绍图形图像处理基本概念的基础上,介绍了目前流行的图像处理软件Photoshop、图形绘制软件CorelDRAW和网络图像处理软件...

    高斯赛达尔法一维有限差分法附matlab代码.zip

    2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士...

    信号与系统课程设计实例源码+项目说明(包含:图像处理(平滑、锐化与边缘提取)、求图像中细胞平均半径,matlab实现).zip

    图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别...

    第十节 图像处理之边缘检测

    图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。 一、 Sobel算子是普通一阶差分,是基于寻找梯度强度。拉普拉斯算子(二阶差分)是基于过零点检测。通过计算梯度,设置阀值,得到...

    图像处理案例三之(2)SIFT特征点检测.docx

    1. 各向异性滤波:主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的,和双边滤波很像。 2. LOG算子:是高斯和拉普拉斯的双结合,即集平衡(高斯算子,高斯滤波)和边沿...

    一文了解高斯滤波器,附原理及实现过程

    高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值... 其中(x,y)(x,y)为点坐标,在图像处理中可认为是整数;σσ是标准差。要想得到一个高斯滤波器的模板,可以对高斯函数进行离散化,

    Image-Processing:该项目是在SRA分配,图像处理任务下完成的

    应用5X5滤镜执行以下任务模糊化锐化 输入图像输出 方块模糊高斯模糊锐化3.边缘检测边缘检测是一种图像处理技术,用于查找图像中对象的边界。 它通过检测亮度不连续来工作。 按以下顺序应用边缘检测垂直边缘检测水平...

    图像增强的实现

    说明:将原始图像 A 按指定的滤波器 h 进行滤波增强处理,增强后的图像 B 与 A 的尺寸和类型相同 图像的变换 1. 离散傅立叶变换的 Matlab 实现 Matlab 函数 fft、fft2 和 fftn 分别可以实现一维、二维和 N 维 DFT ...

    复杂背景下目标三维重构的图像预处理方法

    针对目标三维重构图像处理算法要求背景单一、对实验环境依赖性较大的弊端,提出了一种复杂背景下目标三维重构的图像预处理算法。通过对所采集的图像进行高斯滤波、伽马变换以及直方图均衡化处理,去除图像噪点,对复杂...

    基于空间信息改进聚类的切伦科夫荧光图像去噪算法

    但放射性核素在衰变过程中产生的大量高能射线会造成采集到的切伦科夫荧光图像上存在大量脉冲噪声,严重影响基于切伦科夫荧光图像的定量分析和后续的三维重建等。为了尽可能降低上述噪声,提出了一种结合模糊局部信息...

    基于波域调和滤波扩散模型的图像去噪算法

    其次,通过小波分解变换提取预估计图像中的高频部分进行滤波,为避免边缘模糊,引用拉普拉斯高斯算法构建新算子并将其代入扩散模型。最后,进行小波重构,以得到原始图像的最终逼近,从而均衡运算速度和去噪性能,...

    基于opencv3.1库的JAVA源码

    范例5-4-2修正5-4-1高斯模糊的异常 117 范例5-4-3模糊处理-使用median函数及GUI元件 118 范例5-4-4模糊处理-使用BoxFilter函数及GUI元件 119 范例5-5-1 Threshold-使用临界值函数及GUI元件 122 范例5-5-2 ...

    canny代码matlab-FinalJob-DSP:数字信号处理实验大作业

    数字信号处理实验大作业,图像交互界面的图像处理 Usage Run main.m in Matlab, choose images in local directories and open. Then choose options in the main menu, the image will show in real time. 仅在...

    Opencv3编程入门配套代码

    80 一维直方图的绘制 9.2.4 81 RGB三色直方图的绘制 9.2.5 82 直方图对比 9.3.2 83 反向投影 9.4.7 84 模板匹配 9.5.3 85 实现Harris角点检测:cornerHarris()函数的使用 10.1.4 86 harris角点检测与绘制 10.1.5 87 ...

Global site tag (gtag.js) - Google Analytics