# 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
今日推荐
周排行