2021-06-20

图像二维熵计算

# coding=utf-8
import os

import cv2
import time
import reader
import numpy as np
from collections import Counter

image_A_path_lsit = []
image_B_path_lsit = []
image_A_entropy_lsit = []
image_B_entropy_lsit = []

def calcIJ(img_patch):
    total_p = img_patch.shape[0] * img_patch.shape[1]
    if total_p % 2 != 0:
        center_p = img_patch[int(img_patch.shape[0] / 2), int(img_patch.shape[1] / 2)]
        mean_p = round((np.sum(img_patch) - center_p) / (total_p - 1))
        return (center_p, mean_p)
    else:
        pass

def calcEntropy2dSpeedUp(img, mask, win_w = 3, win_h = 3, format_len = 5):
    # 边缘填充行列,值填0
    height = img.shape[0]
    ext_x = int(win_w / 2)
    ext_y = int(win_h / 2)
    ext_h_part = np.zeros([height, ext_x], img.dtype)
    tem_img = np.hstack((ext_h_part, img, ext_h_part))
    ext_v_part = np.zeros([ext_y, tem_img.shape[1]], img.dtype)
    final_img = np.vstack((ext_v_part, tem_img, ext_v_part))
    new_width = final_img.shape[1]
    new_height = final_img.shape[0]

    # 遍历计算二元组
    IJ = []
    for i in range(ext_x, new_width - ext_x):
        for j in range(ext_y, new_height - ext_y):
            # patch对应一个win_w*win_h领域
            if mask[j - ext_y][i - ext_x] == 0:
                continue
            patch = final_img[j - ext_y:j + ext_y + 1, i - ext_x:i + ext_x + 1]
            ij = calcIJ(patch)
            IJ.append(ij)

    # 计算F(i,j)出现的次数
    Fij = Counter(IJ).items()

    # 计算各二元组出现的概率
    totol_pixel = np.count_nonzero(mask)
    Pij = []
    for item in Fij:
        # tmp = format(item[1] * 1.0 / totol_pixel, format_len)
        # Pij.append(float(tmp))
        Pij.append(item[1] * 1.0 / totol_pixel)

    H_tem = []
    for item in Pij:
        h_tem = -item * (np.log(item) / np.log(2))
        H_tem.append(h_tem)

    H = np.sum(H_tem)
    return H

def get_median(src, mask):
    height = src.shape[0]
    width = src.shape[1]
    pixel_value = []
    for i in range(height):
        for j in range(width):
            if mask[i][j] != 0:
                pixel_value.append(src[i][j])
    return np.median(pixel_value)

def get_folder_img(folder):
    files = reader.get_files(folder, "jpg")
    if len(files) != 2:
        print(folder, " img num error")
        return -1, -1
    for item in files:
        # 找到路径中含有mask,即为mask图路径
        if item.find('mask') != -1:
            mask_img_path = item
        else:
            ori_img_path = item
    ori_img = cv2.imread(ori_img_path, cv2.IMREAD_GRAYSCALE)
    mask_img = cv2.imread(mask_img_path, cv2.IMREAD_GRAYSCALE)
    return ori_img, mask_img

def get_normalized(img, factor):
    return cv2.multiply(img, factor)

def compire_entropy(folders_A, folders_B, patch_size, format_len):
    result = []
    A_to_B = False
    if len(folders_A) != len(folders_B) :
        print("folder num not equal")
    curTime = 0
    totalTimes = len(folders_A)
    for index, folder in enumerate(folders_A):
        curTime += 1
        print("Current progress : ", curTime, "/", totalTimes)
        src_A, mask_A = get_folder_img(folders_A[index])
        src_B, mask_B = get_folder_img(folders_B[index])
        median_A = get_median(src_A, mask_A)
        median_B = get_median(src_B, mask_B)
        if median_A < median_B :
            A_to_B = True
        factor = min(median_A, median_B) / max(median_A, median_B)
        h_A = 0
        h_B = 0
        if A_to_B:
            normalized_A = get_normalized(src_A, factor)
            h_A = calcEntropy2dSpeedUp(normalized_A, mask_A, patch_size, patch_size, format_len)
            h_B = calcEntropy2dSpeedUp(src_B, mask_B, patch_size, patch_size, format_len)
        else:
            normalized_B = get_normalized(src_B, factor)
            h_A = calcEntropy2dSpeedUp(src_A, mask_A, patch_size, patch_size, format_len)
            h_B = calcEntropy2dSpeedUp(normalized_B, mask_B, patch_size, patch_size, format_len)

        if h_A < h_B:
            result.append(0)
        else:
            result.append(1)

        image_A_path_lsit.append(folders_A[index].split('\\')[-1])
        image_B_path_lsit.append(folders_B[index].split('\\')[-1])
        image_A_entropy_lsit.append(h_A)
        image_B_entropy_lsit.append(h_B)
    return result

def save_result(filename):
    with open(filename, 'w') as f_obj:
        for index, entropy in enumerate(image_A_path_lsit):
            str_output = image_A_path_lsit[index] + " " + str(image_A_entropy_lsit[index]) +\
                         " " + image_B_path_lsit[index] + " " + str(image_B_entropy_lsit[index])
            f_obj.write(str_output)
            f_obj.write("\n")

if __name__ == '__main__':
    folders_A = reader.get_folders(".\input\A", "jpg")
    folders_B = reader.get_folders(".\input\B", "jpg")

    patch_size = 3
    format_len = '.5f'
    result = compire_entropy(folders_A, folders_B, patch_size, format_len)
    output_file = "entropy_output.txt"
    save_result(output_file)
    print(result)
    print("Done")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值