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

    科技2022-07-11  119

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

    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()
    Processed: 0.010, SQL: 8