2

我已经开始通过使用简单算法计算不同像素的数量来区分两个图像:

private int returnCountOfDifferentPixels(String pic1, String pic2)
    {
        Bitmap i1 = loadBitmap(pic1);
        Bitmap i2 = loadBitmap(pic2);
        int count=0;

        for (int y = 0; y < i1.getHeight(); ++y)
               for (int x = 0; x < i1.getWidth(); ++x)
                    if (i1.getPixel(x, y) != i2.getPixel(x, y)) 
                        {
                        count++;
                        }

          return count;

    }

然而,这种方法在其初始形式中似乎效率低下,因为即使在非常相似的照片中也总是存在大量不同的像素。我在想一种方法来确定两个像素是否真的那么不同。来自 android 的 bitmap.getpixel(x,y) 返回一个 Color 对象。

如何正确区分两个 Color 对象,以帮助进行运动检测?

4

2 回答 2

2

你是对的,由于噪声和其他因素,视频流中通常会有很多原始像素变化。以下是您可能要考虑的一些选项:

  1. 首先模糊图像,理想情况下使用高斯滤波器或简单的箱形滤波器。这仅意味着您对相邻像素和像素本身进行(加权)平均值。这应该已经大大降低了传感器噪声。

  2. count只有当它大于某个阈值时才添加差异。这样做的效果是只考虑真正变化很大的像素。这很容易实现,并且可能已经单独解决了您的问题。

想了想,先试试这两个选项。如果他们不成功,我可以给你更多的选择。

编辑:我刚刚看到您实际上并没有总结差异,而只是计算了不同的像素。如果您将它与选项 2 结合使用,这很好。选项 1 仍然有效,但它可能有点矫枉过正。

此外,要找出两种颜色之间的区别,请使用Color 类的方法:

int p1 = i1.getPixel(x, y);
int p2 = i2.getPixel(x, y);
int totalDiff = Color.red(p1) - Color.red(p2) + Color.green(p1) - Color.green(p2) + Color.blue(p1) - Color.blue(p2);

现在您可以提出一个totalDiff必须超过才能做出贡献的阈值count

当然,您可以通过各种方式处理这些数字。例如,上面的代码仅计算像素强度(亮度)的变化。如果您还想考虑色调和饱和度的变化,则必须这样计算totalDiff

int totalDiff = Math.abs(Color.red(p1) - Color.red(p2)) + Math.abs(Color.green(p1) - Color.green(p2)) + Math.abs(Color.blue(p1) - Color.blue(p2));

另外,请查看其他方法Color,例如RGBToHSV(...).

于 2012-05-07T20:28:10.867 回答
0

我知道这本质上与此处的另一个答案非常相似,但我认为以不同的形式重述它可能对那些寻求解决方案的人有用。这涉及随着时间的推移有两个以上的图像。如果你只是从字面上看,那么这将不起作用,但等效的方法会起作用。

对每帧上的所有像素进行历史记录。例如,对于每个像素: history[x, y] = (history[x, y] * (w - 1) + get_pixel(x, y)) / w

w可能在哪里w = 20。运动的尖峰越高w,但要重置的运动必须越长。

然后确定是否发生了变化,您可以对每个像素执行此操作:

changed_delta = abs(history[x, y] - get_pixel(x, y))

total_delta += changed_delta

你会发现它稳定了大部分噪音,当运动发生时,你会得到很大的不同。您实际上是在拍摄许多帧并从许多帧中检测到最新帧的运动。

此外,为了检测运动位置,请考虑将图像分成更小的部分并单独进行。然后,您可以通过将单个图像视为单独图像的网格来查找对象并在屏幕上跟踪它们。

于 2016-06-02T20:35:37.057 回答