Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 并行化后,未使用像素数据填充完整位图。_Android_Image Processing_Bitmap_Parallel Processing - Fatal编程技术网

Android 并行化后,未使用像素数据填充完整位图。

Android 并行化后,未使用像素数据填充完整位图。,android,image-processing,bitmap,parallel-processing,Android,Image Processing,Bitmap,Parallel Processing,我有一个应用程序,可以处理带有球形失真的位图。您可以触摸屏幕并设置包含变形的圆的半径。按下“扭曲”按钮后,将创建与半径大小相同的子集位图,并发送该子集位图进行处理。子集变形后,将使用原始触摸事件中的x、y线将其作为覆盖放回原始位图 除了子集位图的最后一行像素(穿过底部)没有填充像素数据之外,一切正常。看起来子集位图底部有一条黑线。畸变类使用并行编程。这将在运行时检查硬件,以确定有多少处理器可用,并相应地在处理器上拆分位图。我在并行化方面得到了帮助,但不知道如何找出黑线出现的原因。循环似乎正常,有

我有一个应用程序,可以处理带有球形失真的位图。您可以触摸屏幕并设置包含变形的圆的半径。按下“扭曲”按钮后,将创建与半径大小相同的子集位图,并发送该子集位图进行处理。子集变形后,将使用原始触摸事件中的x、y线将其作为覆盖放回原始位图

除了子集位图的最后一行像素(穿过底部)没有填充像素数据之外,一切正常。看起来子集位图底部有一条黑线。畸变类使用并行编程。这将在运行时检查硬件,以确定有多少处理器可用,并相应地在处理器上拆分位图。我在并行化方面得到了帮助,但不知道如何找出黑线出现的原因。循环似乎正常,有什么想法吗?事先谢谢你,马特

import java.util.concurrent.Callable;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.FutureTask;
导入android.graphics.Bitmap;
导入android.os.Debug;
导入android.util.Log;
公共类MultiRuntimeProcessorFilter{
私有静态最终字符串TAG=“mrpf”;
私有整数x=0;
私有位图输入=空;
私有整数半径;
public void createBitmapSections(int nOp,int[]节){
int处理器=nOp;
int jMax=input.getHeight();
intasectionsize=(int)Math.ceil(jMax/processors);
Log.e(TAG,“+sections size=“+aSectionSize”);
int k=0;
对于(int h=0;h 24)&0xFF;
标量[1]=(rgb>>>16)&0xFF;
标量[2]=(rgb>>>8)&0xFF;
标量[3]=(rgb>>>0)&0xFF;
返回标量;
}
浮点getRadialX(浮点x、浮点y、浮点cx、浮点cy、浮点k){
x=(x*xscale+xshift);
y=(y*yscale+yshift);
浮点数res=x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy));
返回res;
}
浮点getRadialY(浮点x、浮点y、浮点cx、浮点cy、浮点k){
x=(x*xscale+xshift);
y=(y*yscale+yshift);
浮点数res=y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy));
返回res;
}
浮动计算移位(浮动x1、浮动x2、浮动cx、浮动k){
浮动x3=(浮动)(x1+(x2-x1)*0.5);
浮点数res1=x1+((x1-cx)*k*((x1-cx)*(x1-cx));
浮点数res3=x3+((x3-cx)*k*((x3-cx)*(x3-cx));
如果(res1>-thresh&&res1如果(res3我的猜测是,当处理图像底部时,由于桶方法中的半径,操作部分在输入图像上操作,部分在图像外部操作。在实际图像边界之外操作时,边缘通常会导致问题,结果为0,这可能会导致黑线

我建议尝试增大图像的大小:

@SuppressWarnings("unchecked")
public Bitmap barrel (Bitmap input, float k, int r){
    this.radius = r;
    this.input = input;

    // Add an offset to the width and height equal to the radius
    // To avoid performing processing outside the bounds of the input image
    int []arr = new int[(input.getWidth() + this.radius) * (input.getHeight() + this.radius)];
    // Continue...

再说一次,这是我的第一个猜测,我现在没有时间检查,但我的建议肯定是首先调查边缘。

只是一个猜测,如果你把这个放进去会发生什么

BitmapDrawable bmpd = new BitmapDrawable(input);
int []arr = new int[(bmpd.getIntrinsicWidth() + this.radius) * (bmpd. getIntrinsicHeight() + this.radius)];

您的问题很可能与您假定的图像坐标系和球体化算法有关

我希望您按照像素索引方法处理输入/输出图像,但Sphereize算法使用空间坐标系处理数据。这通常会导致处理图像的最外边界为空,因为该算法已将图像向上和向左平移0.5像素。坐标原始系统中的ate 3现在在新系统中为3.5,已超出计算范围

这在2D到3D图像处理算法中实际上是一个巨大的问题,因为两个空间之间的投影并不简单,微小的实现差异会导致明显的问题。请注意像素索引坐标系是3x3,但空间坐标系本质上是4x4


尝试将Sphereize barrel设置为width+1/height+1,而不是width/height,看看这是否填补了缺少的行。

hi,您的意思是将数组设置为w+1 h+1,并将离散像素数据写入其中。此数组是最终扭曲位图的来源?对,将最终输出数组设置为大一个像素。我没有深入阅读你的算法的细节——我(可能很愚蠢)的假设是,如果我们传入一个稍大的输出数组,那么Sphereize算法将缩放输出以匹配该结果。只需理解你发布的代码大约是一个2周的工作,值几千美元。
@SuppressWarnings("unchecked")
public Bitmap barrel (Bitmap input, float k, int r){
    this.radius = r;
    this.input = input;

    // Add an offset to the width and height equal to the radius
    // To avoid performing processing outside the bounds of the input image
    int []arr = new int[(input.getWidth() + this.radius) * (input.getHeight() + this.radius)];
    // Continue...
BitmapDrawable bmpd = new BitmapDrawable(input);
int []arr = new int[(bmpd.getIntrinsicWidth() + this.radius) * (bmpd. getIntrinsicHeight() + this.radius)];