zoukankan      html  css  js  c++  java
  • canvas高斯模糊算法

    对于模糊图片这个效果的实现,其实css3中的filter属性也能够实现,但是这个属性的兼容性不是很好,所以我们通常不用这种方法实现,而使用canvas配合JS实现。

    1. <span style="white-space:pre">  </span>//高斯模糊  参数说明:canvas对象或者是数据体对象的宽,height:canvas或者是数据体对象的高,  
    2.     //radius:模糊取值半径(默认为3),sigma:方差取值(默认为1)  
    3.     /** 
    4.      * [Gaussian_blur description] 
    5.      * @param {[type]} data   [description] 
    6.      * @param {[type]} width  [description] 
    7.      * @param {[type]} height [description] 
    8.      * @param {[type]} radius [description] 
    9.      * @param {[type]} sigma  [description] 
    10.      */  
    11.     function Gaussian_blur(data, width, height, radius, sigma) {  
    12.         var gaussMatrix = [],  
    13.             gaussSum = 0,  
    14.             x, y,  
    15.             r, g, b, a,  
    16.             i, j, k, len;  
    17.   
    18.         radius = Math.floor(radius) || 3;  
    19.         sigma = sigma || radius / 3;  
    20.   
    21.         a = 1 / (Math.sqrt(2 * Math.PI) * sigma);  
    22.         b = -1 / (2 * sigma * sigma);  
    23.         //生成高斯矩阵  
    24.         for (i = 0, x = -radius; x <= radius; x++, i++) {  
    25.             g = a * Math.exp(b * x * x);  
    26.             gaussMatrix[i] = g;  
    27.             gaussSum += g;  
    28.   
    29.         }  
    30.   
    31.         //归一化, 保证高斯矩阵的值在[0,1]之间  
    32.         for (i = 0, len = gaussMatrix.length; i < len; i++) {  
    33.             gaussMatrix[i] /= gaussSum;  
    34.         }  
    35.   
    36.         //x方向  
    37.         for (y = 0; y < height; y++) {  
    38.             for (x = 0; x < width; x++) {  
    39.                 r = g = b = a = 0;  
    40.                 gaussSum = 0;  
    41.                 for (j = -radius; j <= radius; j++) {  
    42.                     k = x + j;  a=j+row;  
    43.                     if (k >= 0 && k < width) { //确保 k 没超出 x 的范围  
    44.   
    45.                         i = (y * width + k) * 4;  
    46.                         r += data[i] * gaussMatrix[j + radius];  
    47.                         g += data[i + 1] * gaussMatrix[j + radius];  
    48.                         b += data[i + 2] * gaussMatrix[j + radius];  
    49.                         gaussSum += gaussMatrix[j + radius];  
    50.                     }  
    51.                 }  
    52.                 i = (y * width + x) * 4;  
    53.   
    54.                 data[i] = r / gaussSum;  
    55.                 data[i + 1] = g / gaussSum;  
    56.                 data[i + 2] = b / gaussSum;  
    57.             }  
    58.         }  
    59.         //y方向  
    60.         for (x = 0; x < width; x++) {  
    61.             for (y = 0; y < height; y++) {  
    62.                 r = g = b = a = 0;  
    63.                 gaussSum = 0;  
    64.                 for (j = -radius; j <= radius; j++) {  
    65.                     k = y + j;  
    66.                     if (k >= 0 && k < height) { //确保 k 没超出 y 的范围  
    67.                         i = (k * width + x) * 4;  
    68.                         r += data[i] * gaussMatrix[j + radius];  
    69.                         g += data[i + 1] * gaussMatrix[j + radius];  
    70.                         b += data[i + 2] * gaussMatrix[j + radius];  
    71.                         gaussSum += gaussMatrix[j + radius];  
    72.                     }  
    73.                 }  
    74.                 i = (y * width + x) * 4;  
    75.                 data[i] = r / gaussSum;  
    76.                 data[i + 1] = g / gaussSum;  
    77.                 data[i + 2] = b / gaussSum;  
    78.   
    79.             }  
    80.         }  
    81.   
    82.         return data;  
    83.     }  
  • 相关阅读:
    排序算法——堆排序 转载
    排序之冒泡排序
    排序之直接插入排序(Straight Insertion Sort)
    浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析
    插入法==冒泡排序
    排序的算法
    排序]
    Linux下zoopkeeper的安装和启动
    Linux下zoopkeeper的安装和启动
    Linux下切换使用两个版本的JDK
  • 原文地址:https://www.cnblogs.com/ckAng/p/9334216.html
Copyright © 2011-2022 走看看