• 高斯算法


    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CommonHelper
    {
        /// <summary>
        /// 高斯模糊算法
        /// </summary>
        public class GaussianHelper
        {
            public static double[,] Calculate1DSampleKernel(double deviation, int size)
            {
                double[,] ret = new double[size, 1];
                double sum = 0;
                int half = size / 2;
                for (int i = 0; i < size; i++)
                {
                    ret[i, 0] = 1 / (Math.Sqrt(2 * Math.PI) * deviation) * Math.Exp(-(i - half) * (i - half) / (2 * deviation * deviation));
                    sum += ret[i, 0];
                }
                return ret;
            }
    
            public static double[,] Calculate1DSampleKernel(double deviation)
            {
                int size = (int)Math.Ceiling(deviation * 3) * 2 + 1;
                return Calculate1DSampleKernel(deviation, size);
            }
    
            public static double[,] CalculateNormalized1DSampleKernel(double deviation)
            {
                return CalculateNormalized1DSampleKernel(deviation);
            }
    
            public static double[,] NormalizeMatrix(double[,] matrix)
            {
                double[,] ret = new double[matrix.GetLength(0), matrix.GetLength(1)];
                double sum = 0;
                for (int i = 0; i < ret.GetLength(0); i++)
                {
                    for (int j = 0; j < ret.GetLength(1); j++)
                        ret[i, j] = matrix[i, j] / sum;
    
                }
    
                return ret;
            }
    
            public static double[,] GaussianConvolution(double[,] matrix, double deviation)
            {
                double[,] kernel = CalculateNormalized1DSampleKernel(deviation);
                double[,] res1 = new double[matrix.GetLength(0), matrix.GetLength(1)];
                double[,] res2 = new double[matrix.GetLength(0), matrix.GetLength(1)];
                //x-direction
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                        res1[i, j] = processPoint(matrix, i, j, kernel, 0);
                }
                //y-direction
                for (int i = 0; i < matrix.GetLength(0); i++)
                {
                    for (int j = 0; j < matrix.GetLength(1); j++)
                        res2[i, j] = processPoint(matrix, i, j, kernel, 0);
                }
    
                return res2;
            }
            private static double processPoint(double[,] matrix, int x, int y, double[,] kernel, int direction)
            {
                double res = 0;
                int half = kernel.GetLength(0) / 2;
                for (int i = 0; i < kernel.GetLength(0); i++)
                {
                    int cox = direction == 0 ? x + i - half : x;
                    int coy = direction == 0 ? y + i - half : y;
                    if (cox >= 0 && cox < matrix.GetLength(0) && coy >= 0 && coy < matrix.GetLength(1))
                        res += matrix[cox, coy] * kernel[i, 0];
                }
                return res;
            }
    
            /// <summary>
            /// 对颜色值进行灰色处理
            /// </summary>
            /// <param name="cr"></param>
            /// <returns></returns>
            private Color grayscale(Color cr)
            { 
                return Color.FromArgb(cr.A,(int)(cr.R*.3+cr.G*.59+cr.B*0.11),
                    (int)(cr.R*.3+cr.G*.59+cr.B*0.11),
                        (int)(cr.R*.3+cr.G*.59+cr.B*0.11));
            }
    
            /// <summary>
            /// 对图片进行高斯模糊
            /// </summary>
            /// <param name="d"></param>
            /// <param name="image"></param>
            /// <returns></returns>
            public Bitmap FilterProcessImage(double d, Bitmap image)
            {
                Bitmap ret = new Bitmap(image.Width, image.Height);
                Double[,] matrixR = new Double[image.Width, image.Height];
                Double[,] matrixG = new Double[image.Width, image.Height];
                Double[,] matrixB = new Double[image.Width, image.Height];
                for (int i = 0; i < image.Width; i++)
                {
                    for (int j = 0; j < image.Height; j++)
                    {
                        matrixR[i, j] = image.GetPixel(i, j).R;
                        matrixG[i, j] = image.GetPixel(i, j).G;
                        matrixB[i, j] = image.GetPixel(i, j).B;
                    }
                }
    
                matrixR = GaussianHelper.GaussianConvolution(matrixR, d);
                matrixG = GaussianHelper.GaussianConvolution(matrixG, d);
                matrixB = GaussianHelper.GaussianConvolution(matrixB, d);
    
                for (int i = 0; i < image.Width; i++)
                {
                    for (int j = 0; j < image.Height; j++)
                    {
                        Int32 R = (int)Math.Min(255, matrixR[i, j]);
                        Int32 G = (int)Math.Min(255, matrixG[i, j]);
                        Int32 B = (int)Math.Min(255, matrixB[i, j]);
                        ret.SetPixel(i,j,Color.FromArgb(R,G,B));
                    }
                }
                return ret;
            }
        }
    }
    View Code
  • 相关阅读:
    开发中,android手机WIFI无法使用,无SIM卡故障解决
    2017-2018-1 20179226《Linux内核原理与分析》第五周作业
    2017-2018-1 20179226《Linux内核原理与分析》第四周作业
    2017-2018-1 20179226《Linux内核原理与分析》第三周作业
    2017-2018-1 20179226《Linux内核原理与分析》第二周作业
    20179226《Linux内核原理与分析》第一周读书笔记
    python全栈开发_day31_TCP,UPD和粘包问题
    python全栈开发_day29_元类(下)
    python全栈开发_day28_元类(上)
    python全栈_day27_选课系统项目编写
  • 原文地址:https://www.cnblogs.com/xibianriluo/p/4851065.html
Copyright © 2020-2023  润新知