比较两个图片的灰度直方图,并计算直方图重合度

 比较两个图片的灰度直方图,并计算直方图重合度

核心函数:cv2.calcHist()

计算一系列数组的直方图,图像的灰度直方图可以统计出图像中的每一个像素的灰度值在整个图像中出现的次数。

定义
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) ->hist
imag

  • 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)

比较两个相差很大的图:

比较原图:

代码运行结果:

显示比较的两个不同的图

 显示对比直方图

比较两个相似的图:

原图:

运行结果(显示比较的两张相似的图): 

显示对比直方图 

 

比较两个相同的图

代码运行结果(显示比较的图):

显示对比直方图 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值