blur--快速模糊算法!

针对yuv数据,模糊Y分量;

void superFastBlurYUV(unsigned char *pix, int w, int h, int blurRadius,int centx,int centy,int circleRadius,int smoothRadius)
{
    const int byteCount = 1;
    int radius = (blurRadius/10)*2;
    int minW_h = (smoothRadius+circleRadius);//min(w,h)/2;
    //bool ischange = false;
    int div;
    int wm, hm, wh;
    int *vMIN, *vMAX;
    unsigned char *r, *g, *b, *dv;
    int rsum, gsum, bsum, x, y, i, p, p1, p2, yp, yi, yw;

    int posx = 0;
    int posy = 0;
    if (radius < 1) return;

    wm = w - 1;
    hm = h - 1;
    wh = w * h;
    div = radius + radius + 1;
    vMIN = (int *)malloc(sizeof(int) * max(w, h));
    vMAX = (int *)malloc(sizeof(int) * max(w, h));
    //r = (unsigned char *)malloc(sizeof(unsigned char) * wh);
    //g = (unsigned char *)malloc(sizeof(unsigned char) * wh);
    b = (unsigned char *)malloc(sizeof(unsigned char) * wh);
    dv = (unsigned char *)malloc(sizeof(unsigned char) * 256 * div);

    for (i = 0; i < 256 * div; i++){
        dv[i] = (i / div);
    }

    yw = yi = 0;

    for (y = 0; y < h; y++)
    {
        rsum = gsum = bsum = 0;
        for (i = -radius; i <= radius; i++)
        {
            p = (yi + min(wm, max(i, 0))) * byteCount;
            bsum += pix[p];
            //gsum += pix[p + 1];
            //rsum += pix[p + 2];
        }
        for (x = 0; x < w; x++)
        {
            //r[yi] = dv[rsum];
            //g[yi] = dv[gsum];
            b[yi] = dv[bsum];

            if (y == 0)
            {
                vMIN[x] = min(x + radius + 1, wm);
                vMAX[x] = max(x - radius, 0);
            }
            p1 = (yw + vMIN[x]) * byteCount;
            p2 = (yw + vMAX[x]) * byteCount;

            bsum += pix[p1] - pix[p2];//上一个点后移动1位数
            //gsum += pix[p1 + 1] - pix[p2 + 1];
            //rsum += pix[p1 + 2] - pix[p2 + 2];

            yi++;
        }
        yw += w;
    }

    for (x = 0; x < w; x++)
    {
        //跳过非模糊区域 即圆内
        posx = x;

        rsum = gsum = bsum = 0;
        yp = -radius * w;
        for (i = -radius; i <= radius; i++)
        {
            yi = max(0, yp) + x;
            //rsum += r[yi];
            //gsum += g[yi];
            bsum += b[yi];
            yp += w;
        }
        yi = x;
        for (y = 0; y < h; y++)
        {
            //跳过非模糊区域 即圆内
            //posx = x;
            posy = y;//h-y;
            if((posx-centx)*(posx-centx) + (posy-centy)*(posy-centy)<circleRadius*circleRadius){
                //yi += w;
                //continue;
            }else{

                pix[yi * byteCount] = dv[bsum];
                //pix[yi * byteCount + 1] = dv[gsum];
                //pix[yi * byteCount + 2] = dv[rsum];
            }

            if (x == 0)
            {
                vMIN[y] = min(y + radius + 1, hm) * w;
                vMAX[y] = max(y - radius, 0) * w;
            }

            p1 = x + vMIN[y];
            p2 = x + vMAX[y];

            //rsum += r[p1] - r[p2];
            //gsum += g[p1] - g[p2];
            bsum += b[p1] - b[p2];

            yi += w;
        }
    }

    //free(r);
    //free(g);
    free(b);

    free(vMIN);
    free(vMAX);
    free(dv);
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gnimey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值