Bildverarbeitung basierend auf Werten der 1D-Entropie und 2D-Entropie

# encoding:utf-8
import os
import cv2
import numpy as np

# 定义一维Entropy函数
def calcOneDimEntropy(hist):
    # 计算概率分布
    prob = hist / np.sum(hist, dtype=np.float32)
    # 计算熵
    entropy = -np.sum(prob*np.log2(prob+1e-7))
    return entropy

# 定义二维Entropy函数
def calcTwoDimEntropy(img, win_size=5):
    # 初始化灰度共生矩阵
    glcm = np.zeros((256, 256), dtype=int)
    # 计算灰度共生矩阵
    for i in range(img.shape[0] - win_size):
        for j in range(img.shape[1] - win_size):
            row = img[i:i+win_size, j:j+win_size].flatten()
            for k in range(len(row) - 1):
                glcm[row[k], row[k+1]] += 1
    # 计算概率分布
    prob = glcm / np.sum(glcm, dtype=np.float32)
    # 计算熵
    entropy = -np.sum(prob*np.log2(prob+1e-7))
    return entropy

# 定义分类函数
def classifyImage(img_path, one_dim_th=3.0, two_dim_th=3.0, save_path='result'):
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    one_dim_entropy = calcOneDimEntropy(hist)
    two_dim_entropy = calcTwoDimEntropy(img)
    if one_dim_entropy >= one_dim_th and two_dim_entropy >= two_dim_th:
        img_name = img_path.split('/')[-1]
        folder_name = img_path.split('/')[-2]
        folder_path = save_path+'/'+folder_name
        if not os.path.exists(folder_path):
            os.makedirs(folder_path)
        cv2.imwrite(folder_path+'/'+img_name, img)
        return one_dim_entropy, two_dim_entropy
    return None, None

# 定义待分类图像文件夹列表
img_folders = ['folder1', 'folder2', 'folder3']

# 保存分类结果
result = {}

# 分类
for img_folder in img_folders:
    img_paths = os.listdir(img_folder)
    for img_path in img_paths:
        one_dim_entropy, two_dim_entropy = classifyImage(img_folder+'/'+img_path, save_path='result')
        if one_dim_entropy is not None and two_dim_entropy is not None:
            result[img_folder+'/'+img_path] = (one_dim_entropy, two_dim_entropy)

# 保存一维和二维熵最大的几张图像
sorted_result = sorted(result.items(), key=lambda item: item[1], reverse=True)
for i in range(min(len(sorted_result), 5)):
    img_path = sorted_result[i][0]
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    cv2.imwrite('top_'+str(i+1)+'.jpg', img)


# 上述代码与前面的代码大致相同,不同之处在于我们在分类函数中增加了返回值,并在分类过程中保存分类结果。
# 具体来说,我们在分类函数中增加了返回值,返回一维熵和二维熵的值。在分类过程中,如果图像符合要求,则将图像保存在指定路径中,
# 并记录分类结果。在最后的代码中,我们对分类结果进行

おすすめ

転載: blog.csdn.net/Wzongming/article/details/129496687