一维阵列的java高斯滤波器

cgh8pdjw  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(397)

我想在一维阵列上应用一维高斯滤波器。对于python,有很多库可以实现这一点,但是我没有找到任何适用于android的库。所以我想在没有图书馆的情况下做。最好的方法是什么?哪一个公式是正确的?我只找到二维空间的公式

ttcibm8c

ttcibm8c1#

你看过这篇文章吗?它是一个javascript实现,但应该适用于java。
一维模糊的计算速度更快。e。g。我们要计算水平模糊。我们计算bh[i,j],bh[i,j+1],bh[i,j+2],。。。。但相邻值bh[i,j]和bh[i,j+1]几乎相同。唯一的区别在于最左边的一个值和最右边的一个值。所以bh[i,j+1]=bh[i,j]+f[i,j+r+1]−f[i,j]−r] 是的。
在我们的新算法中,我们将通过创建累加器来计算一维模糊。首先,我们将最左边单元格的值放入其中。然后我们将通过在恒定时间内编辑前一个值来计算下一个值。这种1d模糊的复杂度为o(n)(与r无关)。但是它被执行两次以获得框模糊,这被执行3次以获得高斯模糊。所以这个高斯模糊的复杂度是6*o(n)。

function gaussBlur_4 (scl, tcl, w, h, r) {
    var bxs = boxesForGauss(r, 3);
    boxBlur_4 (scl, tcl, w, h, (bxs[0]-1)/2);
    boxBlur_4 (tcl, scl, w, h, (bxs[1]-1)/2);
    boxBlur_4 (scl, tcl, w, h, (bxs[2]-1)/2);
}
function boxBlur_4 (scl, tcl, w, h, r) {
    for(var i=0; i<scl.length; i++) tcl[i] = scl[i];
    boxBlurH_4(tcl, scl, w, h, r);
    boxBlurT_4(scl, tcl, w, h, r);
}
function boxBlurH_4 (scl, tcl, w, h, r) {
    var iarr = 1 / (r+r+1);
    for(var i=0; i<h; i++) {
        var ti = i*w, li = ti, ri = ti+r;
        var fv = scl[ti], lv = scl[ti+w-1], val = (r+1)*fv;
        for(var j=0; j<r; j++) val += scl[ti+j];
        for(var j=0  ; j<=r ; j++) { val += scl[ri++] - fv       ;   tcl[ti++] = Math.round(val*iarr); }
        for(var j=r+1; j<w-r; j++) { val += scl[ri++] - scl[li++];   tcl[ti++] = Math.round(val*iarr); }
        for(var j=w-r; j<w  ; j++) { val += lv        - scl[li++];   tcl[ti++] = Math.round(val*iarr); }
    }
}
function boxBlurT_4 (scl, tcl, w, h, r) {
    var iarr = 1 / (r+r+1);
    for(var i=0; i<w; i++) {
        var ti = i, li = ti, ri = ti+r*w;
        var fv = scl[ti], lv = scl[ti+w*(h-1)], val = (r+1)*fv;
        for(var j=0; j<r; j++) val += scl[ti+j*w];
        for(var j=0  ; j<=r ; j++) { val += scl[ri] - fv     ;  tcl[ti] = Math.round(val*iarr);  ri+=w; ti+=w; }
        for(var j=r+1; j<h-r; j++) { val += scl[ri] - scl[li];  tcl[ti] = Math.round(val*iarr);  li+=w; ri+=w; ti+=w; }
        for(var j=h-r; j<h  ; j++) { val += lv      - scl[li];  tcl[ti] = Math.round(val*iarr);  li+=w; ti+=w; }
    }
}
9rbhqvlz

9rbhqvlz2#

在android中使用opencv怎么样。有专门讨论这个主题的书籍和文章。例如
android opencv中的高斯低通滤波器。

相关问题