检测两个图像之间的伪影差异
Detecting artifact differences between two images
我想以编程方式检测忽略裁剪和缩放更改的两张图像之间的“material 差异”。
换句话说,如果图像 A 显示一棵树、一辆车和一朵云,而图像 B 只是 A 的(稍微)裁剪和(稍微)较小的副本(但所有其他特征均未改变)并且质量较低,那么我想考虑这些匹配。但是如果 B 有不同的云,或者汽车移动了(等),那么图像就会不同。
示例:这是图像 A:
在这里,图片 B 只是 A 的裁剪和调整大小的版本:
但是现在,这里的图C不仅cropped/resized还有一个黄色的星号
我想检测 A 和 C 之间的那种变化,但忽略 A 和 B 之间的差异。我已经尝试过 imagemagick 子图像搜索,但它 (1) 非常慢并且 (2) 找不到无论我使用什么指标,子图像(可能是因为图像 B 具有更高的 jpg 压缩率,也就是更低的质量)。尽管有星号,但感知散列将图像评分为“相似”,因为图片在很大程度上相似。也许基于 OpenCV 特征检测的东西可能是我最好的选择?
直方图很适合这种变化检测。旋转、清晰度和比例的差异不会有太大影响,但添加黄色星星之类的东西会很明显。
例如,using ruby-vips(因为我很了解):
require "ruby-vips"
a = Vips::Image.new_from_file ARGV[0], access: :sequential
b = Vips::Image.new_from_file ARGV[1], access: :sequential
# peak normalised difference in histograms
mx = (a.hist_find.hist_norm - b.hist_find.hist_norm).abs.max
puts "peak difference = #{mx}"
我明白了:
john@kiwi:~/try$ ./hdiff.rb ~/pics/A.png ~/pics/B.png
peak difference = 53.0
john@kiwi:~/try$ ./hdiff.rb ~/pics/B.png ~/pics/C.png
peak difference = 140.0
我想以编程方式检测忽略裁剪和缩放更改的两张图像之间的“material 差异”。
换句话说,如果图像 A 显示一棵树、一辆车和一朵云,而图像 B 只是 A 的(稍微)裁剪和(稍微)较小的副本(但所有其他特征均未改变)并且质量较低,那么我想考虑这些匹配。但是如果 B 有不同的云,或者汽车移动了(等),那么图像就会不同。
示例:这是图像 A:
在这里,图片 B 只是 A 的裁剪和调整大小的版本:
但是现在,这里的图C不仅cropped/resized还有一个黄色的星号
我想检测 A 和 C 之间的那种变化,但忽略 A 和 B 之间的差异。我已经尝试过 imagemagick 子图像搜索,但它 (1) 非常慢并且 (2) 找不到无论我使用什么指标,子图像(可能是因为图像 B 具有更高的 jpg 压缩率,也就是更低的质量)。尽管有星号,但感知散列将图像评分为“相似”,因为图片在很大程度上相似。也许基于 OpenCV 特征检测的东西可能是我最好的选择?
直方图很适合这种变化检测。旋转、清晰度和比例的差异不会有太大影响,但添加黄色星星之类的东西会很明显。
例如,using ruby-vips(因为我很了解):
require "ruby-vips"
a = Vips::Image.new_from_file ARGV[0], access: :sequential
b = Vips::Image.new_from_file ARGV[1], access: :sequential
# peak normalised difference in histograms
mx = (a.hist_find.hist_norm - b.hist_find.hist_norm).abs.max
puts "peak difference = #{mx}"
我明白了:
john@kiwi:~/try$ ./hdiff.rb ~/pics/A.png ~/pics/B.png
peak difference = 53.0
john@kiwi:~/try$ ./hdiff.rb ~/pics/B.png ~/pics/C.png
peak difference = 140.0