深度学习与遥感入门(七)|CNN vs CNN+形态学属性(MP):特征工程到底值不值?

scikit-image图像处理实战:科研与工业级预处理指南 图像处理是计算机视觉和数据分析的基础环节,其核心在于将原始图像转化为机器可读、分析可靠、流程可复现的数据形态。从X光去伪影、显微图像背景校正,到工业缺陷增强与多光谱对齐,关键不在于滤镜堆砌,而在于对曝光校正、形态学操作、频域滤波等底层原理的精准控制。scikit-image凭借基于NumPy的科学计算设计、CIE标准色彩空间支持及模块化算法分层(如exposure、restoration、segmentation),成为连接图像物理本质与AI模型输入的理想桥梁。本文聚焦真实工程场景中的预处理链路构建、参数可 阅读详情

前置内容见链接:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkwMTE0MjI4NQ==&action=getalbum&album_id=3959684907432935425#wechat_redirect

前面的内容我们介绍了很多特征挖掘的内容,那么今天主要通过实验证明特征挖掘到底有没有用。

在遥感图像分类任务中,模型性能的提升往往离不开高质量的特征。当深度学习遇上传统特征工程,会碰撞出怎样的火花?今天我们就通过对比纯CNN模型与融合了形态学属性(Morphological Profiles, MP)的CNN模型,来探讨特征工程在遥感分类中的价值。

一、为什么要做特征挖掘?

遥感图像包含丰富的光谱、空间和纹理信息,但原始数据往往存在维度高、冗余多、噪声干扰等问题。直接将原始数据输入模型,不仅会增加计算负担,还可能因为无效信息过多而影响分类精度。

特征挖掘(特征工程)的核心价值在于:

  • 降维提质:保留关键信息,剔除冗余噪声
  • 显式建模:将领域知识转化为可量化的特征
  • 辅助学习:为模型提供更易学习的表示形式

在遥感领域,形态学属性(MP)就是一种经典的特征工程方法——它通过数学形态学运算捕捉图像中的空间结构信息,非常适合处理遥感图像中常见的地物轮廓、纹理等特征。

二、实验设计:严格对比CNN与CNN+MP

我们以KSC(肯尼迪航天中心)高光谱数据集为研究对象,设计严格的对比实验:

  • 数据集:KSC高光谱图像(含176个波段,614×512像素)及对应地物标签
  • 核心对比:
    1. 仅使用PCA降维后的光谱特征(CNN模型)
    2. 融合PCA特征与多尺度形态学属性(CNN+MP模型)
  • 评估指标:总体精度(OA)、平均精度(AA)、Kappa系数、推理速度

三、代码逐段解析

1. 基础工具与参数设置

首先导入必要的库并设置基础工具函数:

import os, time, random
import numpy as np
import scipy.io as sio
import scipy.ndimage as ndi
import pandas as pd
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (classification_report, confusion_matrix, accuracy_score,
                             cohen_kappa_score)
from sklearn.model_selection import train_test_split

import matplotlib
if os.name == 'nt':
    try:
        matplotlib.use('TkAgg')
    except Exception:
        matplotlib.use('Agg')
else:
    matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 120
sns.set_theme(context="notebook", style="whitegrid", font="SimHei")

torch.backends.cudnn.benchmark = True

基础工具函数:

  • set_seeds:固定随机种子,保证实验可复现
  • average_accuracy:计算平均精度(AA)
  • make_disk:生成形态学运算所需的圆形结构元素
def set_seeds(seed=42):
    random.seed(seed); np.random.seed(seed)
    torch.manual_seed(seed); torch.cuda.manual_seed_all(seed)

def average_accuracy(y_true, y_pred, num_classes):
    cm = confusion_matrix(y_true, y_pred, labels=list(range(num_classes)))
    with np.errstate(divide='ignore', invalid='ignore'):
        per_class = np.diag(cm) / cm.sum(axis=1).clip(min=1)
    return float(np.nanmean(per_class))

def make_disk(radius: int) -> np.ndarray:
    if radius <= 0: return np.array([[1]], dtype=bool)
    r = radius
    y, x = np.ogrid[-r:r+1, -r:r+1]
    return (x*x + y*y <= r*r)

2. 形态学属性(MP)特征构建

形态学属性通过多尺度的开运算(Opening)和闭运算(Closing)提取图像的空间结构特征:

  • 开运算(去除小亮结构):先腐蚀后膨胀
  • 闭运算(填充小暗区域):先膨胀后腐蚀
def build_morphological_profiles(X_pca_img: np.ndarray,
                                 k_components: int = 8,
                                 radii=(1, 3, 5, 7)) -> np.ndarray:
    """
    输入:X_pca_img(H,W,C)。对前k个主成分做多尺度灰度开/闭,构造属性差分通道并拼接。
    """
    H, W, C = X_pca_img.shape
    k = int(min(k_components, C))
    feats = []
    for i in range(k):
        pc = X_pca_img[..., i]  # 取第i个主成分
        for r in radii:  # 多尺度处理
            fp = make_disk(r)  # 生成半径为r的圆形结构元素
            opened = ndi.grey_opening(pc, footprint=fp)  # 灰度开运算
            closed = ndi.grey_closing(pc, footprint=fp)  # 灰度闭运算
            # 存储差分特征:原始-开运算(突出亮结构)、闭运算-原始(突出暗结构)
            feats.append((pc - opened).astype(np.float32, copy=False))
            feats.append((closed - pc).astype(np.float32, copy=False))
    if not feats:  # k=0时直接返回原始PCA特征
        return X_pca_img
    mp_stack = np.stack(feats, axis=-1).astype(np.float32, copy=False)
    # 拼接原始PCA特征与形态学特征
    return np.concatenate([X_pca_img, mp_stack], axis=-1).astype(np.float32, copy=False)

3. 数据集与模型定义

(1)高光谱图像补丁数据集
class HSIPatchDataset(Dataset):
    def __init__(self, patches, labels):
        # 转换为PyTorch张量,通道维度前置(H,W,C→C,H,W)
        self.X = torch.tensor(patches, dtype=torch.float32).permute(0, 3, 1, 2)
        self.y = torch.tensor(labels, dtype=torch.long)
    def __len__(self): return len(self.y)
    def __getitem__(self, idx): return self.X[idx], self.y[idx]
(2)简单CNN模型

采用轻量级CNN架构,适合高光谱图像分类任务:

class SimpleCNN(nn.Module):
    def __init__(self, in_ch, num_classes, width=32):
        super().__init__()
        self.net = nn.Sequential(
            # 第一组卷积:输入通道→32通道
            nn.Conv2d(in_ch, width, 3, padding=1, bias=
深度学习之Encoder-Only原理与实战 【代码】深度学习之Encoder-Only原理与实战。 阅读详情

相关推荐

深度学习之Seq2Seq原理与实战

【代码】深度学习之Seq2Seq原理与实战。

yumiwangzi30的博客 110

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 171

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 217

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 189

深度学习之LSTM原理与实战

【代码】深度学习之LSTM原理与实战。

yumiwangzi30的博客 117

【信息科学与工程学】计算机科学与自动化——第六篇多媒体01 主要参数和算法

参数分类参数名称技术定义典型值范围测量方法优化目标采样参数采样频率每秒采集样本数8-384 kHz设备规格高保真≥48kHz量化参数采样深度每个样本量化位数8-32 bit设备规格高保真≥16bit声道配置声道数量独立音频通道数1-128声道配置参数立体声≥2声道音频格式格式类型音频数据格式PCM, ADPCM, MP3, AAC格式标识按需选择动态范围最大动态范围最大最小声压比40-144 dB声学测试越大越好频率响应频率范围可响应频率范围20-20kHz ±3dB频率扫描20-20kHz平坦信噪比信号噪

weixin_49199313的博客 1340

【信息科学与工程学】【数据科学】第一百八十八篇 线性/非线性泛函分析01

​ 普通数值函数 f:R→R​泛函⬇️最规矩的孩子:线性泛函(面积、加权求和)⬇️大多数自然界的现象:非线性泛函(曲线的能量、弧长)⬇️最光滑好算的:连续/可微泛函(可用欧拉-拉格朗日方程求极值的)⬇️刺头:不连续/奇异泛函(狄拉克 Delta,阶跃)弧长泛函​ — 变分法/几何最速降线泛函(时间泛函)​ — 变分法/经典力学动能-势能差(作用量)泛函​ — 拉格朗日力学Dirichlet能量泛函​ — PDE/位势论/调和函数线性积分泛函(Lebesgue空间上的有界线性泛函)

weixin_49199313的博客 192

在 NVIDIA Orin (JetPack 6.0) 上配置 PyTorch 2.4 + Torchvision 0.19 的完整避坑指南

本文提供在NVIDIA Jetson Orin设备上,基于JetPack 6.0系统配置PyTorch 2.4与Torchvision 0.19环境的完整指南。通过使用Miniconda环境隔离、安装特定版本PyTorch夜间构建版、编译匹配的Torchvision源码等步骤,解决版本不匹配、CUDA支持等常见问题,确保AI开发环境稳定可用。

weixin_29179311的博客 363

告别CMake依赖!在Visual Studio 2022中直接配置VTK 9.4开发环境(附完整项目示例)

本文详细介绍了如何在Visual Studio 2022中直接配置VTK 9.4开发环境,无需依赖CMake。通过图文教程和完整项目示例,帮助C++开发者快速集成VTK库,简化开发流程,提升工作效率。特别适合科学可视化任务的开发者。

weixin_26804345的博客 414

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 401

ABAP传输自定义IDOC实例

首先确定出站方和入站方,本例中我使用150作为发送方将200作为接收方。 发送端系统配置 进入tcode-SALE,点击定义逻辑系统,这里我定义D01CLNT150为发送端, D01CLNT200为接收端 2,将逻辑系统分配给对应的client 3,进入tcode-WE31,创建IDOC开发段(segment)这里可以按照实际需求创建想要传输的结构,为求简单我创建了ZKNA1并选取了几个客户主数据的字段作为示例 4,进入tcode-WE30,创建Idoc Ty...

Nathan的博客 4076

爬虫瑞数5案例:联通

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。

老衲爱洗头的博客 4469

EMC诊断技术及电磁兼容理论设计

本文深入探讨了EMC诊断技术,重点在于滤波篇,详细讲解了EMI滤波器的设计、选型、测试及应用注意事项。内容涵盖噪声限值法规、滤波器的法规依据、插入损耗测试以及滤波电容的高频特性。同时,还阐述了噪声源的近场与远场特性,如何快速定位和抑制噪声。通过实例分析,提供了滤波器件和辐射噪声抑制器件的选型策略。

让你爱上电路设计 2161

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 175

Wazuh部署记录

Wazuh是一个免费的开源安全平台,统一了XDR和SIEM功能。它可以保护内部部署、虚拟化、容器化和基于云的环境中的工作负载。Wazuh帮助组织和个人保护其数据资产免受安全威胁。它被全球数千个组织广泛使用,从小型企业到大型企业。443:仪表盘界面访问端口1515:探针连接服务器端口1514:探针回传信息端口以上3个端口必须打开防火墙。

墨痕诉清风的博客 1554

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 深度学习与遥感入门(六)|轻量化 MobileNetV2 高光谱分类
下一篇: 遥感&机器学习入门实战教程 | Sklearn 案例②:PCA + k-NN 分类与评估
遥感AI实战
博客等级 码龄9年 1002粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值