基于增量式互信息的图像匹配方法

基于增量式互信息的图像匹配方法,相比基于互信息的图像匹配方法算法效率有了明显的提高,但是整体来说效率还是比较低下。

import numpy as np
import math
import cv2
 
# 读取目标图片
target = cv2.imread("Resources/target.jpg")
# 读取模板图片
template = cv2.imread("Resources/template.jpg")
# 将目标图片转换为灰度图片
target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)
# 将模板图片转换为灰度图片
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 获取目标图片的大小
target_x, target_y = target.shape
# 获取模板图片的大小
template_x, template_y = template.shape
# 计算候选框的数量
candidate_x = target_x - template_x
candidate_y = target_y - template_y
 
# 1.计算模板图片的概率分布
print('1.计算模板图片的概率分布和信息熵')
distribution_template = np.zeros(256, np.int)  # 记录概率分布
Hd = 0.0  # 记录信息熵
Pa = np.zeros(256, np.float)  # 记录每个灰度值的概率
SumPa = candidate_x * candidate_y  # 像素总数量
print('1.1计算模板图片的概率分布')
for i in range(template_x):
    for j in range(template_y):
        # 统计每个灰度值的数量
        distribution_template[template[i, j]] = distribution_template[template[i, j]] + 1
print('1.2 计算模板图片的信息熵')
for i in range(256):  # 遍历每个灰度值
    if distribution_template[i] != 0:
        # 计算每个灰度值的概率
        Pa[i] = distribution_template[i] / SumPa
        # 计算每个灰度值的概率的自然对数
        lgPa = math.log(Pa[i], math.e)
        # 计算信息熵
        Hd += -(Pa[i] * lgPa)
 
# 2.计算目标图片的概率分布和信息熵
print('2.计算目标图片的概率分布和信息熵')
distribution_target = np.zeros((256, candidate_x, candidate_y), np.float)  # 记录每个候选框概率分布
HS = np.zeros((candidate_x, candidate_y), np.float)  # 记录每个候选框信息熵
Pb = np.zeros((256, candidate_x, candidate_y), np.float)  # 记录每个候选框中每个灰度值的概率
SumPb = SumPa  # 像素总数量
# 循环每一个候选框
for i in range(candidate_x):
    print(f'--计算第{i}行模板图片的信息')
    for j in range(candidate_y):
        # 1.计算候选框的概率分布
        for m in range(template_x):
            for n in range(template_y):
                # 统计第i行第j列的候选框的每个灰度值的数量
                distribution_target[target[i + m, j + n]][i][j] = distribution_target[target[i + m, j + n]][i][j] + 1
        # 2.计算候选框信息熵
        for k in range(256):
            if distribution_target[k][i][j] != 0:
                # 计算每个灰度值的概率
                Pb[k][i][j] = distribution_target[k][i][j] / SumPb
                # 计算每个灰度值的概率的自然对数
                lgPb = math.log(Pb[k][i][j], math.e)
                # 计算信息熵
                HS[i][j] += -(Pb[k][i][j] * lgPb)
 
# 3.计算联合概率分布
print('3.计算联合概率分布')
HdS = np.zeros((candidate_x, candidate_y), np.float)
for x in range(candidate_x):
    print(f'运行到第{x}行')
    for y in range(candidate_y):
        for a in range(256):
            if distribution_template[a] != 0:
                for b in range(256):
                    if distribution_target[b][x][y] != 0:
                        Pab = Pa[a] * Pb[b][x][y]
                        lgPab = math.log(Pab)
                        HdS[x][y] += -(Pab * lgPab)
 
# 4.计算互信息熵值
print('4.计算互信息熵值')
IdS = np.zeros((candidate_x, candidate_y), np.float)
for x in range(candidate_x):
    for y in range(candidate_y):
        IdS[x][y] = Hd + HS[x][y] - HdS[x][y]
 
bm = IdS.max()  # 最大值
index = np.unravel_index(b.argmax(), b.shape)  # 最大值索引
print("最大信息熵", bm)
print('最大信息熵索引', index)
 
cv2.rectangle(target, index, (index[0] + template_y, index[1] + template_x), (0, 255, 225), 2)
cv2.imshow('Result', target)
cv2.waitKey()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值