Java:检查图像是否移动

时间:2013-11-12 17:19:14

标签: java image image-processing pixel image-extraction

我想在图像中的某个位置查看所选像素的颜色是否发生了变化,我将如何进行此操作? (我试图检查运动)

我以为我可以这样做:

public int[] rectanglePixels(BufferdImage img, Rectangle Range) {
  int[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
  int[] boxColors;  
    for(int y = 0; y < img.getHeight(); y++) {
      for(int x = 0; x < img.getWidth; x++) {
        boxColors = pixels[(x & Range.width) * Range.x + (y & Range.height) * Range.y * width]
      }
    }
  return boxColors; 
}

也许用它来从位置中提取颜色?不确定我是否正确行事,但在此之后我应该重新运行此方法,比较两个数组的相似之处?如果相似数达到某个阈值,则声明图像已经改变了?

3 个答案:

答案 0 :(得分:1)

检测运动的一种方法是分析考虑整个图像或不同时间的子图像的像素颜色变化( n n-1 n -2,......)。在这种情况下,您正在考虑固定相机。您可能有两个阈值:

  1. 颜色通道变化的阈值,定义两个像素是不同的。
  2. 要考虑的图像之间的不同像素的阈值存在移动。换句话说:时间 n n-1 的同一场景的两个图像只有10个不同的像素。这是真正的运动还是只是噪音?
  3. 下面的示例显示如何在给定颜色通道阈值的情况下对图像中的干扰像素进行计数。

    for(int y=0; y<imageA.getHeight(); y++){
            for(int x=0; x<imageA.getWidth(); x++){
    
                redA = imageA.getIntComponent0(x, y);
                greenA = imageA.getIntComponent1(x, y);
                blueA = imageA.getIntComponent2(x, y);
    
                redB = imageB.getIntComponent0(x, y);
                greenB = imageB.getIntComponent1(x, y);
                blueB = imageB.getIntComponent2(x, y);
    
                if
                (
                    Math.abs(redA-redB)> colorThreshold ||
                    Math.abs(greenA-greenB)> colorThreshold||
                    Math.abs(blueA-blueB)> colorThreshold
                )
                {
                    distinctPixels++;
                }
            }
        }       
    

    但是,有Marvin个插件可以执行此操作。检查此source code example。它会检测并显示包含“移动”的区域,如下图所示。

    enter image description here

    有更复杂的方法可以为此目的确定/减去背景或处理相机移动。我想你应该从最简单的场景开始,然后去更复杂的场景。

答案 1 :(得分:0)

你应该使用BufferedImage.getRGB(startX, startY, w, h, rgbArray, offset, scansize),除非你真的想要使用循环和额外的数组。

答案 2 :(得分:0)

通过阈值比较两个值可以作为一个很好的指标。也许,您可以计算每个阵列的平均值以确定颜色并比较两者?如果您不想要阈值,只需使用.hashCode();