Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
计算图像位移-Java_Java_Image_Algorithm_Image Processing - Fatal编程技术网

计算图像位移-Java

计算图像位移-Java,java,image,algorithm,image-processing,Java,Image,Algorithm,Image Processing,简而言之,我正在做与光学鼠标相同的事情。 我拿了两个二维灰度数组,现在比较相等的值,看看有什么不同 示例: 阵列1: 110 01 0 0 0 0 0 0 0 阵列2: 0 0110 01 0 0 0 0 0 下面是我现在要测试的代码。我现在只检查1,就好像它是真实的图像一样。改变这一点并不难 int[][] t1 = new int[][]{ {1,1,0,0}, {0,1,0,0}, {0,0,0

简而言之,我正在做与光学鼠标相同的事情。
我拿了两个二维灰度数组,现在比较相等的值,看看有什么不同

示例:
阵列1:
110
01 0 0
0
0 0 0 0

阵列2:
0
0110
01 0
0 0 0 0

下面是我现在要测试的代码。我现在只检查1,就好像它是真实的图像一样。改变这一点并不难

int[][] t1 = new int[][]{
                {1,1,0,0},
                {0,1,0,0},
                {0,0,0,0},
                {0,0,0,0}
        };
        int[][] t2 = new int[][]{
                {0,0,0,0},
                {0,1,1,0},
                {0,0,1,0},
                {0,0,0,0}   
        };
        double mag = 0.0;
        double angle = 0.0;
        int num = 0;
        for (int i = 0; i < t2.length; i++){
            for (int j = 0; j < t2[i].length; j++){
                if(t2[i][j] == 0) continue;
                //scan through and calculate average magnitude/angle
                if(t2[i][j] == 1){
                    for (int k = 0; k < t1.length; k++){
                        for (int l = 0; l < t1[k].length; l++){
                            if(t1[k][l] == 1){
                                mag += calculateMagnitude(l, k, j, i);
                                angle -= calculateAngle(l, k, j, i);
                                num++;
                            }
                        }
                    }
                }
            }
        }
        double fMag = mag/num;
        double fAngle = angle/num;
        System.out.println(fMag);
        System.out.println(fAngle);
public static double calculateAngle(int x1, int y1, int x2, int y2){
    if(y2 == y1){
        if(x2 > x1) return 90.0;
        else if(x2 < x1) return -90.0;
        else return 0.0;
    } else if(x2 == x1){
        if(y2 > y1) return 0.0;
        else if(y2 < y1) return -180.0;
    }
    return Math.toDegrees(Math.atan( ((double)(y2-y1))/(x2-x1) ));
}

public static double calculateMagnitude(int x1, int y1, int x2, int y2){
    double d1 = Math.pow((x2 - x1),2);
    double d2 = Math.pow((y2 - y1), 2);
    return Math.sqrt(d1 + d2);
}  
int[]t1=新int[]{
{1,1,0,0},
{0,1,0,0},
{0,0,0,0},
{0,0,0,0}
};
int[]t2=新int[]{
{0,0,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}   
};
双磁极=0.0;
双角度=0.0;
int num=0;
对于(int i=0;ix1)返回90.0;
如果(x2y1)返回0.0;
否则如果(y2
然而,这是相当繁重的,因为它是O(n^4),我相信有更有效的方法来做到这一点。我已经做了很多研究,但到目前为止还没有弄清楚如何做。同时,现在的准确答案应该是1.414和-45,这意味着我大约减少了6%。这没关系,但我想说得更准确些

如果有人知道一种方法或者能够想出一种更有效和/或更精确的方法,请发布。听起来不像是个蠢货,但把我和一篇博士研究论文联系起来并说它应该有用并不是我想要的。我做了大量的研究,这些论文主要是指图像是否仍然完全显示在屏幕上


我正在寻找一种方法来计算图像位移,即使图像的一部分出现在屏幕上。

似乎您有一个简单的注册问题,我很确定有更简单的方法来解决您的问题,但最快的(就实现时间而言)就是使用以下方法:,如果您在使用第三方方面没有问题,您可以使用此列表中的内容


Sift将在两幅图像中找到相似的补丁,从那里可以很容易地计算图像的翻译。

似乎您有一个简单的注册问题,我很确定有更简单的方法来解决您的问题,但最快的(就实现时间而言)就是使用以下方法:,如果您在使用第三方方面没有问题,您可以使用此列表中的内容


Sift将在两幅图像中找到相似的补丁,从中可以很容易地计算图像的翻译。

这个答案不是太具体,但太长,无法放入注释中:

适当的方法取决于您的输入和场景。我不清楚你是想看到图像中某个点是如何移动的,还是想把整个图像与下一帧对齐。你问题的不同部分向我暗示了其中一个

您是否能够添加要使用的图像/帧的示例?他们是如何被抓获的?这将有很大帮助。我不确定你是否试图用鼠标光标或其他东西来对齐复杂的照片或基本的屏幕截图。如果你能在这里尽可能具体,人们希望能在技术上帮助你,而不只是把你和一篇研究论文联系起来

如果您试图在下一帧中查找一幅图像的特定部分,则应查找“模板匹配”

如果您正试图将一幅图像与下一幅图像对齐,并且您知道这是通过简单的图像转换实现的,那么您应该查找图像对齐、图像配准以及术语“从粗到精”之类的内容

操作“从粗到精”的技术通常如下所示:从两幅图像的小尺寸版本开始,在那里找到位移,然后放大并在下一个比例处找到位移,以粗解作为初始猜测(搜索时靠近此初始猜测)然后重复,直到达到完全分辨率。目的是加快速度,避免解陷入局部极小值


如果有两个具有大量复杂运动的帧,则您需要查找“光流”,其目的是找到每像素的位移。

此答案不太具体,但太长,无法放入注释中:

适当的方法取决于您的输入和场景。我不清楚你是想看到图像中某个点是如何移动的,还是想把整个图像与下一帧对齐。你问题的不同部分暗示一个或t