寻找快速图像失真算法

我正在尝试实现一个使用shpere失真滤波器的应用程序。我正在使用此处的算法,它通过getPixel()和setpixel()方法更改像素位置。我的问题是它对Android设备来说太慢了,并且有些应用程序实现相同的球体(和其他)过滤方式比我的方法更快。 (例如Picsay Pro应用程序)任何人都可以共享或指示查找或实现快速失真算法。 实现算法的实际过滤器:
public boolean sphereFilter(Bitmap b, boolean bSmoothing)
{   
    int nWidth = b.getWidth();
    int nHeight = b.getHeight();

    Point  [][] pt = new Point[nWidth][nHeight];
    Point mid = new Point();
    mid.x = nWidth/2;
    mid.y = nHeight/2;

    double theta, radius;
    double newX, newY;

    for (int x = 0; x < nWidth; ++x)
        for (int y = 0; y < nHeight; ++y)
        {
            pt[x][y]= new Point();
        }

    for (int x = 0; x < nWidth; ++x)
        for (int y = 0; y < nHeight; ++y)
        {
            int trueX = x - mid.x;
            int trueY = y - mid.y;
            theta = Math.atan2((trueY),(trueX));

            radius = Math.sqrt(trueX*trueX + trueY*trueY);

            double newRadius = radius * radius/(Math.max(mid.x, mid.y));

            newX = mid.x + (newRadius * Math.cos(theta));

            if (newX > 0 && newX < nWidth)
            {
                pt[x][y].x = (int) newX;
            }
            else
            {
                pt[x][y].x = 0;
                pt[x][y].y = 0;
            }

            newY = mid.y + (newRadius * Math.sin(theta));

            if (newY > 0 && newY < nHeight && newX > 0 && newX < nWidth)
            {                   
                pt[x][ y].y = (int) newY;
            }
            else
            {
                pt[x][y].x = pt[x][y].y = 0;
            }
        }
    offsetFilterAbs(b, pt);
    return true;
}
替换计算像素位置的代码。
public boolean offsetFilterAbs(Bitmap b, Point[][] offset )
{
        int nWidth = b.getWidth();
        int nHeight = b.getHeight();

        int xOffset, yOffset;

        for(int y=0;y < nHeight;++y)
        {
            for(int x=0; x < nWidth; ++x )
            {   
                xOffset = offset[x][y].x;
                yOffset = offset[x][y].y;

                if (yOffset >= 0 && yOffset < nHeight && xOffset >= 0 && xOffset < nWidth)
                {
                    b.setPixel(x, y, b.getPixel(xOffset, yOffset));
                }                   
            }               
        }

    return true;
}
    
已邀请:
  我目前正在使用相同的算法与你的链接上的那个,它仍然是Android设备太慢 从上面评论中的链接: 特定 r = Sqrt((x - 0.5)^ 2 +(y - 0.5)^ 2) a = ArcTan2(y - 0.5,x - 0.5) n =凸出系数(默认= 1) 组 x'= r ^ n * Cos(a)+ 0.5 y'= r ^ n * Sin(a)+ 0.5 (请记住,在此等式中,
x
y
从0到1.如果尺寸范围从0到
w
,则将
0.5
替换为
w/2
) 使用一点数学,我们可以看到 Cos(a)= Cos(ArcTan2(y - 0.5,x - 0.5))        =(x - 0.5)/ r Sin(a)= Sin(ArcTan2(y - 0.5,x - 0.5))        =(y - 0.5)/ r 这是最终得到的等式 r =(x-0.5)^ 2 +(y-0.5)^ 2 n =凸出系数(默认= 0) 组 x'= r ^ n *(x-0.5)+ 0.5 y'= r ^ n *(y - 0.5)+ 0.5 (我删除了平方根,因为我们将结果转化为实际功率...所以真的要使这个等效我们应该使用
n/2
而不是
n
,但是因为我们正在定义“膨胀因子”,我们可以离开超出部门) 只需要少量乘法和单次实数取幂,这可能是您希望得到的最快速度。     

要回复问题请先登录注册