Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 查找两个图像之间的更改_Image Processing - Fatal编程技术网

Image processing 查找两个图像之间的更改

Image processing 查找两个图像之间的更改,image-processing,Image Processing,我有两张相似的图片,但其中一张有额外的变化。我需要做的是找到两个图像之间的变化。两幅图像都有白色背景,变化是一条正在绘制的线。我不需要像OpenCV那样复杂的东西,我在C或C++中寻找一个简单的解决方案。 < p>你给我留下了一些未回答的问题。最好在图像之前/之后查看一些示例 然而,从表面上看,假设您只想找到添加线的参数,将帧转换为灰度,相互减去,将结果分割为黑白,然后执行线段检测就足够了 如果生成的图像仅包含一条直线段,则只需通过简单的检查确定两条可能的直线段中的哪一条,就可以找到剩余像素周围

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

< p>你给我留下了一些未回答的问题。最好在图像之前/之后查看一些示例

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

如果生成的图像仅包含一条直线段,则只需通过简单的检查确定两条可能的直线段中的哪一条,就可以找到剩余像素周围的边界框


但是,如果只想显示差异,使用OpenCV提供的一种Hough变换方法可能会更简单。

,因此可以使用下面的代码

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项目中移植这个类

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

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

bool AreImagesDifferent(常量字符*Im1,常量字符*Im2,常量整数大小){
返回memcmp(Im1、Im2、size);
}
常量字符*GetFirstDifferentipPixel(常量字符*Im1,常量字符*Im2,常量整数大小){
常量字符*Im1end=Im1+大小;

对于(;im1说帧之间只添加了一行是真的吗?您能提供图像前后的示例吗?看似很小的细节可能会对您面前的选项产生很大的影响。不是吹毛求疵,但在查看Catalano源代码时,我觉得
Catalano.Imaging.Filters.Subtract.ApplyPlaceImage()
不处理源和覆盖大小不同的情况,或者一个是彩色的,另一个是灰度的情况。(这可能与问题无关,但可能是以后需要解决的问题。)@r如果您有一个已定义的颜色背景,您可以创建一个具有所需大小和颜色的新FastBitmap,然后减去图像。它可以处理颜色和其他灰度,您只需要使用以下方法进行转换:FastBitmap.toRGB()或FastBitmap.toGrayscale()。
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
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;
    }
}