答案 0 :(得分:1)
归一化互相关在发现相似性方面似乎非常有效。我只是从Terminal的命令行中使用了 ImageMagick ,但是所有图像处理软件包都应具有提供类似功能的东西。
我们将您的三个图像称为rainy.png
,sunny.png
和other.png
。然后,当图像相同时,NCC为1;当图像相同时,NCC为0。
因此,将rainy.png
与sunny.png
进行比较,它们的相似度为83%:
convert -metric NCC sunny.png rainy.png -compare -format "%[distortion]" info:
0.831495
现在将rainy.png
与other.png
进行比较,它们的相似度为21%:
convert -metric NCC rainy.png other.png -compare -format "%[distortion]" info:
0.214111
最后,将sunny.png
与other.png
进行比较,它们的相似度为22%:
convert -metric NCC sunny.png other.png -compare -format "%[distortion]" info:
0.22060
ImageMagick 还提供其他指标,例如平均绝对误差,结构相似度等。要获取选项列表,请使用:
identify -list metric
示例输出
并选择所需的一个,如果想要结构相似性而不是归一化互相关,请使用-metric SSIM
代替-metric NCC
。
答案 1 :(得分:1)
当照明不同时,NCC和SSIM可能是最好的两种,这会导致亮度/对比度。其他指标未对亮度/对比度进行任何归一化
SSIM给我的晴天和下雨分别为0.763003和0.236967。这是3.22的分离比率。 NCC分别给我0.831495和0.220601。这是3.77的分离率。好一点。有关这些命令的信息,请参见Mark Setchell的答案。
另一种方法是首先在灰度均衡的图像上进行边缘检测。这样可以减轻亮度/对比度变化甚至色彩偏移。
这是在Imagemagick中使用8向Sobel运算符的方法。
convert bright.png -colorspace gray -equalize \
-define convolve:scale='!' \
-define morphology:compose=Lighten \
-morphology Convolve 'Sobel:>' bright_sobel.png
convert dull.png -colorspace gray -equalize \
-define convolve:scale='!' \
-define morphology:compose=Lighten \
-morphology Convolve 'Sobel:>' dull_sobel.png
convert other.png -colorspace gray -equalize \
-define convolve:scale='!' \
-define morphology:compose=Lighten \
-morphology Convolve 'Sobel:>' other_sobel.png
compare -metric ncc bright_sobel.png dull_sobel.png null:
0.688626
compare -metric ncc bright_sobel.png other_sobel.png null:
0.0756445
分离率为9.1。好多了。
使用边缘检测,您可以使用其他度量,因为归一化已通过均等和灰度运算完成。但是NCC可能仍然是最好的。
请参见https://imagemagick.org/Usage/convolve/#sobel
添加:
如果将均衡添加到原始图像,则非边缘NCC结果会比这篇文章的顶部要好:
convert bright.png -equalize bright_eq.png
convert dull.png -equalize dull_eq.png
convert other.png -equalize other_eq.png
compare -metric NCC bright_eq.png dull_eq.png null:
0.861087
compare -metric NCC bright_eq.png other_eq.png null:
0.204296
这样得出的分离比为4.21,比上面没有均衡的3.77略好。
ADDITION2:
这是另一种使用我的脚本redist的方法,该方法试图将图像统计信息更改为特定的均值和标准差。 (请参阅http://www.fmwconcepts.com/imagemagick/index.php)
我将其应用于具有相同参数的所有图像,以归一化为相同的均值和标准差,然后在进行比较之前进行精明边缘提取。重做器类似于均衡,但使用高斯分布而不是平坦或恒定的分布。 Redist的替代方法是局部直方图均衡(lahe)或对比度受限的自适应直方图均衡(clahe)。参见https://en.wikipedia.org/wiki/Adaptive_histogram_equalization。
以下命令中的数字被归一化(范围从0到名义上的100%),并表示平均值,峰左侧的一个西格玛偏移量,峰右侧的一个西格玛偏移量,其中sigma类似于标准偏差。
redist 50,50,50 bright.png bright_rdist.png
redist 50,50,50 dull.png dull_rdist.png
redist 50,50,50 other.png other_rdist.png
convert bright_rdist.png -canny 0x1+10%+30% bright_rdist_canny.png
convert dull_rdist.png -canny 0x1+10%+30% dull_rdist_canny.png
convert other_rdist.png -canny 0x1+10%+30% other_rdist_canny.png
比较-metric ncc bright_rdist_canny.png dull_rdist_canny.png null:
0.345919
compare -metric ncc bright_rdist_canny.png other_rdist_canny.png null:
0.0323863
分离率为10.68
答案 2 :(得分:0)
过去,我在某些项目中使用过CNN的中间层来进行这种可靠的比较。基本上,您会使用经过训练的CNN来完成某些任务,例如图像分割,然后尝试识别可以为您的匹配提供良好几何/光度特征平衡的图层或图层组合。然后在测试时,将图像传递到CNN中,然后将这些特征与例如欧几里得距离进行比较。我的图像与您的图像相似,并且我需要快速的图像,因此当时Enet对我来说是个不错的选择(嗯,现在有更好的选择)。我最终使用了第21层和第5层的功能组合,最终在实践中运行良好。但是,如果您的图像来自可以利用时间信息的序列,则强烈建议您查看SeqSLAM(很抱歉,找不到非收费版本。很有趣的是,它不需要任何CNN ,是实时的,并且如果有内存,则使用非常简单的基于金字塔强度的比较进行匹配(类似于SPP),例如以及this论文,该论文通过CNN的图层改进了SeqSLAM。