精华内容
下载资源
问答
  • 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降低细节层次。这种模糊技术生成的图像,其视觉...

    高斯模糊

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

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

    41838f2d35c4

    gaussian-function.png

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

    41838f2d35c4

    二维高斯函数.png

    41838f2d35c4

    二维的正太分布.png

    其中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);

    41838f2d35c4

    使用RenderScript实现高斯模糊.png

    41838f2d35c4

    使用cv4j实现高斯模糊.png

    可以看出,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;

    }

    }

    空间卷积

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

    41838f2d35c4

    二维卷积的离散形式.png

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

    41838f2d35c4

    各种卷积效果1.png

    41838f2d35c4

    各种卷积效果2.png

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

    filter

    名称

    作用

    ConvolutionHVFilter

    卷积

    模糊或者降噪

    MinMaxFilter

    最大最小值滤波

    去噪声

    SAPNoiseFilter

    椒盐噪声

    增加噪声

    SharpFilter

    锐化

    增强

    MedimaFilter

    中值滤波

    去噪声

    LaplasFilter

    拉普拉斯

    提取边缘

    FindEdgeFilter

    寻找边缘

    梯度提取

    SobelFilter

    梯度

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

    VarianceFilter

    方差滤波

    高通滤波

    MaerOperatorFilter

    马尔操作

    高通滤波

    USMFilter

    USM

    增强

    总结

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

    目前已经实现的功能:

    41838f2d35c4

    cv4j.png

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

    展开全文
  • 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降低细节层次。这种模糊技术生成的图像,其视觉...

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

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

    AAffA0nNPuCLAAAAAElFTkSuQmCC

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

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    其中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 

    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);

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    可以看出,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

    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 

    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

    index = row;            for(int col=0; col

    sum = 0;                for(int m = -k; m

    subCol = col + m;                    if(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 

    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 

    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

    kernel[i] = (float)v;

    }        return;

    }

    }

    空间卷积

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

    AAffA0nNPuCLAAAAAElFTkSuQmCC

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

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    cv4j 目前支持如下的空间卷积滤镜filter名称作用ConvolutionHVFilter卷积模糊或者降噪

    MinMaxFilter最大最小值滤波去噪声

    SAPNoiseFilter椒盐噪声增加噪声

    SharpFilter锐化增强

    MedimaFilter中值滤波去噪声

    LaplasFilter拉普拉斯提取边缘

    FindEdgeFilter寻找边缘梯度提取

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

    VarianceFilter方差滤波高通滤波

    MaerOperatorFilter马尔操作高通滤波

    USMFilterUSM增强

    总结

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

    目前已经实现的功能:

    AAffA0nNPuCLAAAAAElFTkSuQmCC

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

    展开全文
  • 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降低细节层次。这种模糊技术生成的图像,其视觉...

    高斯模糊

    高斯模糊(英语: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 做了较大的调整,对整体架构进行了优化。还加上了空间卷积功能(图片增强、锐化、模糊等等)。接下来,我们会做二值图像的分析(腐蚀、膨胀、开闭操作、轮廓提取等等)

    【编辑推荐】

    【责任编辑:seeker TEL:(010)68476606】

    点赞 0

    展开全文
  • java生成高斯模糊图片

    千次阅读 2017-04-13 08:41:41
    高斯模糊是一种两维的卷积模糊操作,在图像完成高斯模糊相对于均值模糊来说,计算量会增加,但是高斯模糊可以实现一些特殊效果,特别是在图像噪声(非椒盐噪声)消去方面,更是有着非常好的效果。一维高斯公式如下:一...

    高斯模糊是一种两维的卷积模糊操作,在图像完成高斯模糊相对于均值模糊来说,

    计算量会增加,但是高斯模糊可以实现一些特殊效果,特别是在图像噪声(非椒盐

    噪声)消去方面,更是有着非常好的效果。一维高斯公式如下:

    这里写图片描述

    一看公式,一脸懵逼

    现在只需一键导入jar包,即可立刻生成高斯模糊的图片。

    jar包下载地址:链接:http://pan.baidu.com/s/1boUJOM7 密码:cnxf

    然后java里写个main方法:

    public class Test {
        @SuppressWarnings("static-access")
        public static void main(String[] args) {
            GaussianBlur blur = new GaussianBlur();
            String imgPath = "d:\\20160409_172957_013120_托马斯火山湖_丿时尚丨灬Angel.png";
            int filterNum = 10;
            blur.setGaussianBlurImg(imgPath, filterNum);
        }
    }

    就这么粗暴简单有效,看看效果图

    这里写图片描述

    这里写图片描述

    如果需要高斯模糊的源代码的算法实现,需要加QQ490647751,只需15元开通艳辉vip,即可获取源代码及更多的视频教程。

    上车是看电影的第一动力,你们的点赞评论转发是我写博客的动力!

    全CSDN的丰(好)色(se)博客,这里有书本看不到的Java技术,电影院禁播的电影,欢迎关注QQ群494808400

    展开全文
  • 高斯消元法解线性方程(java实现)检测是否为增广矩阵矩阵必须要符合这个要求,才能得以计算。x1 - 2x2 + x3 = 02x2 - 8x3 = 8-4x1 + 5x2 + 9x3 = -9相应的增广矩阵为| 0 | 2 | -8 | 8 || --- | --- | --- | ---|| 1 |...
  • 网上给的例子很多都是整张图进行处理,操作类也没有暴露相应的类对图片位置进行定位,这样很难满足大家的需求,我通过重写源码来满足需求,代码里的计算方式很复杂,很难理解 这里就不用额外引用ImageEditor.jar ...
  • java8中的实现采用了 Marsaglia polar method (Box–Muller的一种形式), 具体理论如下:随机变量 服从 的均匀分布计算如果, 接着计算, 否则转4, 独立,并且都符合高斯正态分布代码片段:// Random.javaprivate static...
  • //java数组在初始化时自动置0,不需要手动置0 fillArray(n, nums, index); return nums; } private static void fillArray(int n, int[] nums, int index) { if (n == 0) return; int fac = ...
  • Java 高斯函数

    千次阅读 2014-05-25 15:02:58
    计算量会增加,但是高斯模糊可以实现一些特殊效果,特别是在图像噪声(非椒盐   噪声)消去方面,更是有着非常好的效果。   一维高斯公式     其中x是指定密度分布[-n,n]范围的整数,sigma代表标准方差...
  • /************************************** 用高斯列主元消去法求线性方程组** 2*x1 + 2*x2 + 3*x3 = 3*{4*x1 + 7*x2 + 7*x3 = 1* -2*x1+ 4*x2 + 5*x3 = -7***************************************/#include#include...
  • 通过对像素点取平均值计算高斯模糊效果,没有实现权重,只有简单的模糊,矩阵为3X31.[代码][Java]代码import java.awt.Color;import java.awt.image.BufferedImage;import java.io.File;import java.io....
  • 高斯投影坐标计算c\java\vb\matlab代码

    热门讨论 2009-09-15 18:49:16
    大地测量中常用到的高斯投影坐标计算c\java\vb\matlab代码 已测试,计算准确
  • 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像杂讯以及降低细节层次。这种模糊技术生成的图像,其视觉...
  • 功能:计算行列式并输出用法:首先输入行列式的阶数,然后以输入行列式内容。例如:输入: 4 1 2 -1 3 2 3 -1 2 -1 1 1 0 0 1 -2 1输入: 18.0实现:好像是高斯消元,就是每一行乘一个系数减下去,化三角。 ...
  • 高斯模糊java代码_JAVA

    2021-01-10 00:43:29
    JAVAJAVA● ○ ●计算机编程语言● ○ ●Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针...❉❉❉❉❉❉❉❉❉❉发展历程20世纪90年代,硬件领域出现了单片式计算...
  • 经过研究,使用java这个强制数据类型的语言搞数学计算真是不好玩,比起python的scipy或者matlab的nlinfit函数调用,java真是low爆了。这就是社会现实,数学虽然与编程语言无关,但是编程语言对数学的实现有难易...
  • 我有一些可以包含0和n高斯形状的嘈杂数据,我正在尝试实现一种算法,该算法采用最高数据点并... 在pdf中绘制高斯(在基线处停止)计算高斯曲线下的面积计算原始数据点下的面积计算高斯区域解释的总面积百分比我使用...
  • 正算公式(将经纬度转化为坐标):java代码(附有源代码和修改后的代码):源代码:/** * 由经纬度反算成高斯投影坐标 * * @param longitude * @param latitude * @return */public static double[] GaussToBLToGauss( ...
  • 一、统计基本概念期望:又称均值E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn)方差、均方差(Standard Deviation):E{[X-E(X)]^2}用来度量...正态分布(Normal distribution),又名高斯分布(Gaussian distribution):...
  • 高斯消元法的用途很广,它是解决数学问题最重要的方法之一,在《计算方法》这本书的第一章就讲的是高斯消元法,很多问题最终归结为解线性方法组。因为我是个编程初学者,所以这个程序在高手看来可能会觉得funny.不过...
  • 0.前言在学习高斯模糊前我们需要了解几个概念,这样才能帮助我们理解...计算过程大致如下由于卷积这个概念比较难解释(深度学习中也会用到卷积神经网络),暂且就不解释了,只要了解他是一种运算就行了。2.卷积核...
  • 数值分析实践,高斯消去法实现求解线性方程,列主元高斯消去法实现求解线性方程,LU消去法求解线性方程,一个程序实现自主输入输出高斯/列主元高斯的对应增广矩阵,LU中L和U矩阵,最终输出计算结果,增添菜单选项,...
  •  计算1 + 2 + 3 + ... + n 时, 通过收尾相加, 然后乘以最大数/2的方式来实现 /** * 高斯算法 */ public class GaussAlgorithm { public static void main(String[] args) { long n = 999; /* ...
  • 先上效果图:动态调节高斯模糊模糊dialog相机弹框实时高斯模糊原理:在我们洗澡的时候,透过厕所雾蒙蒙的玻璃看过去,是不是很漂亮。这就是现实中的毛玻璃效果。...用正太分布函数,越靠近中心,计算的权重越大...
  • 这题怎么简便计算?分母相同,分子相加是一个简单的高斯求和。大家先在草稿本上,认真地做一遍,然后再看后面的视频。期待您在评论区的留言。温馨提醒:方老师数学课堂,因为视频内容越来越多,为了更好的分类归纳...
  • import java.util.Scanner; public class Zzs_N { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个数字N"); int N = sc.nextInt(); N = N*...
  • 先分组再加减,高斯求和公式简便计算。大家先在草稿本上,认真地做一遍,然后再看后面的视频。期待您在评论区的留言。温馨提醒:方老师数学课堂,因为视频内容越来越多,为了更好的分类归纳内容,将所有优化成三个...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 143
精华内容 57
关键字:

java计算高斯

java 订阅