221 lines
7.3 KiB
Python
221 lines
7.3 KiB
Python
import numpy as np
|
||
import matplotlib.pyplot as plt
|
||
from egnn_core.data import load_data_v3,load_data_v6
|
||
import os
|
||
import json
|
||
from skimage.feature import graycomatrix
|
||
|
||
#根据连接来遍历点的表
|
||
#第一步,遍历edge index.T里面的第一列对应的点的序号[:,0]
|
||
#第二步,根据序号去找对应的label是否为普通,即0,如果等于0进入下一步,不然跳过;这一步是为了排除掉非普通原子的
|
||
#第三步,判断普通的原子的邻居是不是也是普通的:
|
||
#先找edge index.T里面的第一列对应的点的序号[:,1],即邻居有哪些
|
||
#去判断这些邻居有多少个属于线缺陷,即label是2,并计数
|
||
#记住,此时要把该点从表中永远排除,避免重复技术
|
||
# edge_index = np.array([[1, 3], [4, 5], [1, 7], [1, 10]])
|
||
# labels = np.array([0,0,0,2,0,2,0,2,0,0,2])
|
||
|
||
|
||
# 指定文件夹路径
|
||
folder_path = '/home/gao/mouclear/analyze_center/new+label'
|
||
img_size = 2048
|
||
# target_size = [150,200]
|
||
target_size = [165,185]
|
||
|
||
|
||
def calculate_entropy(image):
|
||
hist, _ = np.histogram(image, bins=range(256), range=(0, 255))
|
||
probabilities = hist / np.sum(hist)
|
||
entropy = -np.sum(probabilities[probabilities > 0] * np.log2(probabilities[probabilities > 0]))
|
||
return entropy
|
||
|
||
|
||
def calculate_mean_entropy(image):
|
||
# 确定图像的尺寸
|
||
height, width = image.shape
|
||
# 计算每块的大小
|
||
block_height = height // 2
|
||
block_width = width // 2
|
||
|
||
# 初始化熵列表
|
||
entropies = []
|
||
|
||
# 计算四块的熵
|
||
for i in range(2):
|
||
for j in range(2):
|
||
# 计算区域的坐标
|
||
start_row, end_row = i * block_height, (i + 1) * block_height
|
||
start_col, end_col = j * block_width, (j + 1) * block_width
|
||
|
||
# 提取区域
|
||
region = image[start_row:end_row, start_col:end_col]
|
||
|
||
# 计算熵并添加到列表
|
||
entropies.append(calculate_entropy(region))
|
||
|
||
# 计算熵的均值和方差
|
||
mean_entropy = np.mean(entropies)
|
||
variance_entropy = np.var(entropies)
|
||
|
||
return mean_entropy, variance_entropy
|
||
|
||
def calculate_entropy_v2(image, distances=[1], angles=[0], levels=256, return_matrix=False):
|
||
"""
|
||
计算基于灰度共生矩阵的熵。
|
||
|
||
参数:
|
||
- image: 二维NumPy数组,表示灰度图像。
|
||
- distances: 考虑的像素距离。
|
||
- angles: 考虑的角度,可以是0, 90, 135, 45度。
|
||
- levels: 灰度级别数量,默认为256。
|
||
- return_matrix: 是否返回灰度共生矩阵,默认为False。
|
||
|
||
返回:
|
||
- entropy: 熵值。
|
||
- glcm (如果return_matrix为True): 灰度共生矩阵。
|
||
"""
|
||
|
||
# 确保image是uint8类型
|
||
image = image.astype(np.uint8)
|
||
|
||
# 计算灰度共生矩阵
|
||
glcm = graycomatrix(image, distances, angles, levels, symmetric=True, normed=True)
|
||
|
||
# 创建一个与glcm形状相同的掩码,用于过滤零概率值
|
||
mask = glcm > 0
|
||
|
||
# 计算每个GLCM的熵,只对非零概率值进行计算
|
||
glcm_entropy = -np.sum(glcm * np.log2(glcm) * mask, axis=1) / np.sum(mask, axis=1)
|
||
|
||
# 取平均熵作为图像的熵
|
||
entropy = np.mean(glcm_entropy[glcm_entropy > 0]) # 排除NaN值
|
||
#
|
||
# # 计算每个GLCM的熵
|
||
# glcm_prob = glcm / np.sum(glcm)
|
||
# glcm_entropy = -np.sum(glcm_prob * np.log2(glcm_prob), axis=1)
|
||
|
||
# 取平均熵作为图像的熵
|
||
# entropy = np.mean(glcm_entropy)
|
||
|
||
if return_matrix:
|
||
return entropy, glcm
|
||
else:
|
||
return entropy
|
||
|
||
def process_json_file(json_file):
|
||
json_filename = os.path.basename(json_file)
|
||
json_filename_without_ext = os.path.splitext(json_filename)[0]
|
||
image_filename = f"{json_filename_without_ext}.png"
|
||
|
||
points, edge_index, labels, lights = load_data_v6(json_file) # 假设这是你的数据加载函数
|
||
|
||
graph_index = np.where(labels == 3)
|
||
center_index = np.where(labels == 4)
|
||
vacancy = np.where(labels == 5)
|
||
combined_index = np.array(center_index[0].tolist() + graph_index[0].tolist() + vacancy[0].tolist())
|
||
# print(len(combined_index))
|
||
|
||
selected_point = []
|
||
selected_light = []
|
||
selected_label = []
|
||
for i in combined_index:
|
||
selected_point.append(points[i])
|
||
selected_light.append(lights[i])
|
||
selected_label.append(labels[i])
|
||
|
||
selected_point = np.array(selected_point)
|
||
selected_light = np.array(selected_light)
|
||
selected_label = np.array(selected_label)
|
||
|
||
|
||
bg = np.zeros((img_size, img_size))
|
||
plt.figure(figsize=(9, 9))
|
||
|
||
for label, point in zip(selected_label, selected_point):
|
||
img_h, img_w = bg.shape # 背景图像的高度和宽度
|
||
h, w = point
|
||
|
||
ps = 1 # 因为 light 是 3x3 的区域,所以 ps 应该是 1
|
||
hs = np.clip(h - ps, 0, img_h - ps - 1)
|
||
ws = np.clip(w - ps, 0, img_w - ps - 1)
|
||
he = hs + 2 * ps + 1 # 3x3 区域的结束行索引
|
||
we = ws + 2 * ps + 1 # 3x3 区域的结束列索引
|
||
|
||
if label == 3:
|
||
array_3x3 = np.full((3, 3), 200)
|
||
|
||
if label == 4:
|
||
if json_filename_without_ext !='2_2':
|
||
array_3x3 = np.full((3,3), 50)
|
||
else:
|
||
array_3x3 = np.full((3, 3), 200)
|
||
|
||
if label == 5:
|
||
array_3x3 = np.full((3, 3), 50)
|
||
|
||
# 绘制到背景图像上
|
||
bg[hs:he, ws:we] = array_3x3
|
||
|
||
# 绘制完所有 light 后,找到被修改的区域
|
||
modified_rows, modified_cols = np.where(bg != 0)
|
||
|
||
# 计算最小和最大索引,以确定被修改区域的范围
|
||
min_row, max_row = min(modified_rows), max(modified_rows)
|
||
min_col, max_col = min(modified_cols), max(modified_cols)
|
||
|
||
# 计算需要裁剪的边界,以保持统一尺寸
|
||
pad_height = max_row - min_row
|
||
pad_width = max_col - min_col
|
||
pad_top = (target_size[0] - pad_height) // 2
|
||
pad_left = (target_size[1] - pad_width) // 2
|
||
|
||
# 确保裁剪尺寸不超出原始图片尺寸
|
||
pad_top = min(pad_top, img_size - max_row)
|
||
pad_left = min(pad_left, img_size - max_col)
|
||
|
||
# 裁剪背景图像,只保留被修改的区域,并添加边界以保持统一尺寸
|
||
cropped_bg = bg[
|
||
min_row - pad_top:min_row - pad_top + target_size[0],
|
||
min_col - pad_left:min_col - pad_left + target_size[1]
|
||
]
|
||
|
||
|
||
# 裁剪背景图像,只保留被修改的区域
|
||
# cropped_bg = bg[min_row-1:max_row + 1, min_col-1:max_col + 1]
|
||
|
||
# 绘制裁剪后的背景图像
|
||
plt.figure(figsize=(9, 9))
|
||
plt.imshow(cropped_bg, cmap='gray') # 使用 'nearest' 插值以保持像素的完整性
|
||
plt.axis('off')
|
||
plt.tight_layout()
|
||
|
||
|
||
plt.savefig(image_filename, bbox_inches='tight', pad_inches=0)
|
||
|
||
plt.close() # 关闭绘图以释放资源
|
||
|
||
# 计算 bg 图像的熵
|
||
# entropy = calculate_entropy(cropped_bg)
|
||
# print(f"The entropy of the image is: {entropy}")
|
||
|
||
# entropy = calculate_entropy_v2(cropped_bg)
|
||
# print("灰度共生矩阵的熵:", entropy)
|
||
mean_entropy, variance_entropy = calculate_mean_entropy(cropped_bg)
|
||
print(f"熵的均值: {mean_entropy}")
|
||
print(f"熵的方差: {variance_entropy}")
|
||
|
||
# 可以选择再次显示图像和熵值
|
||
plt.imshow(cropped_bg, cmap='gray')
|
||
# plt.title(f"Image Entropy: {entropy}")
|
||
plt.axis('off')
|
||
plt.show()
|
||
|
||
|
||
|
||
# 遍历文件夹中的所有文件
|
||
for filename in os.listdir(folder_path):
|
||
if filename.endswith('.json'):
|
||
print(filename)
|
||
json_file = os.path.join(folder_path, filename)
|
||
process_json_file(json_file)
|