5

由于我不知道直方图比较的极限,所以我决定问问美妙的社区。
我有一些图像,我想根据它们的相似性对它们进行分组。每张图像都有一个独特的彩色线条,从图像的顶部到底部,所以我所做的是通过这些彩色线条进行垂直投影并制作一个每个图像的此投影的直方图。它工作得很好,因为两个相似的图像应该有两个相似的直方图(即上下几乎完全相同的轮次)作为一个人我可以根据那个独特的特征来确定两个直方图是相似的如果一个直方图的峰值不高(即,这是一张微弱图像的直方图)

带有相应直方图的图像:
..................... 1st http://imageshack.us/a/img571/948/onelg.jpg ..... ..................................第 2 个 http:// imageshack.us/a/img255/642/twor.jpg .................... ...第 3 次 http://imageshack.us/a/img577/3931/threeaw.jpg ...... 第 1 次http://imageshack.us/a/img823/ 4343/onehq.png 2ndh http://imageshack.us/a/img687/3738/twoht.png 3rdh http://imageshack.us/a/img43/9996/threeh.png
......... ..................................................... ............. 2nddarker http://imageshack.us/a/img690/7817/twodark.jpg
.... ...................................2nddarkhist http://img20.imageshack.us/img20/6070/darkerh.png

我将这两个图像转换为 gray-scale ,然后对图像进行垂直投影,将其转换为直方图,您可能会注意到前两个直方图相似,但第三个有点不同,因为它具有切换的彩色线条。

注意
:-(1)考虑前两个直方图。虽然最高的喙接近 12,但并非总是如此,有些图像更暗或更暗,但如果可以的话,最后它确实给出了相同的直方图形态说你可以注意到最后一个直方图是第二个更暗的图像。

我的问题是:进行任何类型的直方图比较是否安全?直方图比较是否意味着我可以确定两个直方图是否具有相同的峰值?或者换句话说,直方图比较是否告诉我两个直方图是否具有相同的形态??进行这种比较的最佳库或方法是什么python

更新:-(
1)作为@PepperoniPizza 和@FedericoCristina 的回复,在我的情况下,完全不同的图像肯定会有不同的直方图(你可以依赖它)每张图像都有一个独特的直方图形态(即独特的峰值)和峰值的数量从一个图像到另一个图像不同,但两个相似的图像应该具有相同数量的峰值(换句话说>如果你看他们的直方图,你可以告诉他们看起来有点像(看看第一个、第二个和最后一个直方图)我的意思。
(2)要清楚这一点,我真的不想要如何对图像进行分组的解决方案,但我非常想知道如何确定两个直方图具有相似的形状或形态一般情况!!!!
(3)我知道cv2.CompareHist()但我不知道这是否是比较直方图的正确方法,因为我不知道如何cv2.CompareHist()工作(即我不知道他们在什么基础上进行比较)并且实际上cv2.CompareHist()有 4 种类型的直方图比较我不知道不知道什么是最好的,甚至不知道进行这种比较的替代方法是什么。
(4)作为@remi的回复,重点是:-我已经有3个库支持直方图比较,这有点模棱两可-至少对我来说-知道直方图比较是什么意思,就像有些人喜欢的那样h1-h2然后calcuate(MSE)它所做的只是比较值而不是这些值在直方图中形成的形状。所以由于我不擅长直方图及其数学工作,我想知道我是否真的可以这样比较直方图。

谢谢

4

3 回答 3

3

进行任何类型的直方图比较是否安全?

不,这还不够。您可以使用直方图比较来丢弃不太相似的图像,但正如@PepperoniPizza 所说,两个完全不同的图像可能具有完全相同的直方图。

如果需要根据相似性对图像进行分组,则需要实现 2D均方误差(MSE)(或平均绝对误差(MAE))算法,该算法只是衡量两个图像之间的差异,其中 0 表示它们是平等的。

在 python 中进行这种比较的最佳库或方法是什么?

实现这些函数非常容易(涉及到几个 FOR 语句来计算两个像素之间的误差或差异,一个来自图像 A,一个来自图像 B)。您可以使用Python OpenCV甚至Pyhon Imaging Library

于 2012-11-06T00:39:19.250 回答
1

据我了解,您并没有真正计算图像的直方图,因为您进行了投影。您需要一个描述符,不仅要考虑图像中颜色的频率,还要考虑它们的结构。您可以查看 MPEG7 ColorStructureColorLayout描述符。在 C++ 中有一个 MPEG7 描述符的参考实现,我记得开始工作时非常痛苦。ColorStructure 是最容易实现的,您可以根据它们的欧几里德距离比较颜色结构直方图:描述符的距离最短,图像最相似(应该是)。

于 2012-11-06T10:42:07.783 回答
0

直方图只是对应于相同颜色的像素计数,在这种情况下是灰度。如果您仍然认为直方图足以比较两张图像,两张完全不同的图像可以有相同的直方图,我会先做一个归一化过程。

于 2012-11-06T00:22:15.860 回答