Opencv comparing Images
我是 OPENCV 的新手,我正在尝试比较两个图像,所以我在两个 Mat 图像上使用了 absdiff 函数,但是这种比较很容易受到照明和发光的影响,请您给我一些更强大的建议吗?
有多种方法可以比较两个图像,而最佳方法实际上取决于您所需的准确性和应用。
一种可能对您有用的方法是在获取图像差异之前使用直方图均衡化。直方图均衡使场景的强度更加均匀,并且对于许多应用程序可以最大限度地减少照明对场景的影响。在 OpenCV 中,这可以通过以下函数完成:
1
| cv::equalizeHist(src, dst); |
更复杂的方法涉及使用特征检测器,然后进行特征匹配。如果 FLANN,OpenCV 提供了一个简单的方法。本质上,它识别图像中易于识别的区域(即角落)并在另一幅图像中寻找图案。
您可以使用两个图像中匹配的特征来计算两个图像之间的变换,例如旋转、缩放、倾斜等。特征的存在以及它们在两个图像之间移动的距离是什么然后你用你的相似度得分。
这是一种更复杂的方法,它在 OpenCV 文档中有完整的文档记录,如果您愿意,我可以在这里更深入。
文档:http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html#feature-flann-matcher
- 感谢您回答这个问题,我尝试使用这两种方法,它们都有效,但是当我计算输出矩阵的像素值并试图获得它的数学值时,我认为它需要更多的稳定性..我正在阅读归一化互相关(NCC)在产生稳定结果方面可能比 absDiff 更好。 是否有任何功能可以通过 NCC 比较两个相同大小的矩阵?
-
有关代码示例,请参阅此问题 stackoverflow.com/questions/11321316/ :)
-
这个函数 matchTemplate 仅提供比较模板或主图像的一部分..我认为它不适合比较两个不同的图像以获得结果图像..
-
您是否尝试过像我在回答中提到的那样进行特征匹配?同样将图像传输到 HSV 并在像 Hue 通道这样的东西上做 absdiff 可能会给出更稳定的结果,因为它的照明不变性更强。您还可以参考此现有问题以获取其他想法 stackoverflow.com/questions/11541154/
-
先生,我一直在研究您给我的建议。我尝试了 Histogram, equalizeHist() 它不是很有效,因为我认为我使用的是灰度图像进行比较,也许正因为如此。色调对于人体皮肤和深色物体是非常有效的方法,但在我的情况下,我比较了更多的物理环境,因此会导致大量噪音和不正确的结果。我仍在探索如何处理光照条件,比如早晚的光线变化,所以如果我比较不同时间拍摄的相同图像,它会变得不同。你能帮忙吗?谢谢!
-
你能提供示例图像吗?在处理光照等差异时,比较色调通常非常好。这个问题 (stackoverflow.com/questions/1500498/) 有人通过比较我推荐的特征描述符来比较两个图像,并包含代码和解释。如果你没有得到任何地方再次问一个问题并描述你尝试过的这些方法,你应该得到更多帮助