由于我不知道直方图比较的限制,我决定问这个精彩的社区 我有一些图像,我想根据它的相似性对它们进行分组。每个图像都有一个独特的彩色线条,从图像的顶部到底部开始,所以我所做的是通过这些彩色线条进行垂直投影并制作一个这个投影的每个图像的直方图。它很好,因为两个相似的图像应该有两个相似的直方图(即上下几乎完全相同的圆)与人类我可以决定两个直方图根据该独特的功能相似甚至如果一个直方图的峰值不高(即,这是一个微弱图像的直方图)
具有相应直方图的图像:
.................... 1st http://imageshack.us/a/img571/948/onelg.jpg ......................... ......................... 2nd http://imageshack.us/a/img255/642/twor.jpg .................... .................... 3rd http://imageshack.us/a/img577/3931/threeaw.jpg ................
1sth 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
................................................. { {3}}
我将这两个图像转换为灰度图像,然后我对图像进行了垂直投影,将其转换为直方图。正如您可能注意到前两个直方图相似但第三个直方图有点不同,因为它有一个切换彩色线条。
注意: -
(1)考虑前两个直方图。尽管最高的喙几乎是12,但并不总是如此,有些图像更暗或更暗,但最后它确实给出了相同的直方图形态,如果我可以说您可以注意到最后一个直方图是第二个直方图的较暗图像。
我的问题是:进行任何类型的直方图比较是否安全?直方图比较是否意味着我可以决定两个直方图是否具有相同的峰值?或者在其他词中,直方图比较告诉我两个直方图是否具有相同的形态?在python
中进行这种比较的最佳库或方法是什么?
更新: -
(1)作为回复@PepperoniPizza和@FedericoCristina,在我的情况下,完全不同的图像肯定会有不同的直方图(你可以依靠它)每个图像都有独特的直方图形态(即独特的峰值)和峰值的数量从一个图像到另一个图像不同,但是两个相似的图像应该具有相同的峰值数量(换句话说,如果你看它们的直方图,你可以看出它们看起来有点相同(看看第1,第2和最后的直方图,看看我的意思。
(2)为了清楚这一点,我真的不想要一个如何分组我的图像的解决方案,但我付出了很多意图,我怎么能决定两个直方图有相似的形状或形态作为一般情况!!!!
(3)我知道cv2.CompareHist()
但我不知道这是否是比较我的直方图的正确方法,因为我不知道cv2.CompareHist()
是如何工作的(即我不知道他们做什么基础比较)实际上cv2.CompareHist()
有4种类型的直方图比较,我不知道什么是最好的,甚至是什么是进行这种比较的替代方法。
(4)作为回复@ remi,这里有一点: - 我已经有3个图书馆,他们支持直方图比较,而且至少对我来说有点含糊不清 - 要知道他们的意思是什么直方图比较就像h1-h2
然后calcuate(MSE)
一样,所以它只是比较值而不是这些值在直方图中形成的形状。所以我不是那样的擅长直方图和他们的数学工作,我想知道我是否真的能比较直方图这样的方式。
谢谢
答案 0 :(得分:3)
进行任何直方图比较是否安全?
不,这还不够。您可以使用直方图比较来丢弃不太相似的那些,但正如@PepperoniPizza所说,两个完全不同的图像可以具有完全相同的直方图。
如果您需要根据相似性对图像进行分组,那么您需要实现2D Mean Squared Error(MSE)(或Mean Absolute Error(MAE))算法,这只是两者之间差异的衡量标准。图像,其中0表示它们是相等的。
进行此类比较的最佳库或方法是什么? 蟒?
实现这些函数非常容易(包括两个FOR语句计算两个像素之间的误差或差异,一个来自图像A,另一个来自图像B)。您可以使用Python OpenCV甚至Pyhon Imaging Library。
答案 1 :(得分:1)
据我所知,由于您进行投影,因此您并未真正计算图像的直方图。您需要一个描述符,不仅要考虑图像中颜色的频率,还要考虑它们的结构。您可以查看MPEG7 ColorStructure或ColorLayout描述符。在MPEG +描述符的C ++中有一个参考实现,我记得上班很痛苦。 ColorStructure是最容易实现的,您可以根据它们的欧氏距离比较颜色结构直方图:描述符的距离最短,图像最相似(应该是)。
答案 2 :(得分:0)
直方图只是对应于相同颜色的像素数,在这种情况下是灰度。如果您仍然认为直方图足以比较两个图像,则两个完全不同的图像可以具有相同的直方图,我将首先进行标准化处理。