• 图像处理之图像质量评价指标SSIM(结构相似性)


    一、SSIM基本定义

    SSIM全称为“Structural Similarity Index”,中文意思即为结构相似性,是衡量图像质量的指标之一。给定两张图像x和y,其结构相似性可以定义为:

    在这里插入图片描述

    matlab中对SSIM的文档说明:

    SSIM的范围为[0,1],其值越大,表示图像的质量越好。当两张图像一模一样时,此时SSIM=1。计算SSIM有两种方法:

    方法一:使用开源结构相似性函数

    方法二:直接使用matlab的内置函数ssim()

    matlab中对ssim()函数的文档说明:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、matlab实现SSIM

    1、方法二:SSIM.m

    function [mssim, ssim_map] = SSIM(img1, img2, K, window, L)
    
    % ========================================================================
    % SSIM Index with automatic downsampling, Version 1.0
    % Copyright(c) 2009 Zhou Wang
    % All Rights Reserved.
    %
    % ----------------------------------------------------------------------
    % Permission to use, copy, or modify this software and its documentation
    % for educational and research purposes only and without fee is hereby
    % granted, provided that this copyright notice and the original authors'
    % names appear on all copies and supporting documentation. This program
    % shall not be used, rewritten, or adapted as the basis of a commercial
    % software or hardware product without first obtaining permission of the
    % authors. The authors make no representations about the suitability of
    % this software for any purpose. It is provided "as is" without express
    % or implied warranty.
    %----------------------------------------------------------------------
    %
    % This is an implementation of the algorithm for calculating the
    % Structural SIMilarity (SSIM) index between two images
    %
    % Please refer to the following paper and the website with suggested usage
    %
    % Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image
    % quality assessment: From error visibility to structural similarity,"
    % IEEE Transactios on Image Processing, vol. 13, no. 4, pp. 600-612,
    % Apr. 2004.
    %
    % http://www.ece.uwaterloo.ca/~z70wang/research/ssim/
    %
    % Note: This program is different from ssim_index.m, where no automatic
    % downsampling is performed. (downsampling was done in the above paper
    % and was described as suggested usage in the above website.)
    %
    % Kindly report any suggestions or corrections to zhouwang@ieee.org
    %
    %----------------------------------------------------------------------
    %
    %Input : (1) img1: the first image being compared
    %        (2) img2: the second image being compared
    %        (3) K: constants in the SSIM index formula (see the above
    %            reference). defualt value: K = [0.01 0.03]
    %        (4) window: local window for statistics (see the above
    %            reference). default widnow is Gaussian given by
    %            window = fspecial('gaussian', 11, 1.5);
    %        (5) L: dynamic range of the images. default: L = 255
    %
    %Output: (1) mssim: the mean SSIM index value between 2 images.
    %            If one of the images being compared is regarded as
    %            perfect quality, then mssim can be considered as the
    %            quality measure of the other image.
    %            If img1 = img2, then mssim = 1.
    %        (2) ssim_map: the SSIM index map of the test image. The map
    %            has a smaller size than the input images. The actual size
    %            depends on the window size and the downsampling factor.
    %
    %Basic Usage:
    %   Given 2 test images img1 and img2, whose dynamic range is 0-255
    %
    %   [mssim, ssim_map] = ssim(img1, img2);
    %
    %Advanced Usage:
    %   User defined parameters. For example
    %
    %   K = [0.05 0.05];
    %   window = ones(8);
    %   L = 100;
    %   [mssim, ssim_map] = ssim(img1, img2, K, window, L);
    %
    %Visualize the results:
    %
    %   mssim                        %Gives the mssim value
    %   imshow(max(0, ssim_map).^4)  %Shows the SSIM index map
    %========================================================================
    
    
    if (nargin < 2 || nargin > 5)
        mssim = -Inf;
        ssim_map = -Inf;
        return;
    end
    
    if (size(img1) ~= size(img2))
        mssim = -Inf;
        ssim_map = -Inf;
        return;
    end
    
    [M N] = size(img1);
    
    if (nargin == 2)
        if ((M < 11) || (N < 11))
            mssim = -Inf;
            ssim_map = -Inf;
            return
        end
        window = fspecial('gaussian', 11, 1.5);	%
        K(1) = 0.01;					% default settings
        K(2) = 0.03;					%
        L = 255;                                     %
    end
    
    if (nargin == 3)
        if ((M < 11) || (N < 11))
            mssim = -Inf;
            ssim_map = -Inf;
            return
        end
        window = fspecial('gaussian', 11, 1.5);
        L = 255;
        if (length(K) == 2)
            if (K(1) < 0 || K(2) < 0)
                mssim = -Inf;
                ssim_map = -Inf;
                return;
            end
        else
            mssim = -Inf;
            ssim_map = -Inf;
            return;
        end
    end
    
    if (nargin == 4)
        [H W] = size(window);
        if ((H*W) < 4 || (H > M) || (W > N))
            mssim = -Inf;
            ssim_map = -Inf;
            return
        end
        L = 255;
        if (length(K) == 2)
            if (K(1) < 0 || K(2) < 0)
                mssim = -Inf;
                ssim_map = -Inf;
                return;
            end
        else
            mssim = -Inf;
            ssim_map = -Inf;
            return;
        end
    end
    
    if (nargin == 5)
        [H W] = size(window);
        if ((H*W) < 4 || (H > M) || (W > N))
            mssim = -Inf;
            ssim_map = -Inf;
            return
        end
        if (length(K) == 2)
            if (K(1) < 0 || K(2) < 0)
                mssim = -Inf;
                ssim_map = -Inf;
                return;
            end
        else
            mssim = -Inf;
            ssim_map = -Inf;
            return;
        end
    end
    
    
    img1 = double(img1);
    img2 = double(img2);
    
    % automatic downsampling
    f = max(1,round(min(M,N)/256));
    %downsampling by f
    %use a simple low-pass filter
    if(f>1)
        lpf = ones(f,f);
        lpf = lpf/sum(lpf(:));
        img1 = imfilter(img1,lpf,'symmetric','same');
        img2 = imfilter(img2,lpf,'symmetric','same');
        
        img1 = img1(1:f:end,1:f:end);
        img2 = img2(1:f:end,1:f:end);
    end
    
    C1 = (K(1)*L)^2;
    C2 = (K(2)*L)^2;
    window = window/sum(sum(window));
    
    mu1   = filter2(window, img1, 'valid');
    mu2   = filter2(window, img2, 'valid');
    mu1_sq = mu1.*mu1;
    mu2_sq = mu2.*mu2;
    mu1_mu2 = mu1.*mu2;
    sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
    sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
    sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2;
    
    if (C1 > 0 && C2 > 0)
        ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
    else
        numerator1 = 2*mu1_mu2 + C1;
        numerator2 = 2*sigma12 + C2;
        denominator1 = mu1_sq + mu2_sq + C1;
        denominator2 = sigma1_sq + sigma2_sq + C2;
        ssim_map = ones(size(mu1));
        index = (denominator1.*denominator2 > 0);
        ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));
        index = (denominator1 ~= 0) & (denominator2 == 0);
        ssim_map(index) = numerator1(index)./denominator1(index);
    end
    mssim = mean2(ssim_map);
    return
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211

    2、主函数main.m

    clc;clear;close all;
    rgbimage=imread('boy.jpg');
    attack_rgbimage=imnoise(rgbimage,'salt & pepper',0.1);
    figure(1),
    subplot(121),imshow(rgbimage);
    title('原始图像');
    subplot(122),imshow(attack_rgbimage);
    title('噪声攻击图像');
    
    ssimval1=SSIM(rgbimage,attack_rgbimage);% 方法一
    disp('SSIM函数的结构相似性:');
    disp(ssimval1);
    
    ssimval2=ssim(rgbimage,attack_rgbimage);% 方法二
    disp('matlab内置函数的结构相似性:');
    disp(ssimval2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    三、实现结果分析

    1、输出结果
    在这里插入图片描述
    在这里插入图片描述
    2、结果分析

    1、注意每次运行主函数main.m文件,输出的SSIM值都会有细微差别,可以对比上下两张图。
    在这里插入图片描述
    2、可以发现开源函数计算的SSIM值总比matlab内置函数计算的SSIM值大,具体原因不可知。

    3、仅以椒盐噪声的参数为讨论,我们将主函数main.m文件椒盐噪声的方差改为0.01,可以与上方得到方差为0.05的SSIM结果进行对比,可以看出得到的SSIM要大很多。
    在这里插入图片描述

    参考博客:图像质量评估指标:MSE,PSNR,SSIM

  • 相关阅读:
    java精品旅游项目管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    【离散数学】——刷题题库(范式)
    大厂密集背后,折叠屏市场“暗战”已起
    RFID 完整指南:优点、应用和挑战
    kali超详细安装CUDA,安装java,安装go, docker
    Linux 权限
    Eureka的使用场景
    【C语言】通讯录《静态内存版本》
    npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
    一个基于Notes的CMR应用程序
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/127677783