【发布时间】:2013-12-27 05:39:00
【问题描述】:
简而言之,我正在做与光学鼠标相同的事情。
我正在使用两个灰度二维数组,现在正在比较相等的值,看看有什么区别。
示例:
数组1:
1 1 0 0
0 1 0 0
0 0 0 0
0 0 0 0
数组2:
0 0 0 0
0 1 1 0
0 0 1 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);
}
但是,这是相当繁重的,因为它是 O(n^4),我相信有更有效的方法可以做到这一点。我已经做了很多研究,但到目前为止还没有弄清楚如何去做。同样,现在确切的答案应该是 1.414 和 -45,这意味着我偏离了大约 6%。这没关系,但我想更准确一点。
如果有人知道或能想出一种更有效和/或更准确地做到这一点的方法,请发布。不要听起来像个混蛋,但将我链接到博士研究论文并说它应该有效并不是我想要的。我已经进行了大量研究,这些论文主要是指图像是否仍完全显示在屏幕上。
我正在寻找一种方法来计算图像位移,即使图像的一部分离开屏幕。
【问题讨论】:
-
两个图像是否相同但位置不同,或者您需要模糊匹配吗?也是纯位移还是旋转?
-
你要的最大排量是多少?
-
纯位移。理想情况下,它们将是相同的,但可能有一部分被置换的图像会从屏幕上消失,因此它可能是最佳匹配。
-
听起来像光流算法可能会派上用场......
-
@Tim B:最大位移未知,但图像将具有 60Hz 的刷新率,所以我认为不会过度。
标签: java image algorithm image-processing