打印图像与imagemagick不同的像素值?

打印图像与imagemagick不同的像素值?,imagemagick,Imagemagick,使用imagemagick打印两幅图像不同的像素值是否有一种简单的方法 为了清楚起见,我想知道那个像素的值,以及它的坐标。从哪个图像开始并不重要,因为我可以简单地交换它们以获得正确的图像。在Imagemagick 6中,您可以执行以下操作以列出两个图像不同的坐标: convert image1 image2 -compose difference -composite -threshold 0 txt: | tail -n +2 | grep "white" | awk '{print $1}'

使用imagemagick打印两幅图像不同的像素值是否有一种简单的方法


为了清楚起见,我想知道那个像素的值,以及它的坐标。从哪个图像开始并不重要,因为我可以简单地交换它们以获得正确的图像。

在Imagemagick 6中,您可以执行以下操作以列出两个图像不同的坐标:

convert image1 image2 -compose difference -composite -threshold 0 txt: | tail -n +2 | grep "white" | awk '{print $1}' | sed 's/://g'

如果使用Imagemagick 7,请将转换为magick

补充:

如果要在两个图像中的一个图像中同时显示坐标和颜色,则假设该图像没有完美的黑色像素,可以执行以下操作:

convert image1 image2 \
\( -clone 0,1 -compose difference -composite -threshold 0 \) \
-delete 1 \
-compose multiply -composite txt: |\
 tail -n +2 | grep -v "black" | awk '{print $1,$4}'
例如,我拍摄了lena图像,并在左上角放置了一个蓝色正方形以生成第二个图像

输入:


结果:


如果您有黑色且图像没有透明度,则可以执行以下操作:

convert image1 image2 \
\( -clone 0,1 -compose difference -composite -threshold 0 \) \
-delete 1 \
-alpha off -compose copy_opacity -composite \
-background black -alpha background txt: |\
 tail -n +2 | grep -v "none" | awk '{print $1,$4}'

例如:

convert lena.png \( -clone 0 -size 5x5 xc:blue -composite \) \
\( -clone 0,1 -compose difference -composite -threshold 0 \) \
-delete 1 \
-alpha off -compose copy_opacity -composite \
-background black -alpha background txt: |\
 tail -n +2 | grep -v "none" | awk '{print $1,$4}'

结果:


让我们制作两幅图像,三倍宽和一倍高:

convert xc:red xc:lime xc:blue +append 1.png

如果我们执行以下操作,我们可以使两幅图像中相同的任何像素变得透明:

convert {1,2}.png -compose changemask -composite mask.png     # Note that {1,2}.png is just bash shorthand for "1.png" "2.png"

如果我们重新订购输入图像:

convert {2,1}.png -compose changemask -composite mask.png     # Note that {2,1}.png is just bash shorthand for "2.png" "1.png"

因此,我假设您想要上面的内容,但以文本格式,透明像素被抑制:

convert {1,2}.png -compose changemask -composite txt: | grep -v ",0)"
输出

# ImageMagick pixel enumeration: 3,1,65535,srgba
0,0: (65535,0,0,65535)  #FF0000FF  red
2,0: (0,0,65535,65535)  #0000FFFF  blue

请注意,如果您希望允许图像之间存在微小差异,可以添加一些“模糊因子”。因此,如果希望rgb(0100200)与rgb(3,96205)足够接近,可以在命令开头添加
-fuzz 5

如果它们不同,则将有2个值。你想要哪一个?还是你想要区别?你的意思是一个潜在的巨大的文本输出列表吗?@MarkSetchell这很愚蠢,任何一个都可以。如果我想要图像A的像素,那么我要确保图像A是要打印的像素。如果两者都需要,那么我运行两次,反转图像。是的,还有一个潜在的巨大的文本输出列表。如果我想要
比较
,我会使用
比较
。我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢我不想要差别,也不想要(仅仅)坐标。我想知道每个不同像素的像素到底是什么。你想要什么值——给定像素坐标下两幅图像中的像素颜色,还是像素值的差异?我想我已经回复了你的评论。如果两幅图像中的像素颜色不同,我需要两幅图像中的像素颜色和坐标(我可以在更改图像顺序的情况下运行两次)。请参阅我的补充答案,以获得两幅图像之一中的坐标和颜色。交换两个图像以获得另一组坐标和颜色纹理,它确实解决了问题,但与另一个解决方案存在相同的问题:对于我的图像比例(8k平方),它太慢,因为所有输出imagemagick都必须打印,然后被丢弃。这符合我的要求,但这将是非常缓慢的,因为图像的大小是8k平方,几乎没有像素不同。要打印所有这些将被丢弃的行,imagemagick需要很长时间。向上投票是因为它解决了问题,但由于性能问题而不接受。
convert {1,2}.png -compose changemask -composite mask.png     # Note that {1,2}.png is just bash shorthand for "1.png" "2.png"
convert {2,1}.png -compose changemask -composite mask.png     # Note that {2,1}.png is just bash shorthand for "2.png" "1.png"
convert {1,2}.png -compose changemask -composite txt: | grep -v ",0)"
# ImageMagick pixel enumeration: 3,1,65535,srgba
0,0: (65535,0,0,65535)  #FF0000FF  red
2,0: (0,0,65535,65535)  #0000FFFF  blue