问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
import numpy as np
import math
import cv2
# 读取目标图片
target = cv2.imread("000.jpg",0)
# 读取模板图片
template = cv2.imread("111.jpg",0)
# 获取目标图片的大小
target_x, target_y = target.shape
# 获取模板图片的大小
template_x, template_y = template.shape
# 计算候选框的数量
candidate_x = target_x - template_x + 1
candidate_y = target_y - template_y + 1
# 1.计算模板图片的概率分布
print('1.计算模板图片的概率分布和信息熵')
distribution_template = np.zeros(256, np.int32) # 记录概率分布
Hd = 0.0 # 记录信息熵
Pa = np.zeros(256, np.float16) # 记录每个灰度值的概率
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)
# for i in range(256):
# print(f"{i}:{distribution_template[i]}")
# print(Hd)
# for i in range(256):
# if distribution_template[i]!=0:
# print(f"{i}:{distribution_template[i]}",end=" ")
# 2.计算目标图片的概率分布和信息熵
print('2.计算目标图片的概率分布和信息熵')
distribution_target = np.zeros((256, candidate_x, candidate_y), np.int32) # 记录每个候选框概率分布
HS = np.zeros((candidate_x, candidate_y), np.float16) # 记录每个候选框信息熵
Pb = np.zeros((256, candidate_x, candidate_y), np.float16) # 记录每个候选框中每个灰度值的概率
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
# print(f"{i}行{j}列:")
# for a in range(256):
# if distribution_target[a][i][j] != 0:
# print(f"{a}:{distribution_target[a][i][j]}", end=" ")
# print("")
# 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)
# print(HS)
# 3.计算联合概率分布
print('3.计算联合概率分布')
HdS = np.zeros((candidate_x, candidate_y), np.float16)
for x in range(candidate_x):
print(f'运行到第{x}行')
for y in range(candidate_y):
for a in range(256):
for b in range(256):
if distribution_target[b][x][y] != 0 and distribution_template[a] != 0:
Pab = Pa[a] * Pb[b][x][y]
lgPab = math.log(Pab, math.e)
HdS[x][y] += -(Pab * lgPab)
# 4.计算互信息熵值
print('4.计算互信息熵值')
IdS = np.zeros((candidate_x, candidate_y), np.float16)
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(np.argmax(IdS), IdS.shape) # 最大值索引
print("最大信息熵", bm)
print('最大信息熵索引', index)
cv2.rectangle(target, index, (index[0] + template_y, index[1] + template_x), (0, 0, 255))
cv2.imshow('Result', target)
cv2.waitKey()
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果