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


运动模糊图像处理是数字图像处理中的一个重要领域,其目的是在图像中去除由物体运动引起的模糊模糊图像处理中的一个关键问题是如何估计运动模糊的角度。本文将介绍一种基于相位谱分析的运动模糊角度估计算法,并给出其Matlab实现。 首先,我们需要了解一些概念。在数字图像处理中,图像可以看做是二维离散信号的集合。对于一个二维离散信号,其傅里叶变换后得到的是一个复数矩阵,其中每个元素的幅度代表了该空间频率下的信号强度,相位代表了该空间频率下的信号相位。在图像处理中,我们通常将傅里叶变换后的幅度谱和相位谱分别称为图像的频谱和相位谱。 对于一幅受到运动模糊影响的图像,其频谱会呈现出一定的规律性。具体地说,频谱的主要能量会向运动方向的空间频率方向集中。因此,我们可以通过分析频谱的主要能量方向来估计运动模糊的角度。 具体实现时,我们需要进行以下步骤: 1. 对输入图像进行傅里叶变换,得到频谱和相位谱。 2. 对频谱进行归一化处理,使其所有元素的幅度均为1。 3. 在频谱中提取出主要能量方向对应的频率线,即将频谱沿运动方向切成一条线,并将这条线上的频率值取平均作为该方向上的主要频率。 4. 将主要频率转换为角度,即运动模糊的角度。 下面是该算法的Matlab实现代码: ```matlab function angle = estimate_motion_blur_angle(image) % Compute the Fourier transform of the input image freq = fft2(image); % Compute the magnitude spectrum and normalize it mag = abs(freq); mag = mag / max(mag(:)); % Compute the phase spectrum phase = angle(freq); % Compute the mean frequency along the motion direction [h, w] = size(image); x = linspace(-w / 2, w / 2 - 1, w); y = linspace(-h / 2, h / 2 - 1, h)'; [X, Y] = meshgrid(x, y); theta = atan2(Y, X); theta = mod(theta + pi, pi); idx = find(theta > pi / 2); theta(idx) = theta(idx) - pi; motion_angle = atan2(1.5, 10) + pi / 2; freqs = sum(mag .* exp(-1i * phase) .* cos(theta - motion_angle), 2) ... ./ sum(mag, 2); % Convert the mean frequency to an angle angle = atan2(imag(freqs), real(freqs)); end ``` 在上面的代码中,我们首先对输入图像进行傅里叶变换,并计算出频谱和相位谱。然后对频谱进行归一化处理,使其所有元素的幅度均为1。接下来,我们根据运动模糊的方向,在频谱中提取出主要能量方向对应的频率线,并将这条线上的频率值取平均作为该方向上的主要频率。最后,我们将主要频率转换为角度,即运动模糊的角度。 总之,本文介绍了一种基于相位谱分析的运动模糊角度估计算法,并给出了其Matlab实现。该算法可以准确地估计运动模糊的角度,为后续的图像处理提供了基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gnimey

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

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

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

打赏作者

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

抵扣说明:

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

余额充值