搬砖手 2022-02-05 20:46
浏览 70
已结题

基于增量式互信息的图像匹配算法代码问题

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
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()
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 2月13日
    • 创建了问题 2月5日

    悬赏问题

    • ¥15 求合并两个字节流VB6代码
    • ¥15 Pyqt 如何正确的关掉Qthread,并且释放其中的锁?
    • ¥30 网站服务器通过node.js部署了一个项目!前端访问失败
    • ¥15 WPS访问权限不足怎么解决
    • ¥15 java幂等控制问题
    • ¥15 海湾GST-DJ-N500
    • ¥15 氧化掩蔽层与注入条件关系
    • ¥15 Django DRF 如何反序列化得到Python对象类型数据
    • ¥15 多数据源与Hystrix的冲突
    • ¥15 如何在线硕士了解,广告太多,希望有真实接触过的人回答下?(标签-学习|关键词-在线硕士)