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
以下是一些关于使用ImageMagickcompare
比较图像的答案。这些答案可能不适用于您的精确问题,但您可以提供足够的理论背景和实际示例,帮助您开始:
如果我没有弄错你的问题,你只想比较两幅图像的某些部分,如果你想从比较中排除你已经知道存在(无趣)差异的其他部分,对吗
以这两幅图像为例:
顺便说一句,这两个图像是以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
以下是一些关于使用ImageMagickcompare
比较图像的答案。这些答案可能不适用于您的精确问题,但您可以提供足够的理论背景和实际示例,帮助您开始:
如果我没有弄错你的问题,你只想比较两幅图像的某些部分,如果你想从比较中排除你已经知道存在(无趣)差异的其他部分,对吗
以这两幅图像为例:
顺便说一句,这两个图像是以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
命令,