Main Content

psnr

峰值信噪比 (PSNR)

说明

peaksnr = psnr(A,ref) 以图像 ref 为参考,计算图像 A 的峰值信噪比 (PSNR)。PSNR 值越大,表示图像质量越好。

示例

peaksnr = psnr(A,ref,peakval) 使用峰值信号值 peakval 计算图像 A 的 PSNR。

peaksnr = psnr(___,'DataFormat',dataFormat) 还指定未格式化图像数据的维度标签 dataFormat。使用此语法为沿一个批量维度的每个元素返回一个单独的 PSNR。

示例

[peaksnr,snr] = psnr(___) 还返回简单信噪比 snr

示例

示例

全部折叠

读取图像并创建一个添加了噪声的副本。原始图像作为参考图像。

ref = imread('pout.tif');
A = imnoise(ref,'salt & pepper', 0.02);

计算 PSNR。

[peaksnr, snr] = psnr(A, ref);
  
fprintf('\n The Peak-SNR value is %0.4f', peaksnr);
 The Peak-SNR value is 22.6437
fprintf('\n The SNR value is %0.4f \n', snr);
 The SNR value is 15.5524 

将一个图像读入工作区中,然后使用图像数据创建一个非格式化的 dlarray 对象。

ref = imread("strawberries.jpg");
ref = im2single(ref);
dlref = dlarray(ref);

向该图像添加椒盐噪声,然后使用含噪图像数据创建一个非格式化的 dlarray 对象。

noisy = imnoise(ref,'salt & pepper');
dlnoisy = dlarray(noisy);

计算含噪数据相对于原始数据的峰值 SNR 和 SNR。

[peaksnr,snr] = psnr(dlnoisy,dlref)
peaksnr = 
  1x1 single dlarray

   17.5941

snr = 
  1x1 single dlarray

   11.1265

将一个参考图像读入工作区中。

ref = imread("office_1.jpg");

预分配两个数组,用于存储与参考图像大小相同的六个图像组成的一个序列。

numFrames = 6;
imsOriginal = zeros([size(ref) numFrames],class(ref));
imsNoisy = zeros([size(ref) numFrames],class(ref));

读取图像并将其添加到预分配的数组中。一个数组存储原始图像数据。另一个数组存储添加了椒盐噪声的图像数据。

for p = 1:numFrames
    filename = strcat("office_",num2str(p),".jpg");
    im = imread(filename);
    imsOriginal(:,:,:,p) = im;
    imsNoisy(:,:,:,p) = imnoise(im,"salt & pepper");
end

以蒙太奇方式显示图像序列。第一行显示具有原始图像数据的序列。第二行显示具有含噪图像数据的序列。

montage(cat(4,imsOriginal,imsNoisy),"Size",[2 numFrames])

Figure contains an axes object. The hidden axes object contains an object of type image.

通过将输入数组的数据格式指定为 "SSCB"(空间、空间、通道、批量),计算每个含噪图像相对于对应原始图像的 PSNR。

peak_psnrs = psnr(imsNoisy,imsOriginal,"DataFormat","SSCB");
peak_psnrs = squeeze(peak_psnrs)
peak_psnrs = 6×1

   16.3560
   16.9698
   17.8079
   18.1843
   18.0656
   17.1682

输入参数

全部折叠

要分析的图像,指定为任意维度的数值数组或 dlarray (Deep Learning Toolbox) 对象。

数据类型: single | double | int16 | uint8 | uint16

参考图像,指定为数值数组或 dlarray (Deep Learning Toolbox) 对象。参考图像与图像 A 具有相同的大小和数据类型。

数据类型: single | double | int16 | uint8 | uint16

峰值信号级别,指定为非负数。如果未指定,则 peakval 的默认值取决于 Aref 的类。

  • 如果图像的数据类型为 doublesingle,则 psnr 假定图像数据在范围 [0, 1] 内。peakval 的默认值为 1

  • 如果图像是整数数据类型,则 peakval 的默认值是该类的范围所允许的最大值。对于 uint8 数据,peakval 的默认值为 255。对于 uint16int16,默认值为 65535

输入图像 Aref 的维度标签,指定为字符串标量或字符向量。dataFormat 中的每个字符必须为以下标签之一:

  • S - 空间

  • C - 通道

  • B - 批量观测值

格式不能包含一个以上的通道标签或批量标签。当输入图像是格式化的 dlarray 对象时,请不要指定 'dataFormat' 参量。

示例: 'SSC' 表示该数组具有两个空间维度和一个通道维度,适用于二维 RGB 图像数据。

示例: 'SSCB' 表示该数组具有两个空间维度、一个通道维度和一个批量维度,适用于二维 RGB 图像数据序列。

输出参量

全部折叠

以分贝为单位的 PSNR,以下列值之一形式返回。

输入图像类型PSNR 值

  • 非格式化数值数组

  • 不带批量维度 ('B') 的格式化数值数组

具有单一 PSNR 测量值的数值标量。
  • 非格式化 dlarray (Deep Learning Toolbox) 对象

具有单一 PSNR 测量值的 1×1 dlarray 对象。
  • 使用 dataFormat 参量指定批量维度的数值数组

与输入图像具有相同维度的数值数组。peaksnr 的空间维度和通道维度是单一维度。沿批量维度的每个元素都有一个 PSNR 测量值。
  • 具有批量维度的格式化 dlarray 对象

  • 使用 dataFormat 参量指定批量维度的非格式化 dlarray 对象

与输入图像具有相同维度的 dlarray 对象。peaksnr 的空间维度和通道维度是单一维度。沿批量维度的每个元素都有一个 PSNR 测量值。

如果 Aref 的数据类型为 single,则 peaksnr 的数据类型为 single。否则,peaksnr 的数据类型为 double

以分贝为单位的信噪比,以下列值之一形式返回。

输入图像类型PSNR 值

  • 非格式化数值数组

  • 不带批量维度 ('B') 的格式化数值数组

具有单一 SNR 测量值的数值标量。
  • 非格式化 dlarray (Deep Learning Toolbox) 对象

具有单一 SNR 测量值的 1×1 dlarray 对象。
  • 使用 dataFormat 参量指定批量维度的数值数组

与输入图像具有相同维度的数值数组。snr 的空间维度和通道维度是单一维度。沿批量维度的每个元素都有一个 SNR 测量值。
  • 具有批量维度的格式化 dlarray 对象

  • 使用 dataFormat 参量指定批量维度的非格式化 dlarray 对象

与输入图像具有相同维度的 dlarray 对象。peaksnr 的空间维度和通道维度是单一维度。沿批量维度的每个元素都有一个 SNR 测量值。

如果 Aref 的数据类型为 single,则 snr 的数据类型为 single。否则,snr 的数据类型为 double

算法

psnr 函数通过以下方程来计算 PSNR:

PSNR=10log10(peakval2/MSE)

peakval 由用户指定或取自图像数据类型的范围。例如,对于数据类型为 uint8 的图像,peakval255MSEAref 之间的均方误差。

扩展功能

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2014a 中推出

全部展开