python opencv图片对比_Python-Opencv中用compareHist函数进行直方图比较进行对比图片...

Python-Opencv中用compareHist函数进行直方图比较进而对比图片

图像直方图

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。

图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。

直方图比较

1. 图像相似度比较

如果我们有两张图像,并且这两张图像的直方图一样,或者有极高的相似度,那么在一定程度上,我们可以认为这两幅图是一样的,这就是直方图比较的应用之一。

2. 分析图像之间关系

两张图像的直方图反映了该图像像素的分布情况,可以利用图像的直方图,来分析两张图像的关系。

直方图比较函数

cv2.compareHist(H1, H2, method)

其中:

H1,H2 分别为要比较图像的直方图

method - 比较方式

比较方式(method)

相关性比较 (method=cv.HISTCMP_CORREL) 值越大,相关度越高,最大值为1,最小值为0

卡方比较(method=cv.HISTCMP_CHISQR 值越小,相关度越高,最大值无上界,最小值0

巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相关度越高,最大值为1,最小值为0

代码实现

import cv2 as cv

import numpy as np

from matplotlib import pyplot as plt

def create_rgb_hist(image):

""""创建 RGB 三通道直方图(直方图矩阵)"""

h, w, c = image.shape

# 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵

# 16*16*16的意思为三通道每通道有16个bins

rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)

bsize = 256 / 16

for row in range(h):

for col in range(w):

b = image[row, col, 0]

g = image[row, col, 1]

r = image[row, col, 2]

# 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建

index = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)

# 该处形成的矩阵即为直方图矩阵

rgbhist[int(index), 0] += 1

plt.ylim([0, 10000])

plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)

return rgbhist

def hist_compare(image1, image2):

"""直方图比较函数"""

# 创建第一幅图的rgb三通道直方图(直方图矩阵)

hist1 = create_rgb_hist(image1)

# 创建第二幅图的rgb三通道直方图(直方图矩阵)

hist2 = create_rgb_hist(image2)

# 进行三种方式的直方图比较

match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)

match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)

match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)

print("巴氏距离:%s, 相关性:%s, 卡方:%s" %(match1, match2, match3))

src1 = cv.imread("diff1.PNG")

cv.imshow("diff1", src1)

src2 = cv.imread("diff2.PNG")

cv.imshow("diff2", src2)

plt.subplot(1,2,1)

plt.title("diff1")

plt.plot(create_rgb_hist(src1))

plt.subplot(1,2,2)

plt.title("diff2")

plt.plot(create_rgb_hist(src2))

hist_compare(src1, src2)

plt.show()

cv.waitKey(0)

cv.destroyAllWindows()

巴氏距离:0.3116175231543461, 相关性:0.8805851455583134,

卡方:154379.82963705878

从计算得到的三个比较值可以发现巴氏距离较低,相关性较高,可以简单认为这两幅图的相似度比较大。

例如下面两幅图

巴氏距离:0.8939676325760126, 相关性:0.03202528698270991,

卡方:503948.24201884575

从计算得到的三个比较值可以发现巴氏距离很高,相关性系数很低,可以简单认为这两幅图的相似度非常小。

初学Opencv,如有错误地方和改进地方,真诚地邀请您提出来,谢谢!

本文结束…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值