找到两个图像之间的变化

时间:2013-07-10 14:44:07

标签: image-processing

我有两张相似的图片,但其中一张图片有其他更改。我需要做的是找到两个图像之间的变化。两个图像都具有白色背景,并且更改是正在绘制的线条。我不需要像openCV那样复杂的东西我正在寻找c或c ++中的“简单”解决方案。

3 个答案:

答案 0 :(得分:2)

如果您只想显示差异,那么您可以使用以下代码。

FastBitmap original = new FastBitmap(bitmap);
FastBitmap overlay = new FastBitmap(processedBitmap);

//Subtract the original with overlay and just see the differences.
Subtract sub = new Subtract(overlay);
sub.applyInPlace(original);

// Show the results
JOptionPane.showMessageDialog(null, original.toIcon());

对于比较两个图像,您可以在Catalano Framework中使用ObjectiveFideliy类。 Catalano Framework是Java版本,因此您可以在另一个LGPL项目中移植此类。

https://code.google.com/p/catalano-framework/

FastBitmap original = new FastBitmap(bitmap);
FastBitmap reconstructed = new FastBitmap(processedBitmap);

ObjectiveFidelity of = new ObjectiveFidelity(original, reconstructed);

int error = of.getTotalError();
double errorRMS = of.getErrorRMS();
double snr = of.getSignalToNoiseRatioRMS();

//Show the results

免责声明:我是这个框架的作者,但我认为这会有所帮助。

答案 1 :(得分:0)

您的描述给我留下了一些悬而未决的问题。在图像之前/之后看一些例子会很好。

然而,从表面上看,假设您只想找到添加的线的参数,将帧转换为灰度,将它们相互减去,将结果分段为黑色&可能就足够了。白色,然后执行线段检测。

如果生成的图像只包含一个直线段,则可能只需找到剩余像素周围的边界框,只需进行简单检查即可确定您拥有的两个可能的线段中的哪一个。

然而,使用OpenCV提供的Hough Transform方法之一可能更简单。

答案 2 :(得分:0)

你可以使用memcmp()(Ansi C函数来比较2个内存块,就像strcmp())。只需在像素数组上激活它,它就会返回它们是否相同。 您可以添加一个小调整,作为指向第一次更改发生的内存块的指针。这将为您提供指向第一个像素的指针。你可以不只是沿着它的邻居找到所有非白色像素(代表你的线)。

bool AreImagesDifferent(const char*Im1, const char* Im2, const int size){
    return memcmp(Im1,Im2,size);
}

const char* getFirstDifferentPixel(const char*Im1, const char* Im2, const int size){
    const char* Im1end = Im1+size;
    for (;Im1<Im1end; Im1++, Im2++){
        if ((*Im1)!=(*Im2))
            return Im1;
    }
}