画像処理の画質評価指標PSNR(ピーク信号対雑音比)

1. PSNR の基本定義

PSNRの正式名称は「Peak Signal-to-Noise Ratio」で、中国語でピーク信号対雑音比を意味し、画質を測定する指標の1つです。PSNR は MSE (平均二乗誤差) の定義に基づいています. サイズ m*n の元の画像 I とそれにノイズを追加した後のノイズ画像 K の場合、その MSE は次のように定義できます: 次に、PSNR は次のように定義できます:
ここに画像の説明を挿入
MAXI
ここに画像の説明を挿入
は画像の最大画素値で、PSNR の単位は dB です。各ピクセルが 8 ビット バイナリで表される場合、その値は 2^8-1=255 ですただし、これはグレースケール画像の計算方法であり、カラー画像の場合は通常、次の方法で計算できます。

方法 1 : RGB 画像の 3 チャネルの各チャネルの MSE 値を計算し、平均値を計算してから PSNR を計算する

方法 2 : matlab の組み込み関数 psnr() を直接使用します (この関数はすべての画像をグレースケール画像として扱うことに注意してください)。

方法 3 : 画像を YCbCr 形式に変換し、Y 成分、つまり輝度成分の PSNR のみを計算します。

2. PSNR 評価基準

一般的に言えば、PSNR 値が大きいほど、画質が向上します。

(1) 40dB 以上: 画質が優れていることを示します (つまり、元の画像に非常に近い)
(2) 30 ~ 40dB: 通常、画質が良好であることを示します (つまり、歪みは検出できますが、
(3) 20-30dB: 説明 画質が悪い
(4) 20dB 未満: 画質は許容できない

3. Matlab が PSNR を実装

1. 方法 1: rgbPSNR.m

function psnrvalue = rgbPSNR(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽
% 注意不加下面两行代码,得出的最终PSNR值将比加上偏大
image1=double(image1);
image2=double(image2);

MSE_R=double(zeros(row,col));
MSE_G=double(zeros(row,col));
MSE_B=double(zeros(row,col));
image1_R=image1(:,:,1);  % R通道
image1_G=image1(:,:,2);  % G通道
image1_B=image1(:,:,3);  % B通道
image2_R=image2(:,:,1);
image2_G=image2(:,:,2);
image2_B=image2(:,:,3);
% 计算RGB图像三个通道每个通道的MSE值再求平均值
for i=1:row
    for j=1:col
        MSE_R(i,j)=(image1_R(i,j)-image2_R(i,j))^2;
        MSE_G(i,j)=(image1_G(i,j)-image2_G(i,j))^2;
        MSE_B(i,j)=(image1_B(i,j)-image2_B(i,j))^2;
    end
end
MSE_RGB=sum(MSE_R(:))+sum(MSE_G(:))+sum(MSE_B(:)); % 将RGB三个通道计算的MSE值相加,注意(:)的用法
MSE=MSE_RGB/(row*col);
B=8;         % 编码一个像素所用二进制位数
MAX=2^B-1;   % 图像的灰度级数        
psnrvalue=20*log10(MAX/sqrt(MSE)); % 两个图像的峰值信噪比                     
end

2. 方法 2: grayPSNR.m

function psnrvalue = grayPSNR(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽
image1=double(image1);
image2=double(image2);
B=8;         % 编码一个像素所用二进制位数
MAX=2^B-1;   % 图像的灰度级数       
MSE=sum(sum((image1-image2).^2))/(row*col);     % 均方差  
psnrvalue=20*log10(MAX/sqrt(MSE));                        
end

3. 方法 3: ycbcrPSNR.m

function psnrvalue = ycbcrPSNR(image1,image2)
% image1和image2大小相等
row=size(image1,1); % 图像的长
col=size(image1,2); % 图像的宽
% rgb2ycbcr函数将 RGB 颜色值转换为 YCbCr 颜色空间
ycbcrimage1=rgb2ycbcr(image1);
ycbcrimage2=rgb2ycbcr(image2);
% 取出Y通道
ycbcrimage1_y=ycbcrimage1(:,:,1);
ycbcrimage2_y=ycbcrimage2(:,:,1);

ycbcrimage1_y=double(ycbcrimage1_y);
ycbcrimage2_y=double(ycbcrimage2_y);

B=8;         % 编码一个像素所用二进制位数
MAX=2^B-1;   % 图像的灰度级数       
MSE=sum(sum((ycbcrimage1_y-ycbcrimage2_y).^2))/(row*col);     % 均方差  
psnrvalue=20*log10(MAX/sqrt(MSE)); 
end

4. メイン関数 main.m

clc;clear;close all;
rgbimage=imread('boy.jpg');
attack_rgbimage=imnoise(rgbimage,'gaussian',0,0.001);
figure(1),
subplot(121),imshow(rgbimage);
title('原始图像');
subplot(122),imshow(attack_rgbimage);
title('噪声攻击图像');

grayimage=rgb2gray(imread('boy.jpg'));
attack_grayimage=imnoise(grayimage,'gaussian',0,0.001);
figure(2),
subplot(121),imshow(grayimage);
title('原始图像');
subplot(122),imshow(attack_grayimage);
title('噪声攻击图像');


% =====================PSNR Test===================== %
% 高于40dB:说明图像质量极好(即非常接近原始图像)
% 3040dB:通常表示图像质量是好的(即失真可以察觉但可以接受)
% 2030dB:说明图像质量差
% 低于20dB:图像质量不可接受

% 注意每次运行产生的PSNR值都会一点点差别
 psnrvalue = rgbPSNR(rgbimage,attack_rgbimage);% 方法一
 disp('RGB图像的峰值信噪比:');
 disp(psnrvalue);
 
 psnrvalue1 = psnr(rgbimage,attack_rgbimage);% 方法二(psnr函数为matlab内置函数,但其将所有图像当成灰度图像处理,得出的PSNR值偏大)
 disp('matlab函数的峰值信噪比:');
 disp(psnrvalue1);
 
 psnrvalue2 = grayPSNR(grayimage,attack_grayimage);% 方法二
 disp('灰度图像的峰值信噪比:');
 disp(psnrvalue2);
 
 psnrvalue3 = ycbcrPSNR(rgbimage,attack_rgbimage);% 方法三
 disp('YCbCr图像Y通道的峰值信噪比:');
 disp(psnrvalue3);

4. 結果分析を実現する

1. 出力結果

RGB 画像:

ここに画像の説明を挿入
対応するグレースケール画像:
ここに画像の説明を挿入
さまざまな方法で出力された PSNR 値:
ここに画像の説明を挿入
2. 結果分析

1. RGB 画像に対して計算された PSNR 値が最も小さく、2 つの方法で計算されたグレースケール画像の PSNR 値は基本的に同じであり、YCbCr 画像の Y チャネルの PSNR 値が最も大きくなります。

2. メイン関数の main.m ファイルを実行するたびに、出力 PSNR 値がわずかに異なることに注意してください。上の画像と下の画像を比較できます。
ここに画像の説明を挿入
3. 上記で提案された 3 つの方法について、同じ方法が実験部分で使用される限り、PSNR を計算するためにどの方法が使用されるかは問題ではありません。ただし、一般的には、1 と 3 の方法がより頻繁に使用されます。

4. ガウス ノイズのパラメータのみを説明します. メイン関数 main.m ファイルのガウス ノイズの分散を0.1に変更します.これは、分散 0.001 で上記で得られた PSNR の結果と比較できます.得られた PSNR ははるかに小さくなります。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_44111805/article/details/127676377