比较两个图像,如果它们具有几乎相同的RGB颜色分布

时间:2020-06-03 00:34:39

标签: python opencv

我有下面定义的两个彩色图像img1和img2

 img1 = cv2.imread("source1")
 img2 = cv2.imread("source2")

现在我想知道两个图像的RGB值分布是否几乎相同。作为人类,我可以从两个图像的RGB直方图分布中看出它们几乎相同还是不相同。但是有没有办法我可以通过OpenCV做到这一点,它可以告诉我们两个图像的RGB分布几乎完全相同?

color = ('b','g','r')
for i,col in enumerate(color):
   histr = cv.calcHist([img1],[i],None,[256],[0,256])
   plt.subplot(1,2,1)
   plt.plot(histr,color = col)
   plt.xlim([0,256])
   plt.title("Img 1")

   histr = cv.calcHist([img2],[i],None,[256],[0,256])
   plt.subplot(1,2,2)
   plt.plot(histr,color = col)
   plt.xlim([0,256])
   plt.title("Img 2")
plt.show()

2 个答案:

答案 0 :(得分:1)

如果在两个直方图A和B的x轴上取每个点,则两者在该点的重叠量就是较小的高度:

min(A,B)

因此,您只需要对要点求和:

np.sum(np.minimum(A,B))

作为经验解释,如果两个直方图在相同位置都很高,则直方图重叠会很高,min(A,B)也会如此。如果一个为高而一个为低,则直方图重叠并且min(A,B)将为低。

我找到了一个不错的插图here,该插图还可以通过除以像素总数来建议归一化。

答案 1 :(得分:1)

您可以在Python / OpenCV中使用cv2.compareHist()。它采用两个可以是1D,2D或3D直方图的直方图,并返回相似度的度量值。

例如,参见https://docs.opencv.org/3.4/d6/dc7/group__imgproc__hist.html#gaf4190090efa5c47cb367cf97a9a519bdhttps://docs.opencv.org/3.4/d8/dc8/tutorial_histogram_comparison.htmlhttps://www.pyimagesearch.com/2014/07/14/3-ways-compare-histograms-using-opencv-python/