構造的類似度（SSIM）で見る画像処理の劣化傾向：どの処理が一番影響するか？

# 目次
- [はじめに](#はじめに)
- [SSIMとは](#SSIMとは)
- [比較するノイズと比較方法](#比較するノイズと比較方法)
- [SSIM×ガウスノイズ](#SSIM×ガウスノイズ)
- [SSIM×塩こしょうノイズ](#SSIM×塩こしょうノイズ)
- [SSIM×スペックルノイズ](#SSIM×スペックルノイズ)
- [SSIM×ポアソンノイズ](#SSIM×ポアソンノイズ)
- [まとめ](#まとめ)

# はじめに
　今回は、いろんなノイズ処理を画像にかけて「どのノイズが一番画像をめちゃくちゃにするか」をSSIM（構造的類似度）という指標で比較してみました！

# SSIMとは
　SSIMは「Structural Similarity Index Measure」の略で、2つの画像がどれだけ似ているかを0〜1の数値で表します。1なら「完全一致！」、0に近いほど「全然違うよ！」という意味です。
普通のPSNRとは違って、人間の目の特性に近い評価をできるのが特徴です。つまり「機械的には違うけど人間的には似てる」みたいな評価ができるんですね。
以下の算出式を用いて、画像の輝度、コントラスト、構造情報の3つの指標をもとにオリジナルの画像との違いを定量的に表現します。

# 比較するノイズと比較方法
　今回は以下の4種類のノイズ処理で遊んでみます：

1. ガウスノイズ - テレビの砂嵐みたいなやつ📺
2. 塩こしょうノイズ - 白と黒の点々がランダムに出るやつ🧂
3. スペックルノイズ - 超音波検査とかでよく見るザラザラしたやつ🌟
4. ポアソンノイズ - 暗い部屋で撮影したときによく出るノイズ📸

実験方法：
MATLABを使って、それぞれのノイズの強さを少しずつ上げながらSSIM値がどう変化するか調べました。以下のようなチェッカー模様の画像をオリジナル画像として使用しました。

代表的なものとしてガウスノイズで使用したコードです。
```matlab:VisualizeSeckleNoiseEffectWithSSIM.m
% Load image
original = imread('original.png'); % Change to any image
grayOriginal = im2gray(original);
grayOriginal = imresize(grayOriginal, [400, 300]);

% Prepare figure
figure;
tiledlayout(1,2);

% Set range of speckle noise variance values
varianceValues = 0.001:0.01:0.5;

% Initialize SSIM values
ssimValues = zeros(length(varianceValues), 1);

% Loop through variance values, apply Speckle noise and calculate SSIM
for i = 1:length(varianceValues)
    variance = varianceValues(i);
    
    % Apply Speckle noise
    noisyImage = imnoise(grayOriginal, 'speckle', variance);
    
    % Convert to double for SSIM calculation
    noisyImageDouble = im2double(noisyImage);
    grayOriginalDouble = im2double(grayOriginal);
    
    % Calculate SSIM
    ssimVal = ssim(noisyImageDouble, grayOriginalDouble);
    ssimValues(i) = ssimVal;
    
    % Display results
    nexttile(1);
    imshow(noisyImage);
    title(sprintf('Speckle Variance = %.2f', variance));
    
    nexttile(2);
    plot(varianceValues(1:i), ssimValues(1:i), '-o');
    ylim([0 1]);
    xlabel('Speckle Variance');
    ylabel('SSIM');
    title('SSIM vs. Speckle Noise Variance');
    drawnow; % Update display immediately
end
```

# SSIM×ガウスノイズ
　じわじわとSSIM値が下がっていきます。見た目も徐々にぼやけていく感じ。標準偏差0.2あたりから「あれ、なんか画像ぼやけてない？」ってレベルになります。
![gaus-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889885/b1b4cf21-9753-4a41-9a38-72cc65a36adb.gif)

# SSIM×salt&pepperノイズ
　これがなかなかのやり手でした！パラメータを上げるとほぼ直線的にSSIM値が下がっていきました。見た目も「うわ、画像壊れてる...」ってなります。
![siogoma-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889885/e637680c-e30f-4da7-864e-a18a6be849d5.gif)

# SSIM×スペックルノイズ
　パラメータを上げると急激にSSIM値が下がっていきました。見た目は「なんか画像にザラザラ感が出てきた？」という感じ。
![spekle-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889885/0025d6d8-2476-48bc-9e3b-e54d84809387.gif)

# SSIM×ポアソンノイズ
　暗い部分ほど目立つノイズで、スケーリングを上げるとSSIM値は非線形に減少。でも他のノイズに比べると「まぁまだマシかな」というレベル。
![poason-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889885/4d2583a3-e453-42f0-a125-d976e8503c33.gif)

# まとめ
　塩こしょうノイズが最も強い破壊力を見せました！これは画像のエッジ情報（輪郭とか）を直接破壊するからだと思われます。人間の目もエッジ情報に敏感なので、見た目の劣化感も強いんですね。
　今回は、SSIMという画像評価指標を利用しましたが、PSNRやFSIMなど他の指標で試してみるのも面白いと思います！