我正在尝试实现使用shpere失真滤波器的应用程序。我使用的是从算法在这里,改变由getPixel像素位置()和setpixel()方法。我的问题是,对于Android设备而言,它太慢了,并且有些应用程序比我的方法更快地实现相同的sphere(和其他)过滤器方法。(例如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(Bithtml" target="_blank">map 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
,但是由于我们_定义的是
“膨胀因子”,因此我们可以省略额外的划分)_
仅需少量的乘法运算和一个实数乘积,这可能是您希望获得的最快速度。
假设我有一个无向多图,即一个(G,E)对,其中G是一个有限的结点集,E是一个有限的边集。我正在寻找一个算法,将分配一个单一的字符串值到每个节点在以下的约束。 1. 每个节点都被赋予一组约束(可能是空的),这些约束限制了允许的值。我希望至少支持以下类型的值约束: null 有两种类型的边缘: 不同, 相同, 这意味着应该为相关节点分配不同/相同的值(意味着不相等/相等的字符串)。 null 这意味着
当我通过VS代码运行我的网页时,我的所有图片都会显示出来,但由于某种原因,当我通过localhost运行网页时,没有任何图片或CSS被发送。这是我下面的代码,任何帮助都将不胜感激。我曾试图在网上找到解决方案,但迄今为止似乎没有任何效果。 这是我的文件结构
什么是快速可靠的方法来阈值图像可能模糊和不均匀的亮度? 示例(模糊但亮度一致): 因为不能保证图像具有均匀的亮度,所以使用固定阈值是不可行的。自适应阈值工作正常,但由于模糊,它会在特征中造成中断和扭曲(这里,重要的特征是数独数字): 我也尝试过使用直方图均衡化(使用OpenCV的均衡器函数)。它在不减少亮度差异的情况下增加对比度。 我找到的最佳解决方案是将图像按其形态闭合(归功于这篇文章)进行分割
问题内容: 我设法在Swift中为注解图钉获得了一个自定义图标,但是现在我仍然对2个不同的注解使用不同的图像。现在,一个按钮会在地图上添加注释。应该有另一个按钮,该按钮也添加了注释,但带有另一个图标。 有没有办法为此使用复用ID? 问题答案: 在委托方法中,设置调用该方法所基于的依据。 一定要做到这一点 后 视图被出队或创建的(而不是只在部分)。否则,使用出队视图的注释将显示以前使用该视图的注释的
问题内容: 我正在开发Midlet应用程序。我发现自己经常需要缩放图像。这已经成为一个问题,因为某些电话速度很慢,缩放时间太长。 目前,我正在使用Image.createRGBImage(int,int,int,boolean)缩放图像。 我想知道你们中是否有人知道一种非常有效和快速的缩放图像的方法。 注意: 这是一个Midlet应用程序,因此仅JavaME可用,这意味着我无权访问完整Java版本
我正在尝试在运行时使用Java2D和某种像样的抗锯齿插值(如双线性)来扩展backbuffer。我的想法是将场景渲染到此图像,然后在全屏模式下放大图像,以匹配用户具有的任何分辨率。 请注意,全屏模式很重要。这在窗口模式下不会发生。 有没有一种使用硬件扩展的快速方法?Javadocs建议它存在(-Dsun.java2d.ddscale=true),但它对我没有影响。 代码如下: 结果是: 最近邻(约
问题内容: 我正在使用flask设置本地服务器。我目前要做的就是使用index.html页面中的img标签显示图像。但是我总是出错 flask在哪里寻找文件?一点帮助将是巨大的。我的HTML代码是 我的python代码是: 问题答案: 图像文件是否在目录中ayrton_senna_movie_wallpaper_by_bashgfx-d4cm6x6.jpg ?如果将其移至静态目录并按如下方式更新H
我目前正在阅读OpenCV网站tyring上的示例代码,以查找图像中的轮廓。 我首先读取图像并转换为灰度: 然后,我通过应用阈值将图像转换为二进制: 根据教程...然后,我应该能够调用阈值图像上的: 当尝试执行此代码时,由于某种原因,我得到一个类型错误: 轮廓=cv2。findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_Abrox_SIMPLE)类型错误:图像不