1

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

4

3 回答 3

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 框架中的 ObjectiveFideliy 类。Catalano 框架使用 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

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

于 2013-07-10T21:24:01.817 回答
0

你的描述给我留下了一些悬而未决的问题。最好在图像之前/之后看到一些示例。

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

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

然而,使用 OpenCV 提供的一种霍夫变换方法可能会更简单。

于 2013-07-10T14:53:58.853 回答
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;
    }
}
于 2013-07-11T07:00:13.390 回答