【问题标题】:Is it safe to do histogram comparison in this case?在这种情况下进行直方图比较是否安全?
【发布时间】:2012-10-25 20:29:10
【问题描述】:

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

图像及其对应的直方图:
.....................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.png2ndh http://imageshack.us/a/img687/3738/twoht.png3rdh http://imageshack.us/a/img43/9996/threeh.png
..................................................... .......................2nddarker http://imageshack.us/a/img690/7817/twodark.jpg
..................................................@ 987654328@

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

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

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

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

谢谢

【问题讨论】:

  • 能否提供图片样本的链接?
  • 您可以进一步研究 compareHist(及相关)中提出的方法,并为您的情况选择最合适的方法。在我看来,简单的 L1/L2 规范就可以完成这项工作
  • @remi updat(4) 是给你的。谢谢
  • 您作为示例显示的直方图中的形状差异肯定会通过高 L1/L2 范数以及其他方法反映出来。请记住,直方图的“形状”是由它们的值给出的,因此可以比较它们的值。通过将每个 bin 值除以值的总和来规范化直方图。这不会影响形状,但如果这让您担心的话,它将使值之间的差异正常化

标签: python image-processing opencv computer-vision histogram


【解决方案1】:

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

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

如果你需要根据相似度对图像进行分组,那么你需要实现一个二维的Mean Squared Error(MSE)(或Mean Absolute Error(MAE))算法,它只是衡量两个图像之间的差异,其中 0表示他们是平等的。

进行这种比较的最佳库或方法是什么 蟒蛇?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你是对的,你真的有一个观点!但正如你在这里看到的,我不想要对图像进行分组的解决方案,而是如何确定两个直方图具有相同的形状或形态一般情况!谢谢。
    • 然后看看BattacharryaKullback-Lieber,也许是t-test。或者简单的 L1/L2 范数
    • +1 很好,我希望我能找到一个支持这种统计工作的库。你能在你的答案中添加你的评论吗?
    • 大部分都可以直接实现。 cv::compareHist 已经实现了 Batthacharya。不要忘记标准化您的直方图/投影。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-02-23
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      相关资源
      最近更新 更多