#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @File : affinity.py @Contact : zpyovo@hotmail.com @License : (C)Copyright 2018-2019, Lab501-TransferLearning-SCUT @Description : @Modify Time @Author @Version @Desciption ------------ ------- -------- ----------- 2022/3/12 9:18 PM Pengyu Zhang 1.0 None ''' from __future__ import absolute_import from __future__ import division from __future__ import print_function import torch import torch.nn.functional as F import numpy as np import cv2 def eightway_total_diff(arr): # 对输入数组进行填充,每边填充1个元素 padded_arr = np.pad(arr, pad_width=1, mode='edge') # 获取填充后数组的尺寸 h, w = padded_arr.shape # 初始化输出数组,用于存储总差值 diff_array = np.zeros((h-2, w-2)) # 遍历每个元素(不包括填充的边界) for y in range(1, h-1): for x in range(1, w-1): total_diff = 0 # 初始化当前元素的总差值 # 计算每个方向的差值 for dy in range(-1, 2): for dx in range(-1, 2): if dy == 0 and dx == 0: # 排除中心点自身 continue # 直接使用填充后的坐标计算差值 diff = abs(padded_arr[y, x] - padded_arr[y+dy, x+dx]) # 如果差值小于0,则置为0 total_diff += max(diff, 0) # 将总差值存储在输出数组中 diff_array[y-1, x-1] = total_diff return diff_array.astype(int) def roi_affinity_siml(X_ter,X_str): X_ter = np.array(X_ter) X_str = np.array(X_str) X_ter_diffs = eightway_total_diff(X_ter / X_ter.max()) X_str_diffs = eightway_total_diff(X_str / X_str.max()) # 计算差异 difference = cv2.absdiff(X_ter_diffs, X_str_diffs) mean_diff = np.mean(difference) # 计算相似度 similarity = max((1 - mean_diff) * 100, 0) return similarity