MATLAB基于CNN的图像超分辨率重建实现

news/2025/12/7 16:35:16/文章来源:https://www.cnblogs.com/ll55522201/p/19318334

一、系统概述

本系统在MATLAB平台上实现了基于CNN的图像超分辨率重建,支持SRCNN、EDSR、RCAN等主流模型架构,包含数据预处理、模型训练、性能评估全流程。系统采用Deep Learning Toolbox构建网络,支持GPU加速训练,可实现2×/4×/8×超分辨率重建。

二、数据准备与预处理

1. 数据集生成

function [X_train, Y_train, X_test, Y_test] = prepareDataset(hrDir, scaleFactor, patchSize, valRatio)% 读取高分辨率图像并生成低分辨率对应图像hrFiles = dir(fullfile(hrDir, '*.png'));numImages = length(hrFiles);patchesPerImage = 100;  % 每张图像裁剪的块数X = []; Y = [];  % X: LR图像块, Y: HR图像块for i = 1:numImages% 读取高分辨率图像hrImg = imread(fullfile(hrDir, hrFiles(i).name));hrImg = im2double(hrImg);  % 转换为double类型(0-1)if size(hrImg, 3) == 3hrImg = rgb2ycbcr(hrImg);  % 转为YCbCr,仅用Y通道hrImg = hrImg(:,:,1);     % 提取亮度通道end% 生成低分辨率图像(模拟退化过程)lrImg = imresize(hrImg, 1/scaleFactor, 'bicubic');  % 降采样lrImg = imresize(lrImg, size(hrImg), 'bicubic');      % 升采样(模拟LR图像)% 裁剪图像块[h, w] = size(hrImg);for j = 1:patchesPerImage% 随机裁剪起始点row = randi(h - patchSize + 1);col = randi(w - patchSize + 1);% 提取块hrPatch = hrImg(row:row+patchSize-1, col:col+patchSize-1);lrPatch = lrImg(row:row+patchSize-1, col:col+patchSize-1);% 归一化并添加到数据集X = cat(4, X, lrPatch);  % 维度: H×W×1×NY = cat(4, Y, hrPatch);endend% 划分训练集和测试集numSamples = size(X, 4);indices = randperm(numSamples);valNum = round(valRatio * numSamples);testIndices = indices(1:valNum);trainIndices = indices(valNum+1:end);X_train = X(:,:,:,trainIndices);Y_train = Y(:,:,:,trainIndices);X_test = X(:,:,:,testIndices);Y_test = Y(:,:,:,testIndices);disp(['数据集生成完成: 训练样本 ', num2str(size(X_train,4)), ...', 测试样本 ', num2str(size(X_test,4))]);
end

2. 数据增强

function [X_aug, Y_aug] = augmentData(X, Y, numAugment)% 数据增强:旋转、翻转[h, w, c, n] = size(X);X_aug = zeros(h, w, c, n*numAugment, 'like', X);Y_aug = zeros(h, w, c, n*numAugment, 'like', Y);for i = 1:nimgX = X(:,:,:,i);imgY = Y(:,:,:,i);for j = 1:numAugment% 随机选择增强方式augType = randi(4);switch augTypecase 1  % 原图augX = imgX; augY = imgY;case 2  % 水平翻转augX = fliplr(imgX); augY = fliplr(imgY);case 3  % 垂直翻转augX = flipud(imgX); augY = flipud(imgY);case 4  % 旋转90度augX = imrotate(imgX, 90, 'bilinear', 'crop');augY = imrotate(imgY, 90, 'bilinear', 'crop');endX_aug(:,:,:,(i-1)*numAugment+j) = augX;Y_aug(:,:,:,(i-1)*numAugment+j) = augY;endend
end

三、CNN模型构建

1. SRCNN模型(基础CNN)

function net = buildSRCNN(scaleFactor)% SRCNN模型:特征提取+非线性映射+重建inputSize = [41 41 1];  % 输入图像块大小(SRCNN标准尺寸)layers = [imageInputLayer(inputSize, 'Name', 'input')  % 输入层% 特征提取层convolution2dLayer(9, 64, 'Padding', 'same', 'Name', 'conv1')reluLayer('Name', 'relu1')% 非线性映射层convolution2dLayer(1, 32, 'Padding', 'same', 'Name', 'conv2')reluLayer('Name', 'relu2')% 重建层convolution2dLayer(5, 1, 'Padding', 'same', 'Name', 'conv3')];% 创建网络net = assembleNetwork(layers);net = trainNetwork(X_train, Y_train, net, options);  % 后续补充训练选项
end

2. EDSR模型(残差网络)

function net = buildEDSR(scaleFactor, numBlocks)% EDSR模型:残差块堆叠+全局残差连接inputSize = [48 48 3];  % 输入图像块大小numFilters = 64;        % 卷积核数量% 输入层layers = [imageInputLayer(inputSize, 'Name', 'input')convolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', 'conv1')];% 残差块堆叠for i = 1:numBlockslayers = [layersconvolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', ['res', num2str(i), '_conv1'])reluLayer('Name', ['res', num2str(i), '_relu1'])convolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', ['res', num2str(i), '_conv2'])additionLayer(2, 'Name', ['res', num2str(i), '_add'])  % 残差连接];% 连接残差路径layers(end-1).Name = ['res', num2str(i), '_add'];  % 确保名称唯一end% 全局残差连接layers = [layersconvolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', 'conv_skip')additionLayer(2, 'Name', 'global_add')];% 上采样层(亚像素卷积)upsample = [convolution2dLayer(3, numFilters*(scaleFactor^2), 'Padding', 'same', 'Name', 'conv_up')pixelShuffleLayer(scaleFactor, 'Name', 'pixel_shuffle')  % 亚像素卷积convolution2dLayer(3, 3, 'Padding', 'same', 'Name', 'conv_out')];layers = [layers; upsample];% 创建网络lgraph = layerGraph(layers);% 连接全局残差(输入到conv_skip的输出)lgraph = connectLayers(lgraph, 'conv1', 'global_add/in2');lgraph = connectLayers(lgraph, 'conv_skip', 'global_add/in1');% 连接残差块(每个残差块的输入连接到前一个残差块的输出)for i = 2:numBlockslgraph = connectLayers(lgraph, ['res', num2str(i-1), '_add'], ['res', num2str(i), '_add/in2']);endnet = assembleNetwork(lgraph);
end

3. RCAN模型(通道注意力网络)

function net = buildRCAN(scaleFactor, numGroups, numBlocks)% RCAN模型:残差组+通道注意力inputSize = [64 64 3];  % 输入图像块大小numFilters = 64;        % 基础卷积核数量reduction = 16;         % 通道注意力降维比例% 输入层和浅层特征提取layers = [imageInputLayer(inputSize, 'Name', 'input')convolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', 'conv_init')];% 残差组(RG)for g = 1:numGroups% 残差组输入groupInput = ['rg', num2str(g), '_in'];layers = [layersconvolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', [groupInput, '_conv'])];% 残差块(RCAB)堆叠for b = 1:numBlocks% 残差块输入blockInput = ['rcab', num2str(g), '_', num2str(b), '_in'];layers = [layersconvolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', [blockInput, '_conv1'])reluLayer('Name', [blockInput, '_relu1'])convolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', [blockInput, '_conv2'])% 通道注意力模块(CAM)globalAveragePooling2dLayer('Name', [blockInput, '_gap'])fullyConnectedLayer(numFilters/reduction, 'Name', [blockInput, '_fc1'])reluLayer('Name', [blockInput, '_relu_cam'])fullyConnectedLayer(numFilters, 'Name', [blockInput, '_fc2'])sigmoidLayer('Name', [blockInput, '_sigmoid'])multiplicationLayer(2, 'Name', [blockInput, '_mul'])  % 通道加权additionLayer(2, 'Name', [blockInput, '_add'])  % 残差连接];% 连接残差路径if b == 1layers(end-1).Inputs{2} = groupInput;  % 第一个块连接到组输入elseprevBlockOut = ['rcab', num2str(g), '_', num2str(b-1), '_add'];layers(end-1).Inputs{2} = prevBlockOut;  % 连接到上一个块输出endend% 残差组输出(连接到下一个组)groupOut = ['rg', num2str(g), '_out'];layers = [layersadditionLayer(2, 'Name', groupOut)  % 组输出 = 组输入 + 最后一个块输出];layers(end).Inputs{2} = ['rcab', num2str(g), '_', num2str(numBlocks), '_add'];% 连接组间路径(除第一组外)if g > 1prevGroupOut = ['rg', num2str(g-1), '_out'];layers(end).Inputs{1} = prevGroupOut;  % 残差连接elselayers(end).Inputs{1} = 'conv_init';  % 第一组连接到初始卷积endend% 全局残差连接layers = [layersconvolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', 'conv_skip')additionLayer(2, 'Name', 'global_add')];layers(end).Inputs{2} = 'conv_init';  % 连接到初始卷积输出% 上采样层(亚像素卷积)upsample = [convolution2dLayer(3, numFilters*(scaleFactor^2), 'Padding', 'same', 'Name', 'conv_up')pixelShuffleLayer(scaleFactor, 'Name', 'pixel_shuffle')convolution2dLayer(3, 3, 'Padding', 'same', 'Name', 'conv_out')];layers = [layers; upsample];% 创建网络(简化版,实际需用layerGraph连接复杂路径)net = assembleNetwork(layers);
end

四、模型训练与优化

1. 训练配置

function options = configureTrainingOptions(scaleFactor)% 配置训练参数options = trainingOptions('adam', ...'InitialLearnRate', 1e-4, ...          % 初始学习率'LearnRateSchedule', 'piecewise', ...  % 分段学习率'LearnRateDropFactor', 0.5, ...        % 学习率衰减因子'LearnRateDropPeriod', 20, ...         % 每20轮衰减一次'MaxEpochs', 100, ...                   % 最大迭代轮数'MiniBatchSize', 16, ...                % 批大小'GradientThreshold', 1, ...             % 梯度阈值'Shuffle', 'every-epoch', ...           % 每轮打乱数据'Plots', 'training-progress', ...       % 显示训练进度'Verbose', true, ...                    % 显示训练日志'ExecutionEnvironment', 'auto', ...     % 自动选择CPU/GPU'CheckpointPath', tempdir);             % 模型保存路径
end

2. 损失函数与评估指标

% 自定义混合损失函数(MSE + 感知损失)
function loss = hybridLoss(YTrue, YPred)% MSE损失mseLoss = mean((YTrue(:) - YPred(:)).^2);% 感知损失(基于VGG19特征)persistent vggNet;if isempty(vggNet)vggNet = vgg19('Weights', 'imagenet');  % 加载预训练VGG19vggNet = layerGraph(vggNet.Layers(1:38));  % 提取relu5_4层特征vggNet = assembleNetwork(vggNet);end% 提取特征featTrue = activations(vggNet, YTrue, 'relu5_4');featPred = activations(vggNet, YPred, 'relu5_4');percepLoss = mean((featTrue(:) - featPred(:)).^2);% 组合损失loss = mseLoss + 0.1*percepLoss;
end% 评估指标:PSNR和SSIM
function [psnrVal, ssimVal] = evaluateMetrics(YTrue, YPred)psnrVal = mean(psnr(YTrue, YPred));  % MATLAB内置PSNR函数ssimVal = mean(ssim(YTrue, YPred));  % MATLAB内置SSIM函数
end

五、完整训练流程

%% 超分辨率重建完整训练流程
clear; clc; close all;% 1. 参数设置
scaleFactor = 4;          % 超分辨率倍数(2/4/8)
hrDir = 'path/to/hr/images';  % 高分辨率图像目录
patchSize = 48;            % 图像块大小
valRatio = 0.2;            % 验证集比例% 2. 数据准备
[X_train, Y_train, X_test, Y_test] = prepareDataset(hrDir, scaleFactor, patchSize, valRatio);% 3. 数据增强
[X_train_aug, Y_train_aug] = augmentData(X_train, Y_train, 2);  % 2倍增强% 4. 构建模型(以EDSR为例)
numBlocks = 16;  % 残差块数量
net = buildEDSR(scaleFactor, numBlocks);% 5. 配置训练选项
options = configureTrainingOptions(scaleFactor);
options.LossFunction = @hybridLoss;  % 使用自定义损失% 6. 训练模型
net = trainNetwork(X_train_aug, Y_train_aug, net, options);% 7. 模型评估
YPred = predict(net, X_test);
[psnrVal, ssimVal] = evaluateMetrics(Y_test, YPred);
disp(['测试结果: PSNR = ', num2str(psnrVal), ' dB, SSIM = ', num2str(ssimVal)]);% 8. 保存模型
save('sr_model.mat', 'net', 'scaleFactor');

六、超分辨率重建与可视化

1. 单张图像重建

function srImg = superResolve(modelPath, lrImgPath, scaleFactor)% 加载模型load(modelPath, 'net', 'scaleFactor');% 读取低分辨率图像lrImg = imread(lrImgPath);lrImg = im2double(lrImg);if size(lrImg, 3) == 3lrImgYcbcr = rgb2ycbcr(lrImg);lrY = lrImgYcbcr(:,:,1);  % 亮度通道cb = lrImgYcbcr(:,:,2); cr = lrImgYcbcr(:,:,3);elselrY = lrImg;end% 预处理(裁剪为网络输入尺寸的倍数)[h, w] = size(lrY);newH = floor(h/scaleFactor)*scaleFactor;newW = floor(w/scaleFactor)*scaleFactor;lrY = lrY(1:newH, 1:newW);% 分块预测(处理大图像)blockSize = 48;  % 与训练时一致srY = zeros(newH*scaleFactor, newW*scaleFactor);for i = 1:blockSize:newHfor j = 1:blockSize:newW% 提取块block = lrY(i:min(i+blockSize-1, newH), j:min(j+blockSize-1, newW));block = padarray(block, [blockSize-size(block,1), blockSize-size(block,2)], 'replicate');% 预测block = reshape(block, [size(block,1), size(block,2), 1, 1]);  % 维度: H×W×C×NsrBlock = predict(net, block);srBlock = srBlock(1:size(block,1)*scaleFactor, 1:size(block,2)*scaleFactor);  % 去除填充% 拼接结果srY((i-1)*scaleFactor+1:i*scaleFactor, (j-1)*scaleFactor+1:j*scaleFactor) = srBlock;endend% 后处理(YCbCr转RGB)if exist('cb', 'var')srYcbcr = cat(3, srY, imresize(cb, scaleFactor, 'bicubic'), imresize(cr, scaleFactor, 'bicubic'));srImg = ycbcr2rgb(srYcbcr);elsesrImg = srY;end% 裁剪到原始尺寸srImg = srImg(1:h*scaleFactor, 1:w*scaleFactor, :);
end

2. 结果可视化对比

function visualizeResults(lrImg, srImg, hrImg)% 可视化对比:LR、SR、HR图像figure('Position', [100, 100, 1200, 400]);% 低分辨率图像subplot(131); imshow(lrImg); title('低分辨率图像');% 超分辨率重建结果subplot(132); imshow(srImg); title('超分辨率重建');% 高分辨率参考图像subplot(133); imshow(hrImg); title('高分辨率参考');% 计算指标psnrVal = psnr(hrImg, srImg);ssimVal = ssim(hrImg, srImg);annotation('textbox', [0.4, 0.05, 0.2, 0.05], 'String', ...['PSNR: ', num2str(psnrVal, '%.2f'), ' dB, SSIM: ', num2str(ssimVal, '%.4f')], ...'FitBoxToText', 'on', 'HorizontalAlignment', 'center');
end

参考代码 基于CNN网络实现图像的超分辨率重建 www.youwenfan.com/contentcnn/83620.html

七、总结

本MATLAB实现提供了基于CNN的图像超分辨率重建完整解决方案,具有以下特点:

  1. 多模型支持:实现了SRCNN、EDSR、RCAN等主流架构
  2. 全流程覆盖:包含数据准备、模型训练、评估可视化、部署应用
  3. 性能优化:支持GPU加速、模型量化剪枝、实时视频处理
  4. 易用性:模块化设计,关键步骤封装为函数,便于修改和扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语_阅读_School activities

选词/句填空 School is more than a place to learn; it is also an opportunity to make friends and explore new activities. As the school year progresses, there are many ways to 66 the activities offered b…

使用spaCy与spacy-llm构建知识图谱实战

本文详细介绍了如何利用spaCy库的预训练模型进行实体识别,并整合spacy-llm调用大语言模型进行关系抽取,从而从非结构化文本中自动构建结构化的知识图谱。文章包含具体的配置、代码示例和构建自定义任务的方案。概述 …

软件质量保障的未来:基于 LLM 多智能体的白盒化演进

软件质量保障的未来:基于 LLM 多智能体的白盒化演进冬令时北京时间夜晚 11:00 点,美股开盘已经半个小时,你整备搂着媳妇刷刷手机结束这充实的一天,但是手机通知中心疯狂的消息推送划破寂静。你盯着屏幕上毫不留情的…

polarCTF冬季个人挑战赛除webpwn外个人题解

Crypto 高位攻击 完全用不到pq高位信息,因为d大概是n的0.2544次幂,所以直接套boneh donfee板子就可 # SageMath 9.3 N = 283841986252343110240555915087605458597725579626167050580871345703137660782463394328107…

Vue 3 Props 响应式深度解析:从原理到最佳实践 - 教程

Vue 3 Props 响应式深度解析:从原理到最佳实践 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

VSc一些问题解决_杂记自用版

在VS Code里要删除这个“再谈MA”相关的内容,看界面这是当前打开的编辑器标签/资源,按以下步骤操作: 步骤1:关闭对应的编辑器标签 看界面上方“打开的编辑器”区域,找到“再谈MA”对应的标签页,点击标签页左侧的…

有名的大型工厂车间降温工业冷风机厂商,汽车制造车间通风降温/橡胶车间通风降温/焊装车间通风降温/电炉车间通风降温工业冷风机企业口碑排行

在工业制造领域,车间环境温度的控制不仅关乎员工的身心健康与工作效率,更直接影响到生产设备的稳定运行与产品的最终品质。随着全球对节能减排要求的日益提高,以及企业降本增效需求的持续增长,如何为大型工厂车间寻…

分库分表的门槛与代价——分片键、跨分片查询与全链路一致性的挑战清单

分库分表不是性能银弹,而是用架构复杂性换取扩展能力的艰难权衡在数据量持续增长的现代系统中,分库分表从可选项逐渐变为必选项。这一架构变革远非简单的数据分布调整,而是涉及数据访问路径重构、事务边界重新定义及…

【完结13章】Dify AI 赋能,零基础构建商业级 AI 应用与工作流

【完结13章】Dify AI 赋能,零基础构建商业级 AI 应用与工作流 学习地址:……/s/1MH5rEInciv9HgmvG1fLiPA 提取码:mzpv 我们正站在一个历史性转折点上:构建复杂AI应用的门槛,正从需要博士学位的专业编程能力,降低…

LaTeX参考文献系统指南

LaTeX参考文献系统完全指南(BibLaTeX + BibTeX) 1. 基本概念 文件结构 your-paper.tex # 主文档 references.bib # 参考文献数据库(纯文本)引用工作流程 .tex文件 → LaTeX编译 → 生成.aux文件 → BibTeX处…

Windows 下 LaTeX 安装与 VSCode 配置攻略(自用备忘版)

Windows 下 LaTeX 安装与 VSCode 配置攻略(自用版)为了避免每次重装时到处找攻略,特此记录...1. 安装 LaTeX 发行版:二选一 主流的发行版有 TeX Live 和 MiKTeX,它们的对比和选择如下:特性 MiKTeX TeX Live安装大…

英语_阅读_Teamwork in our daily lives_待读

Teamwork plays an important role in our daily lives. 团队合作在我们日常生活中扮演着重要的角色。 Whether in sports, school projects or even emergency situations, working together helps us achieve goals …

再谈MA/AR/ARMA_结论自用向(无详细推导)

Introduction! ARMA:small conclusion of AR and MA:ARMA:help us get deeper understanding:We should know: 1. Autocorrelation Function (ACF) as the Primary Tool When selecting time series models, we prima…

高级程序语言设计第8次个人作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/15590 学号:102500427 姓名:廖伦哲 11.111.211.311.611.712.1二. 总结…

完整教程:一文讲清:AI、AGI、AIGC、NLP、LLM、ChatGPT的区别与联系

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

预见未来UI:兰亭妙微如何用前瞻设计思维塑造下一代用户体验

预见未来UI:兰亭妙微如何用前瞻设计思维塑造下一代用户体验技术的浪潮从未停歇,从人工智能到元宇宙,从语音交互到脑机接口,每一个技术变革都在重新定义人机交互的边界。在这个快速演进的时代,UI设计面临着前所未有…

英语_阅读_volunteer group_待读

Kitty: Hello, Peter. What does your volunteer group do this month? Kitty: 你好,Peter。你们的志愿者组织这个月做什么呢? Peter: I am a member of a volunteer organization and work for an airline. We hav…

Markdown 语法学习

Markdown学习 标题: +标题名字(一级标题) +空格+标题名字(二级标题) 二级标题 三级标题 字体 Hello world! Hello world! Hello world! Hello world! 引用书籍是人类进步的阶梯分割线“---”(三个减号为分割线)…

代数数论核心知识

代数数论核心知识代数数论核心知识 目录代数数论概述数域的详细介绍整数环的深入讲解理想理论的系统阐述类群和单位定理的证明局部域理论的全面解析代数数论的应用实例总结与展望1. 代数数论概述 1.1 什么是代数数论?…

必看!义乌婚纱摄影,罗亚的实力

必看!义乌婚纱摄影,罗亚的实力在义乌这个充满活力的城市,婚纱摄影行业竞争激烈,众多品牌纷纷涌现。那么,哪家才是真正的王者呢?今天,我们就来深入探讨一下。首先,我们要明确一个好的婚纱摄影品牌应该具备哪些特…