增加模块;增加主调用命令
This commit is contained in:
215
spatial_features_method/plot.py
Normal file
215
spatial_features_method/plot.py
Normal file
@ -0,0 +1,215 @@
|
||||
# coding: utf-8
|
||||
# The code is written by Linghui
|
||||
|
||||
import numpy as np
|
||||
from skimage import data
|
||||
from matplotlib import pyplot as plt
|
||||
import get_glcm
|
||||
import time
|
||||
from PIL import Image
|
||||
import spectral
|
||||
import os
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
|
||||
# 使用get_glcm模块进行GLCM计算
|
||||
|
||||
def main():
|
||||
pass
|
||||
|
||||
|
||||
def load_hyperspectral_data(image_path, band_index=None):
|
||||
"""
|
||||
加载高光谱数据并可选地提取指定波段
|
||||
|
||||
参数:
|
||||
- image_path: 高光谱图像文件路径
|
||||
- band_index: 要提取的波段索引,如果为None则返回整个图像
|
||||
|
||||
返回:
|
||||
- img: 处理后的图像数据
|
||||
- h, w: 图像尺寸
|
||||
"""
|
||||
print(f'正在读取高光谱图像: {image_path}')
|
||||
|
||||
try:
|
||||
# 使用spectral库读取ENVI格式
|
||||
img_obj = spectral.open_image(image_path)
|
||||
hyperspectral_data = img_obj.load()
|
||||
print(f'使用spectral库读取成功,数据形状: {hyperspectral_data.shape}')
|
||||
except Exception as e:
|
||||
print(f'spectral库读取失败: {e}')
|
||||
raise ValueError(f"无法读取图像文件: {image_path}")
|
||||
|
||||
# 检查数据维度
|
||||
if len(hyperspectral_data.shape) != 3:
|
||||
raise ValueError(f"高光谱数据应该是3维的,当前形状: {hyperspectral_data.shape}")
|
||||
|
||||
h, w, bands = hyperspectral_data.shape
|
||||
print(f'图像尺寸: {h}x{w}, 波段数: {bands}')
|
||||
|
||||
# 如果指定了波段索引,提取该波段
|
||||
if band_index is not None:
|
||||
if band_index < 0 or band_index >= bands:
|
||||
raise ValueError(f"波段索引 {band_index} 超出范围 [0, {bands-1}]")
|
||||
|
||||
print(f'提取波段 {band_index}...')
|
||||
img = hyperspectral_data[:, :, band_index].astype(np.float32)
|
||||
|
||||
# 归一化到0-255范围
|
||||
img_min, img_max = img.min(), img.max()
|
||||
if img_max > img_min:
|
||||
img = np.uint8(255.0 * (img - img_min) / (img_max - img_min))
|
||||
else:
|
||||
img = np.zeros_like(img, dtype=np.uint8)
|
||||
|
||||
print(f'提取的波段数据范围: [{img_min:.2f}, {img_max:.2f}] -> [0, 255]')
|
||||
else:
|
||||
# 如果没有指定波段,返回第一个波段作为示例
|
||||
print('未指定波段,使用第一个波段...')
|
||||
img = hyperspectral_data[:, :, 0].astype(np.float32)
|
||||
img_min, img_max = img.min(), img.max()
|
||||
if img_max > img_min:
|
||||
img = np.uint8(255.0 * (img - img_min) / (img_max - img_min))
|
||||
else:
|
||||
img = np.zeros_like(img, dtype=np.uint8)
|
||||
|
||||
return img, h, w
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
main()
|
||||
|
||||
start = time.time()
|
||||
|
||||
print('---------------0. Parameter Setting-----------------')
|
||||
nbit = 64 # gray levels
|
||||
mi, ma = 0, 255 # max gray and min gray
|
||||
slide_window = 7 # sliding window
|
||||
# step = [2, 4, 8, 16] # step
|
||||
# angle = [0, np.pi/4, np.pi/2, np.pi*3/4] # angle or direction
|
||||
step = [2]
|
||||
angle = [0]
|
||||
|
||||
# 指定波段索引(可以修改)
|
||||
band_index = 25 # 要处理的波段索引,从0开始
|
||||
|
||||
print('-------------------1. Load Data---------------------')
|
||||
# 修改为高光谱图像路径
|
||||
image_path = r"C:\Program Files\Spectronon3\_internal\examples\leaf_small.bip.hdr"
|
||||
# image_path = r"./test.tif" # 备用的TIFF图像路径
|
||||
|
||||
# 检查文件是否存在
|
||||
if not os.path.exists(image_path):
|
||||
print(f"警告: 指定的图像文件不存在: {image_path}")
|
||||
print("请确保文件路径正确,或使用其他可用的图像文件")
|
||||
exit(1)
|
||||
|
||||
# 加载高光谱数据
|
||||
img, h, w = load_hyperspectral_data(image_path, band_index)
|
||||
print('------------------2. 计算GLCM特征---------------------')
|
||||
img = img.squeeze()
|
||||
# 使用get_glcm计算GLCM特征
|
||||
glcm = get_glcm.calcu_glcm(img, mi, ma, nbit, slide_window, step, angle)
|
||||
|
||||
print('GLCM计算完成!')
|
||||
print('-----------------3. 提取纹理特征-------------------')
|
||||
|
||||
# 提取纹理特征用于显示
|
||||
# 只计算最后一个step和angle的特征用于显示
|
||||
i, j = len(step)-1, len(angle)-1 # 使用最后一个配置
|
||||
glcm_cut = glcm[:, :, i, j, :, :]
|
||||
mean = get_glcm.calcu_glcm_mean(glcm_cut, nbit)
|
||||
variance = get_glcm.calcu_glcm_variance(glcm_cut, nbit)
|
||||
homogeneity = get_glcm.calcu_glcm_homogeneity(glcm_cut, nbit)
|
||||
contrast = get_glcm.calcu_glcm_contrast(glcm_cut, nbit)
|
||||
dissimilarity = get_glcm.calcu_glcm_dissimilarity(glcm_cut, nbit)
|
||||
entropy = get_glcm.calcu_glcm_entropy(glcm_cut, nbit)
|
||||
energy = get_glcm.calcu_glcm_energy(glcm_cut, nbit)
|
||||
correlation = get_glcm.calcu_glcm_correlation(glcm_cut, nbit)
|
||||
Auto_correlation = get_glcm.calcu_glcm_Auto_correlation(glcm_cut, nbit)
|
||||
print('---------------4. Display and Result----------------')
|
||||
print(f'使用的波段: {band_index}')
|
||||
print(f'GLCM参数: distances={step}, angles={[f"{a*180/np.pi:.0f}°" for a in angle]}')
|
||||
|
||||
plt.figure(figsize=(10, 4.5))
|
||||
font = {'family' : 'Times New Roman',
|
||||
'weight' : 'normal',
|
||||
'size' : 12,
|
||||
}
|
||||
|
||||
plt.subplot(2,5,1)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(img, cmap ='gray')
|
||||
plt.title(f'Band {band_index}', font)
|
||||
|
||||
plt.subplot(2,5,2)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(mean, cmap ='gray')
|
||||
plt.title('Mean', font)
|
||||
|
||||
plt.subplot(2,5,3)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(variance, cmap ='gray')
|
||||
plt.title('Variance', font)
|
||||
|
||||
plt.subplot(2,5,4)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(homogeneity, cmap ='gray')
|
||||
plt.title('Homogeneity', font)
|
||||
|
||||
plt.subplot(2,5,5)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(contrast, cmap ='gray')
|
||||
plt.title('Contrast', font)
|
||||
|
||||
plt.subplot(2,5,6)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(dissimilarity, cmap ='gray')
|
||||
plt.title('Dissimilarity', font)
|
||||
|
||||
plt.subplot(2,5,7)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(entropy, cmap ='gray')
|
||||
plt.title('Entropy', font)
|
||||
|
||||
plt.subplot(2,5,8)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(energy, cmap ='gray')
|
||||
plt.title('Energy', font)
|
||||
|
||||
plt.subplot(2,5,9)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(correlation, cmap ='gray')
|
||||
plt.title('Correlation', font)
|
||||
|
||||
plt.subplot(2,5,10)
|
||||
plt.tick_params(labelbottom=False, labelleft=False)
|
||||
plt.axis('off')
|
||||
plt.imshow(Auto_correlation, cmap ='gray')
|
||||
plt.title('Auto Correlation', font)
|
||||
|
||||
plt.tight_layout(pad=0.5)
|
||||
|
||||
# 创建输出文件名,包含波段信息
|
||||
output_filename = f'GLCM_Features_Band{band_index}.png'
|
||||
plt.savefig(output_filename
|
||||
, format='png'
|
||||
, bbox_inches = 'tight'
|
||||
, pad_inches = 0
|
||||
, dpi=300)
|
||||
print(f'结果图像已保存到: {output_filename}')
|
||||
|
||||
|
||||
end = time.time()
|
||||
print('Code run time:', end - start)
|
||||
Reference in New Issue
Block a user