基于形态学的权重自适应图像去噪的MATLAB实现

news/2025/10/11 11:48:01/文章来源:https://www.cnblogs.com/qz85784989/p/19134690
classdef MorphologicalAdaptiveDenoising% 基于形态学的权重自适应图像去噪类% 支持灰度图像和彩色图像的去噪propertiesstructuring_elementsalphabetaiterationsendmethodsfunction obj = MorphologicalAdaptiveDenoising(varargin)% 构造函数p = inputParser;addParameter(p, 'alpha', 0.7, @(x) x>0 && x<=1);addParameter(p, 'beta', 0.3, @(x) x>0 && x<=1);addParameter(p, 'iterations', 2, @(x) x>0);parse(p, varargin{:});obj.alpha = p.Results.alpha;obj.beta = p.Results.beta;obj.iterations = p.Results.iterations;% 初始化结构元素obj.structuring_elements.small = strel('square', 3);obj.structuring_elements.medium = strel('square', 5);obj.structuring_elements.large = strel('square', 7);endfunction denoised_image = denoise(obj, image, varargin)% 主去噪函数p = inputParser;addParameter(p, 'method', 'adaptive', @ischar);addParameter(p, 'noise_level', 'medium', @ischar);parse(p, varargin{:});if ndims(image) == 3% 彩色图像处理 - 分别处理每个通道denoised_image = zeros(size(image));for channel = 1:3switch p.Results.methodcase 'adaptive'denoised_image(:,:,channel) = ...obj.weighted_morphological_denoising(...image(:,:,channel));case 'advanced'denoised_image(:,:,channel) = ...obj.advanced_morphological_denoising(...image(:,:,channel), p.Results.noise_level);endendelse% 灰度图像处理switch p.Results.methodcase 'adaptive'denoised_image = obj.weighted_morphological_denoising(image);case 'advanced'denoised_image = obj.advanced_morphological_denoising(...image, p.Results.noise_level);endenddenoised_image = uint8(denoised_image);endfunction local_variance = calculate_local_variance(obj, image, window_size)% 计算局部方差if nargin < 3window_size = 5;endif ~isfloat(image)image = im2double(image);end% 使用积分图像加速计算padded_image = padarray(image, [window_size, window_size]/2, 'replicate');squared_image = padded_image .^ 2;% 计算均值和平方均值mean_filter = ones(window_size) / (window_size^2);local_mean = imfilter(padded_image, mean_filter, 'same');local_mean_sq = imfilter(squared_image, mean_filter, 'same');% 计算方差: Var = E[X^2] - (E[X])^2local_variance = local_mean_sq - local_mean .^ 2;% 去除填充pad = floor(window_size/2);local_variance = local_variance(pad+1:end-pad, pad+1:end-pad);endfunction gradient_mag = calculate_gradient_magnitude(obj, image)% 计算梯度幅值if ~isfloat(image)image = im2double(image);end% Sobel算子sobel_x = fspecial('sobel');sobel_y = sobel_x';grad_x = imfilter(image, sobel_x, 'replicate');grad_y = imfilter(image, sobel_y, 'replicate');gradient_mag = sqrt(grad_x.^2 + grad_y.^2);% 归一化if max(gradient_mag(:)) > 0gradient_mag = gradient_mag / max(gradient_mag(:));endendfunction weights = adaptive_weight_calculation(obj, image)% 计算自适应权重if ~isfloat(image)image = im2double(image);end% 计算局部特征local_var = obj.calculate_local_variance(image);gradient_mag = obj.calculate_gradient_magnitude(image);% 归一化local_var_norm = (local_var - min(local_var(:))) / ...(max(local_var(:)) - min(local_var(:)) + eps);gradient_norm = (gradient_mag - min(gradient_mag(:))) / ...(max(gradient_mag(:)) - min(gradient_mag(:)) + eps);% 计算权重:细节区域权重小,平坦区域权重大weights = 1.0 ./ (1.0 + obj.alpha * local_var_norm + obj.beta * gradient_norm);endfunction results = morphological_operations(obj, image, se_type)% 执行多种形态学操作switch se_typecase 'small'se = obj.structuring_elements.small;case 'medium'se = obj.structuring_elements.medium;case 'large'se = obj.structuring_elements.large;endresults.opening = imopen(image, se);results.closing = imclose(image, se);results.gradient = imdilate(image, se) - imerode(image, se);results.top_hat = imtophat(image, se);results.black_hat = imbothat(image, se);endfunction denoised_image = weighted_morphological_denoising(obj, image)% 权重自适应形态学去噪if ~isfloat(image)image = im2double(image);enddenoised = image;for iter = 1:obj.iterations% 计算自适应权重weights = obj.adaptive_weight_calculation(denoised);% 转换到uint8进行形态学操作denoised_uint8 = im2uint8(denoised);% 多尺度形态学操作results_small = obj.morphological_operations(denoised_uint8, 'small');results_medium = obj.morphological_operations(denoised_uint8, 'medium');results_large = obj.morphological_operations(denoised_uint8, 'large');% 转换回doublefield_names = fieldnames(results_small);for i = 1:length(field_names)field = field_names{i};results_small.(field) = im2double(results_small.(field));results_medium.(field) = im2double(results_medium.(field));results_large.(field) = im2double(results_large.(field));end% 权重融合weighted_result = zeros(size(denoised));% 根据权重分类区域mask_high_weight = weights > 0.7;      % 平坦区域mask_medium_weight = weights >= 0.3 & weights <= 0.7; % 过渡区域mask_low_weight = weights < 0.3;       % 细节区域% 平坦区域:使用大结构元素weighted_result(mask_high_weight) = ...0.6 * results_large.opening(mask_high_weight) + ...0.4 * results_large.closing(mask_high_weight);% 过渡区域:使用中等结构元素weighted_result(mask_medium_weight) = ...0.4 * results_medium.opening(mask_medium_weight) + ...0.4 * results_medium.closing(mask_medium_weight) + ...0.2 * results_small.gradient(mask_medium_weight);% 细节区域:使用小结构元素,保留原始细节weighted_result(mask_low_weight) = ...0.5 * results_small.opening(mask_low_weight) + ...0.3 * results_small.closing(mask_low_weight) + ...0.2 * denoised(mask_low_weight);denoised = weighted_result;enddenoised_image = denoised;endfunction denoised_image = advanced_morphological_denoising(obj, image, noise_level)% 增强版形态学去噪if nargin < 3noise_level = 'medium';endif ~isfloat(image)image = im2double(image);end% 根据噪声水平调整参数switch noise_levelcase 'low'iter = 1;alpha_temp = 0.5;beta_temp = 0.2;case 'medium'iter = 2;alpha_temp = 0.7;beta_temp = 0.3;case 'high'iter = 3;alpha_temp = 0.9;beta_temp = 0.4;end% 临时修改参数original_alpha = obj.alpha;original_beta = obj.beta;obj.alpha = alpha_temp;obj.beta = beta_temp;% 形态学重建reconstructed = obj.morphological_reconstruction_denoising(image, iter);% 权重计算和最终融合weights = obj.adaptive_weight_calculation(reconstructed);denoised_image = obj.final_fusion(image, reconstructed, weights);% 恢复原始参数obj.alpha = original_alpha;obj.beta = original_beta;endfunction reconstructed = morphological_reconstruction_denoising(obj, image, iterations)% 形态学重建去噪marker = image;for i = 1:iterations% 交替开闭运算opening = imopen(marker, obj.structuring_elements.small);closing = imclose(marker, obj.structuring_elements.small);% 重建操作marker = imclose(opening, obj.structuring_elements.medium);marker = imopen(closing, obj.structuring_elements.medium);endreconstructed = marker;endfunction fused = final_fusion(obj, original, denoised, weights)% 最终结果融合if ~isfloat(original)original = im2double(original);endif ~isfloat(denoised)denoised = im2double(denoised);end% 计算边缘保护系数gradient_original = obj.calculate_gradient_magnitude(original);edge_preserve = exp(-gradient_original * 5);% 融合fused = edge_preserve .* original + (1 - edge_preserve) .* denoised;endendmethods (Static)function noisy_image = add_noise(original_image, noise_type, varargin)% 添加噪声switch noise_typecase 'gaussian'p = inputParser;addOptional(p, 'sigma', 25, @isnumeric);parse(p, varargin{:});sigma = p.Results.sigma / 255;noise = sigma * randn(size(original_image));noisy_image = im2double(original_image) + noise;noisy_image = im2uint8(noisy_image);case 'salt_pepper'p = inputParser;addOptional(p, 'density', 0.05, @isnumeric);parse(p, varargin{:});noisy_image = imnoise(original_image, 'salt & pepper', p.Results.density);case 'poisson'noisy_image = imnoise(original_image, 'poisson');endendfunction psnr_value = calculate_psnr(original, denoised)% 计算PSNRif ~isfloat(original)original = im2double(original);endif ~isfloat(denoised)denoised = im2double(denoised);endmse_value = mean((original(:) - denoised(:)) .^ 2);if mse_value == 0psnr_value = inf;elsepsnr_value = 20 * log10(1 / sqrt(mse_value));endendfunction ssim_value = calculate_ssim(original, denoised)% 计算SSIMssim_value = ssim(denoised, original);endend
end% 演示函数
function demonstrate_morphological_denoising()% 演示形态学去噪效果% 创建测试图像original = create_test_image();% 添加噪声noisy = MorphologicalAdaptiveDenoising.add_noise(original, 'gaussian', 30);% 创建去噪器denoiser = MorphologicalAdaptiveDenoising('alpha', 0.7, 'beta', 0.3, 'iterations', 2);% 执行去噪tic;denoised_basic = denoiser.denoise(noisy, 'method', 'adaptive');time_basic = toc;tic;denoised_advanced = denoiser.denoise(noisy, 'method', 'advanced', 'noise_level', 'medium');time_advanced = toc;% 计算指标psnr_noisy = MorphologicalAdaptiveDenoising.calculate_psnr(original, noisy);psnr_basic = MorphologicalAdaptiveDenoising.calculate_psnr(original, denoised_basic);psnr_advanced = MorphologicalAdaptiveDenoising.calculate_psnr(original, denoised_advanced);ssim_noisy = MorphologicalAdaptiveDenoising.calculate_ssim(original, noisy);ssim_basic = MorphologicalAdaptiveDenoising.calculate_ssim(original, denoised_basic);ssim_advanced = MorphologicalAdaptiveDenoising.calculate_ssim(original, denoised_advanced);% 显示结果figure('Position', [100, 100, 1200, 800]);subplot(2, 3, 1);imshow(original);title('原始图像');subplot(2, 3, 2);imshow(noisy);title(['加噪图像 - PSNR: ', num2str(psnr_noisy, '%.2f'), ' dB, SSIM: ', num2str(ssim_noisy, '%.3f')]);subplot(2, 3, 3);imshow(denoised_basic);title(['基本去噪 - PSNR: ', num2str(psnr_basic, '%.2f'), ' dB, SSIM: ', num2str(ssim_basic, '%.3f'), ...' (', num2str(time_basic, '%.2f'), 's)']);subplot(2, 3, 4);imshow(denoised_advanced);title(['增强去噪 - PSNR: ', num2str(psnr_advanced, '%.2f'), ' dB, SSIM: ', num2str(ssim_advanced, '%.3f'), ...' (', num2str(time_advanced, '%.2f'), 's)']);% 显示权重图weights = denoiser.adaptive_weight_calculation(noisy);subplot(2, 3, 5);imshow(weights, []);title('自适应权重图');colorbar;% 显示局部方差local_var = denoiser.calculate_local_variance(noisy);subplot(2, 3, 6);imshow(local_var, []);title('局部方差图');colorbar;fprintf('去噪结果对比:\n');fprintf('噪声图像 - PSNR: %.2f dB, SSIM: %.3f\n', psnr_noisy, ssim_noisy);fprintf('基本去噪 - PSNR: %.2f dB, SSIM: %.3f, 时间: %.2fs\n', psnr_basic, ssim_basic, time_basic);fprintf('增强去噪 - PSNR: %.2f dB, SSIM: %.3f, 时间: %.2fs\n', psnr_advanced, ssim_advanced, time_advanced);
endfunction test_image = create_test_image()% 创建测试图像% 方法1: 使用内置图像% test_image = imread('cameraman.tif');% 方法2: 创建合成测试图像test_image = 128 * ones(256, 256, 'uint8');% 添加几何形状test_image(50:100, 50:100) = 200;  % 亮方块test_image(150:200, 150:200) = 60; % 暗方块% 添加纹理[x, y] = meshgrid(1:256, 1:256);texture = uint8(50 * sin(x/10) .* cos(y/10) + 128);test_image = test_image + texture;% 添加边缘test_image(100:110, :) = 0;  % 水平线test_image(:, 100:110) = 0;  % 垂直线test_image = uint8(test_image);
end% 批量处理函数
function batch_denoising_test()% 批量测试不同噪声水平的去噪效果original = create_test_image();noise_levels = [15, 25, 50];methods = {'adaptive', 'advanced'};results = cell(length(noise_levels), length(methods));figure('Position', [50, 50, 1500, 600]);for i = 1:length(noise_levels)noise_sigma = noise_levels(i);noisy = MorphologicalAdaptiveDenoising.add_noise(original, 'gaussian', noise_sigma);subplot(3, 4, (i-1)*4 + 1);imshow(original);title('原始图像');subplot(3, 4, (i-1)*4 + 2);imshow(noisy);title(['噪声图像 (σ=', num2str(noise_sigma), ')']);for j = 1:length(methods)denoiser = MorphologicalAdaptiveDenoising();denoised = denoiser.denoise(noisy, 'method', methods{j});subplot(3, 4, (i-1)*4 + 2 + j);imshow(denoised);psnr_val = MorphologicalAdaptiveDenoising.calculate_psnr(original, denoised);ssim_val = MorphologicalAdaptiveDenoising.calculate_ssim(original, denoised);title([methods{j}, ' - PSNR: ', num2str(psnr_val, '%.2f'), ...', SSIM: ', num2str(ssim_val, '%.3f')]);results{i, j} = denoised;endend
end% 使用示例
% demonstrate_morphological_denoising();
% batch_denoising_test();

这个MATLAB实现包含了以下主要特性:

功能

  1. 自适应权重计算

    • 基于局部方差和梯度幅值
    • 自动识别平坦区域和细节区域
  2. 多尺度形态学操作

    • 小、中、大三种结构元素
    • 开运算、闭运算、梯度等操作
  3. 权重融合策略

    • 平坦区域:使用大结构元素
    • 细节区域:使用小结构元素
    • 过渡区域:中等结构元素
  4. 增强版算法

    • 形态学重建
    • 边缘保护融合

使用

% 基本使用
denoiser = MorphologicalAdaptiveDenoising();
denoised_image = denoiser.denoise(noisy_image);% 高级选项
denoised_image = denoiser.denoise(noisy_image, 'method', 'advanced', 'noise_level', 'high');% 彩色图像处理
denoised_color = denoiser.denoise(color_image);

参考代码 基于形态学的权重自适应图像去噪 www.youwenfan.com/contentcni/63976.html

优势

  1. 自适应性强:根据图像局部特征自动调整处理策略
  2. 细节保护:在去噪的同时有效保护图像边缘和纹理
  3. 多尺度处理:结合不同尺度的形态学操作
  4. 参数可调:支持灵活的参数调整以适应不同噪声水平

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

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

相关文章

2025 年油水分离器 / 气液分离器 / 液固分离器 / 水分离器 / 油分离器厂家推荐:西安同大技术沉淀与流体净化解决方案解析

2025 年分离设备行业迎来技术迭代与市场扩容期,全球市场规模已突破 1200 亿美元,中国贡献占比超 35%,成为推动行业发展的核心力量。化工、石油、天然气等领域对分离效率、工况适配性的要求持续升级,合成氨、甲醇、…

2025 年过滤器厂家最新推荐排行榜:聚焦烛式 / 金属 / 非金属 / 化工 / 精密过滤器等多类型设备,精选优质品牌助企业高效选型液固/高效/气固/催化剂过滤器厂家推荐

当前工业生产中,流体处理环节的过滤分离技术对生产安全、效益提升至关重要,化工、石油、天然气等领域常受原料杂质、设备磨损、环保达标难、特殊工况适配差等问题困扰,传统过滤设备易导致产品损失与生产中断。为帮助…

OOP-实验1

实验任务1 源代码task1.cpp点击查看代码 // 现代C++标准库、算法库体验 // 本例用到以下内容: // 1. 字符串string, 动态数组容器类vector、迭代器 // 2. 算法库:反转元素次序、旋转元素 // 3. 函数模板、const引用作…

2025 年立式/立式全钢板/青黄储/液压打包机厂家推荐榜:聚焦实用需求,精选高适配设备助力企业降本增效

随着工业生产精细化推进、环保回收产业规模化发展及企业降本增效需求升级,液压打包机已从传统工业辅助设备,逐步成为废纸回收、塑料加工、农业物料处理等领域的 “刚需工具”—— 它能通过压缩工艺大幅减少轻泡物料体…

308、清平调三首

308、清平调三首308、清平调三首 唐●李白 其一 云想衣裳花想容,春风拂槛露华浓。 若非群玉山头见,会向瑶台月下逢。【现代诗意译】 彩云羡慕她的衣裳 牡丹羡慕她的容貌 春风吹拂着栏杆 更显得她风姿绰约 在露水滋润…

2025管件厂家最新推荐榜:高品质管件与卓越工艺口碑之选

2025管件厂家最新推荐榜:高品质管件与卓越工艺口碑之选行业背景管件作为管道系统中不可或缺的组成部分,广泛应用于建筑、化工、能源、水利等众多领域。随着全球基础设施建设的不断推进以及工业生产的持续发展,管件市…

2025不锈钢管件厂家推荐榜:技术实力与诚信口碑双重保障

2025不锈钢管件厂家推荐榜:技术实力与诚信口碑双重保障在工业管道系统快速发展的今天,卡压式不锈钢管件以其安装便捷、密封性强、耐腐蚀等优势,成为众多工程项目的首选材料。随着市场竞争日趋激烈,如何在众多厂家中…

哪款剪贴板增强软件最好用?有什么剪贴板内容大全值得分享?多款剪切板历史免费版管理工具推荐

剪贴板是电脑中一个非常实用的功能,允许用户在不同的应用程序之间复制和粘贴文本、图像、文件等内容。然而,默认情况下,剪贴板只能存储最近一次复制的内容,这可能会限制我们的工作效率。 但是 Windows 上的剪贴板只…

EndNote文献管理工具!研究生必备软件!超详细下载安装教程(附下载地址)

软甲简介 EndNote是一款功能强大的参考文献管理工具,EndNote作为全球学术界广泛使用的专业软件,拥有强大的文献整理、引用写作和协同管理功能,被众多高校、导师、科研机构列为“标配”。软件获取地址 EndNote文献管…

鸿蒙应用开发从入门到实战(十九):样式复用案例

上一篇文章讲解了ArkUI中样式复用思想,本节继续使用自定义组件对商品列表进行优化。大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业…

2025 年最新推荐冰醋酸厂商综合实力排行榜: 厂商定制服务与仓储能力深度解析昆山/太仓/吴江区/吴中区/相城区/姑苏区冰醋酸厂商推荐

2025 年中国冰醋酸行业产能持续扩张,但市场供需矛盾、品质要求升级及环保政策趋严等问题凸显。华东、华北产区供应集中与中西部需求增长的运输成本差距加大,下游食品、医药领域对产品纯度要求愈发严苛,工业级纯度需…

中电金信:“源启大模型文本生成算法”成功通过互联网信息服务算法备案

近日,国家互联网信息办公室发布了第十三批深度合成服务算法备案信息的公告,中电金信自主研发的“源启大模型文本生成算法”正式通过备案。根据国家网信办等七部门联合公布的《生成式人工智能服务管理暂行办法》规定,…

【Qt开发】输入类控件(二)-> QTextEdit - 详解

【Qt开发】输入类控件(二)-> QTextEdit - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

基于MATLAB的禁忌搜索算法解决物流网络枢纽选址问题

一、问题建模 1. 数学模型 目标函数:最小化总成本(建设成本+运输成本)\(S\):选中的枢纽集合 \(C_i\):候选点i的建设成本 \(w_{kj}\):需求点k到枢纽j的货物量 \(d_{ik}\):候选点i到需求点k的距离 \(x_{ijk}\):需…

springboot 项目部署是tomcat么

------------------------------------------------------ Spring Boot 项目的部署可以使用 Tomcat,但并非只能用 Tomcat。具体取决于项目的配置和需求,主要分为两种情况:** 内置服务器部署 (默认)和外部服务器部…

2025 年最新推荐恒温恒湿试验箱优质厂家榜单:涵盖立式/可程式/小型等多类型设备的精选企业推荐可程式/小型/防爆高低温试/高温高湿试验箱/低温低湿试验箱厂家推荐

在工业生产与科研检测中,恒温恒湿试验箱是保障产品性能稳定性的关键设备,其质量与性能直接影响检测数据的准确性和生产科研进度。当前市场上该类设备品牌众多,部分小厂商以次充好,采用劣质零部件导致设备运行不稳定…

CSS开发工具推荐与实战经验,让样式开发更高效、更精准

本文介绍 CSS 开发工具,包括 VS Code、WebStorm、Sass、PostCSS、Chrome DevTools、Firefox Tools、WebDebugX、PurgeCSS、Lighthouse 等,结合实际案例总结从样式编写到跨端调试的完整工具链与最佳实践。写 CSS 的人…

详细揭秘:详细揭秘:集合划分容斥的容斥系数

宝宝都会的集合划分容斥,从多项式角度推导容斥系数详细揭秘:详细揭秘:集合划分容斥的容斥系数 宝宝都会的集合划分容斥,从多项式角度推导容斥系数 参考文献: 详细揭秘:集合划分容斥的容斥系数 2024.12.23 闲话 浅…

2025 年冷热冲击试验箱生产厂家最新推荐榜:聚焦三箱 / 两箱 / 吊篮式 / 小型 / 风冷式 / 可程式设备,精选优质企业助力高效选购

在工业制造与科研检测领域快速发展的当下,冷热冲击试验箱作为评估产品耐温变性能的核心设备,市场需求日益增长,但行业内厂家数量繁杂、实力悬殊。部分厂家存在技术储备薄弱、工艺精度不足、售后服务滞后等问题,导致…

学好微积分特别是偏微分方程的数值求解对于学习CFD的好处?

学好微积分特别是偏微分方程的数值求解对于学习CFD的好处?当然!这是一个极其重要的问题。可以说,微积分(尤其是偏微分方程数值求解)是CFD的灵魂和基石。学好它们对于学习CFD的好处是全方位的、根本性的,而不仅仅…