C 比较图像,其中某些部分是可变的,但不应该重要

C 比较图像,其中某些部分是可变的,但不应该重要,c,imagemagick,C,Imagemagick,我担心的是,在下面的黑色椭圆形样本中,会发现图像之间的差异 我的问题是图像的某些部分也是可变的,但我不想在发现不同之处时考虑这一部分。为了克服这个问题,我想使现在用红色标记的区域“透明”:从下图中可以看出,可变部分日期/时间和日期/时间编辑字段应该排除在比较之外: 一种方法是: 我可以使用“透明”颜色来标记不应进行比较的图像区域。为此,我需要按以下方式修改图像的基线副本: 在图像编辑器中打开基线图像(例如,在MSPaint中) 选择将用作“透明”颜色的颜色 将左上角像素的颜色更改为“透明”颜

我担心的是,在下面的黑色椭圆形样本中,会发现图像之间的差异

我的问题是图像的某些部分也是可变的,但我不想在发现不同之处时考虑这一部分。为了克服这个问题,我想使现在用红色标记的区域“透明”:从下图中可以看出,可变部分日期/时间和日期/时间编辑字段应该排除在比较之外:

一种方法是: 我可以使用“透明”颜色来标记不应进行比较的图像区域。为此,我需要按以下方式修改图像的基线副本:

  • 在图像编辑器中打开基线图像(例如,在MSPaint中)
  • 选择将用作“透明”颜色的颜色
  • 将左上角像素的颜色更改为“透明”颜色
  • 使用“透明”颜色填充要从比较中排除的图像区域

如何通过编码实现上述手动工作的自动化?我想在C代码中实现上述行为

如果要提供一个矩形来着色,为什么不首先忽略一个矩形区域?下面是一些伪代码

Normally, such an 'image' as is used in the example is NOT a single image.

Rather it is a large number of images overlaying each other.

Most likely, the 'image' is made of:

the background
the outside border (which has 4 parts)
the upper left icon
the upper border clickable button( three of them)

the text field: Date/Time:
the input field: (for the date/time)

the text field: 'Table:'
the input multi line field/ with initial text 'Customers'

etc etc etc

I.E. that is not a single image but rather many images
that overlay each other

a single image would be something like a .bmp or .tif or .jpg file
int compareimages (char *im1, char* im2, int wid, int dep, int x0, int y0, int x1, int y1) {
    int x, y;
    for (y=0; y<dep; y++)
        for (x=0; x<wid; x++)
            if (x<x0 || x>x1 || y<y0 || y>y1)     // if outside rectangle
                if im1[y*wid+x] != im2[y*wid+x]   // compare pixels
                    return 0;
    return 1;
}
编辑添加了另一个版本的功能,比较4个像素组件

int compareimages (char *im1, char* im2, int wid, int dep, rect *rarr, int rects) {
    int x, y, n, ignore;
    for (y=0; y<dep; y++)
        for (x=0; x<wid; x++) {
            ignore = 0;
            for (n=0; n<rects; n++)
                ignore |= inrect (x, y, rarr[n]);
            if (!ignore) {
                if (im1[y*wid*4+x] != im2[y*wid*4+x])   // compare pixels
                    return 0;
                if (im1[y*wid*4+x+1] != im2[y*wid*4+x+1])
                    return 0;
                if (im1[y*wid*4+x+2] != im2[y*wid*4+x+2])
                    return 0;
                if (im1[y*wid*4+x+3] != im2[y*wid*4+x+3])
                    return 0;
            }
        }
    return 1;
}
int比较图像(char*im1、char*im2、int-wid、int-dep、rect*rarr、int-rects){
int x,y,n,忽略;

对于(y=0;y如果您提供了一个要着色的矩形,为什么不首先忽略一个矩形区域呢?下面是一些伪代码

int compareimages (char *im1, char* im2, int wid, int dep, int x0, int y0, int x1, int y1) {
    int x, y;
    for (y=0; y<dep; y++)
        for (x=0; x<wid; x++)
            if (x<x0 || x>x1 || y<y0 || y>y1)     // if outside rectangle
                if im1[y*wid+x] != im2[y*wid+x]   // compare pixels
                    return 0;
    return 1;
}
编辑添加了另一个版本的功能,比较4个像素组件

int compareimages (char *im1, char* im2, int wid, int dep, rect *rarr, int rects) {
    int x, y, n, ignore;
    for (y=0; y<dep; y++)
        for (x=0; x<wid; x++) {
            ignore = 0;
            for (n=0; n<rects; n++)
                ignore |= inrect (x, y, rarr[n]);
            if (!ignore) {
                if (im1[y*wid*4+x] != im2[y*wid*4+x])   // compare pixels
                    return 0;
                if (im1[y*wid*4+x+1] != im2[y*wid*4+x+1])
                    return 0;
                if (im1[y*wid*4+x+2] != im2[y*wid*4+x+2])
                    return 0;
                if (im1[y*wid*4+x+3] != im2[y*wid*4+x+3])
                    return 0;
            }
        }
    return 1;
}
int比较图像(char*im1、char*im2、int-wid、int-dep、rect*rarr、int-rects){
int x,y,n,忽略;
对于(y=0;y我的建议是:

  • 首先,使用ImageMagick将解决方案实现为命令行
  • 一旦工作正常,将此命令行移植到ImageMagick的C API
  • 以下是一些关于使用ImageMagick
    compare
    比较图像的答案。这些答案可能不适用于您的精确问题,但您可以提供足够的理论背景和实际示例,帮助您开始:

    如果我没有弄错你的问题,你只想比较两幅图像的某些部分,如果你想从比较中排除你已经知道存在(无趣)差异的其他部分,对吗

    以这两幅图像为例:

    顺便说一句,这两个图像是以PDF格式诞生的,我也可以将下面描述的过程应用于PDF页面(无需先将它们转换为图像文件)

    你不一定需要一个透明的遮罩——你也可以用黑色(或任何颜色)的

    创建大小为280x20像素的绿色遮罩:

    convert -size 280x20 xc:green greenmask-280x20.png
    
    现在使用
    composite
    将遮罩放置在每个图像的顶部:

    convert                               \
       http://i.stack.imgur.com/Q1pyC.png \
       greenmask-280x20.png               \
        -geometry +32+35                  \
        -compose over                     \
        -composite                        \
       c.png
    
    
    convert                               \
       http://i.stack.imgur.com/JVije.png \
       greenmask-280x20.png               \
        -geometry +32+35                  \
        -compose over                     \
        -composite                        \
       r.png
    
    -geometry+32+35
    参数可能需要一些解释:它告诉ImageMagick将绿色遮罩的左上角放置在原始图像左上角的右侧32个像素和底部35个像素

    生成的图像如下所示:

    下面是一个讨论ImageMagick已知的不同
    compose
    方法的答案:

    现在,您的图像已准备好进行统计或视觉比较,由ImageMagick的
    compare
    命令提供:

    compare c.png r.png -compose src delta.png
    
    delta.png
    以红色显示所有不同的像素,其余为白色:

    或者,使用最简单的
    compare
    命令,其中参考图像用作浅背景,顶部为红色三角形像素:

    compare c.png r.png  delta2.png
    
    我的建议是:

  • 首先,使用ImageMagick将解决方案实现为命令行
  • 一旦工作正常,将此命令行移植到ImageMagick的C API
  • 以下是一些关于使用ImageMagick
    compare
    比较图像的答案。这些答案可能不适用于您的精确问题,但您可以提供足够的理论背景和实际示例,帮助您开始:

    如果我没有弄错你的问题,你只想比较两幅图像的某些部分,如果你想从比较中排除你已经知道存在(无趣)差异的其他部分,对吗

    以这两幅图像为例:

    顺便说一句,这两个图像是以PDF格式诞生的,我也可以将下面描述的过程应用于PDF页面(无需先将它们转换为图像文件)

    你不一定需要一个透明的遮罩——你也可以用黑色(或任何颜色)的

    创建大小为280x20像素的绿色遮罩:

    convert -size 280x20 xc:green greenmask-280x20.png
    
    现在使用
    composite
    将遮罩放置在每个图像的顶部:

    convert                               \
       http://i.stack.imgur.com/Q1pyC.png \
       greenmask-280x20.png               \
        -geometry +32+35                  \
        -compose over                     \
        -composite                        \
       c.png
    
    
    convert                               \
       http://i.stack.imgur.com/JVije.png \
       greenmask-280x20.png               \
        -geometry +32+35                  \
        -compose over                     \
        -composite                        \
       r.png
    
    -geometry+32+35
    参数可能需要一些解释:它告诉ImageMagick将绿色遮罩的左上角放置在原始图像左上角的右侧32个像素和底部35个像素

    生成的图像如下所示:

    下面是一个讨论ImageMagick已知的不同
    compose
    方法的答案:

    现在,您的图像已准备好进行统计或视觉比较,由ImageMagick的
    compare
    命令提供:

    compare c.png r.png -compose src delta.png
    
    delta.png
    以红色显示所有不同的像素,其余为白色:

    或者,使用最简单的
    compare
    命令,