介绍

图像去噪在计算机视觉和图像处理领域扮演着重要角色,尤其是在医学成像、卫星图像分析和图像识别等对图像质量要求极高的领域中。常见的图像去噪算法如非局部均值(NLM)、总变分(TV)、波尔滤波(BM3D)等都在保留图像细节的同时进行去噪,但这类算法在处理高噪声图像或复杂纹理时往往计算复杂度较高。今天我们将探讨一种基于张量分解的去噪算法——IFTTA(Inverse Fast Triple Tensor Approximation),它不仅计算效率高,而且在去噪效果和细节保留方面表现优异。本文将带大家深入了解 IFTTA 算法的原理,并提供一个优化后的 Matlab 实现代码。

什么是 IFTTA 算法?

IFTTA(Inverse Fast Triple Tensor Approximation,逆快速三重张量近似)是一种基于张量低秩近似的图像去噪方法。它的核心思想是将图像表示为一个三阶张量(即包含三个维度的矩阵),然后通过张量分解技术将图像信号分为低秩部分和高频噪声部分,从而达到去噪的目的。

IFTTA 的工作流程通常如下:

构建三阶张量:将图像数据转换为三阶张量表示(例如三通道 RGB 图像)。
张量分解:对张量进行 SVD 分解,提取低秩部分作为主要的图像特征。
逆变换重构:通过逆变换将去噪后的张量重构为图像。

基本算法步骤

IFTTA 的基本步骤可以概括为以下几个主要阶段:

图像转换为张量:对于彩色图像,将图像的三个通道(RGB)作为张量的三个维度。
张量分解与低秩近似:使用 SVD(奇异值分解)对每个通道进行分解,提取主要的低秩成分。低秩表示图像的主要信息,高频噪声则被剔除。
重构图像:通过逆张量运算重构去噪后的图像。

IFTTA 算法的优化

IFTTA 算法的效果在很大程度上取决于低秩近似的秩值(rank),不同的 rank 值会影响去噪效果和细节保留。因此,在优化过程中,我们可以:

自适应调节 rank:根据图像的大小和噪声强度动态调整 rank 值,以便在不同图像上获得更好的去噪效果。
中值滤波后处理:使用中值滤波去除残留的噪声。中值滤波可以有效地去除细小的噪点,同时对边缘保留较好。

Matlab 实现代码:优化的 IFTTA 去噪函数

以下是优化后的 Matlab 实现代码,我们通过动态调整 rank 参数,并在处理后加入中值滤波来进一步提升去噪效果:

optimized_IFTTA_denoising.m 核心代码

function denoised_img = optimized_IFTTA_denoising(input_img, base_rank, adaptive_factor)
    % 优化的 IFTTA 去噪函数
    % 输入:
    %   input_img: 带噪声的输入图像
    %   base_rank: 基础的低秩近似秩值
    %   adaptive_factor: 自适应因子,用于动态调整rank
    % 输出:
    %   denoised_img: 去噪后的图像

    % 将图像转换为 double 类型
    img_tensor = double(input_img);
    [m, n, c] = size(img_tensor);
    
    % 确保图像为RGB格式,如果是灰度图像,则转为三通道
    if c == 1
    end
    
    % 根据图像尺寸和噪声强度自适应调整 rank
    rank = max(10, min(base_rank, round(adaptive_factor * sqrt(m * n))));

    % 对图像的每个通道进行张量 SVD 分解并去噪
    U = cell(1, 3);
    S = cell(1, 3);
    V = cell(1, 3);
    for i = 1:3
        % SVD 分解
        [U{i}, S{i}, V{i}] = svd(img_tensor(:, :, i), 'econ');
        % 自适应低秩近似,保留秩为 rank 的分量

    end

    % 构建低秩近似图像

    for i = 1:3
        % 通过低秩重构去噪图像
        approx_tensor(:, :, i) = U{i} * S{i} * V{i}';
    end

    % 转换回 uint8 格式
    denoised_img = uint8(approx_tensor);

    % 使用中值滤波进一步平滑噪声
    for i = 1:3
        denoised_img(:, :, i) = medfilt2(denoised_img(:, :, i), [3 3]);
    end
end

代码解析

自适应 rank 参数:代码中 rank 参数根据图像大小和噪声强度进行自适应调整。这样可以使得算法在不同图像上具有更强的通用性。
张量 SVD 分解:使用 SVD 分解每个通道的张量,以提取低秩部分实现去噪。
中值滤波后处理:使用中值滤波来进一步去除残留噪声,特别适合去除高斯噪声和椒盐噪声。

去噪效果对比:数值与图像展示

在去噪效果的展示上,我们可以通过数值指标和视觉对比来评估 IFTTA 算法的性能。

数值评价指标

在去噪任务中,常用的评价指标包括:

MSE(均方误差):度量去噪图像与原始图像的平均像素差异,越小越好。
PSNR(峰值信噪比):反映去噪图像与原始图像的信噪比,越大越好。
SSIM(结构相似性指数):衡量去噪图像和原始图像的结构相似度,越接近 1 越好。
以下代码可用于可视化这些评价指标:

visualize_denoising_metrics.m 核心代码
function visualize_denoising_metrics(original_img, noisy_img, denoised_img)
    % 确保图像大小和类型一致
    original_img = im2gray(original_img);
    noisy_img = im2gray(noisy_img);
    denoised_img = im2gray(denoised_img);
    original_img = double(original_img);
    noisy_img = double(noisy_img);
    denoised_img = double(denoised_img);

    % 计算评价指标
    mse_noisy = immse(noisy_img, original_img);
    mse_denoised = immse(denoised_img, original_img);
    psnr_noisy = psnr(noisy_img, original_img);
    psnr_denoised = psnr(denoised_img, original_img);

    % 可视化
    metrics = {'MSE', 'PSNR', 'SSIM'};
    values_denoised = [mse_denoised, psnr_denoised, ssim_denoised];
    figure;
    bar([values_noisy; values_denoised]');
    set(gca, 'XTickLabel', metrics);
    legend({'Noisy Image', 'Denoised Image'});
    title('Denoising Performance Metrics');
end

图像对比展示

同时,为了更直观地对比去噪效果,可以将原始图像、带噪声图像和去噪后的图像并排显示:

display_denoising_comparison.m代码

function display_denoising_comparison(original_img, noisy_img, denoised_img)
    % 确保所有图像为灰度图,以便统一显示
    original_img = im2gray(original_img);
    noisy_img = im2gray(noisy_img);
    denoised_img = im2gray(denoised_img);
    
    % 显示对比图
    figure;
    subplot(1, 3, 1); imshow(original_img, []); title('Original Image');
    subplot(1, 3, 2); imshow(noisy_img, []); title('Noisy Image');
    subplot(1, 3, 3); imshow(denoised_img, []); title('Denoised Image');
end

使用方法

程序总入口,run_IFTTA.m代码


% 读取原始图像和带噪声的图像

original_img = imread('original_image.jpg');
noisy_img = imread('noisy_image.jpg');

% 进行去噪
base_rank = 50;
adaptive_factor = 1.0;
denoised_img = optimized_IFTTA_denoising(noisy_img, base_rank,adaptive_factor);

% 数值可视化
visualize_denoising_metrics(original_img, noisy_img, denoised_img);
%图片对比
display_denoising_comparison(original_img,noisy_img,denoised_img);

效果

在这里插入图片描述
在这里插入图片描述

完整代码获取

关注下方公众号,回复"IFTTA"获取完整代码

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐