比较两个图片的灰度直方图,并计算直方图重合度
核心函数:cv2.calcHist()
计算一系列数组的直方图,图像的灰度直方图可以统计出图像中的每一个像素的灰度值在整个图像中出现的次数。
定义
imag
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) ->hist
- imaes:输入的图像
- channels:选择图像的通道
- mask:掩膜,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像
- histSize:使用多少个bin(柱子),一般为256
- ranges:像素值的范围,一般为[0,255]表示0~255
后面两个参数基本不用管。
注意,除了mask,其他四个参数都要带[]号。
参考:https://blog.csdn.net/a13602955218/article/details/84310394
代码
# 利用python实现实现图像识别:比较两图像直方图相似性
# 核心:计算直方图重合度
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 最简单的以灰度直方图作为相似比较的实现
def classify_gray_hist(image1, image2, size=(256, 256)):
# 先计算直方图
# 几个参数必须用方括号括起来
# 这里直接用灰度图计算直方图,所以是使用第一个通道,
# 也可以进行通道分离后,得到多个通道的直方图
image1 = cv2.resize(image1, size)
image2 = cv2.resize(image2, size)
hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
# 可以比较下直方图
plt.plot(range(256), hist1, 'r')
plt.plot(range(256), hist2, 'b')
plt.show()
# 计算直方图的重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
else:
degree = degree + 1
degree = degree / len(hist1)
return degree
if __name__ == '__main__':
# 读取图片并显示
img1 = cv2.imread('B.jpg')
cv2.imshow('img1', img1)
img2 = cv2.imread('A.jpg')
cv2.imshow('img2', img2)
degree = classify_gray_hist(img1, img2)
print
degree
cv2.waitKey(0)
比较两个相差很大的图:
比较原图:
代码运行结果:
显示比较的两个不同的图
显示对比直方图
比较两个相似的图:
原图:
运行结果(显示比较的两张相似的图):
显示对比直方图
比较两个相同的图
代码运行结果(显示比较的图):
显示对比直方图