标题
适用于计算成像领域无参考图像的图像信噪比评价方法(基础)
Image Signal-to-Noise-ratio evaluation method to reference-free images in the field of computitional imaging (basic).
注:英文可以不看 ,博主在练习英文而已,英文只是中文的翻译,可以直接看中文!
1. 背景(Backgroud)
在许多计算成像领域中,我们没有办法去得到一张通过算法计算才重建出来的图像的groundtruth,但是我们还是需要评价一下我们的重建算法的好坏,这就需要一些客观指标,来表征重建以后图像的质量,那么最能体现一幅图像质量的指标就是它的的信噪比。所以我们需要一种可以不借助参考真值的图像信噪比评价方法。
在了解该发放之前我们先了解一下图像质量评价的指标都有哪些。
In the computitional imaging, we always can’t obtain an image as the groudtruth, but we still need to evaluate the performance of our reconstruction algorithm. therefore, we need to calculate the SNR of the restored image without groundtruth.
Before we start, let’s have a look on what are the metrics of image quality evaluation.
2. 用来评价图像质量的参数
用来评价图像质量的指标常用的有:信噪比,峰值信噪比,结构相似性.
The matrics of evaluation image includes: SNR(Signal to noise ratio) PSNR(Peak-Signal to Noise ratio) and SSIM(Structure similarity index).
2.1 信噪比 (Signal to noise ration,SNR)
信噪比按照其字面意思就是信号与噪声的比值。在数字摄影成像时代我们的每一副图像都是通过感光器件获得的,那么由于器件本身就存在设计和加工缺陷,因此必然会产生噪声,也就是说我们获得的每一张图像都是信号和噪声的和,那么要计算信噪比,就得分别提取出信号和噪声,传统意义上我们会获得一张真值图像,和一张待计算信噪比的图像,那么此时计算信噪比的方法可以定义为:
Signal-to-noise ratio is literally the ratio of signal to noise. In the age of digital imaging, every photos we obtained was photoed by the Light-sensitive element,therefore,there must be noies in our image, in other words, each image is compsed of signal and noise. Consequently, if we wanna computate the SNR of this image, we must get the sigal and nosie seperately. In traditional we can obtain an image as the ground truth and another image for SNR calculation, the method of computation SNR can be described as:
- 使用待计算SNR图像(记为A)与原始图像(记为B)做相减运算,得到一幅图像(记为C);
- 我们将B视为A的信息部分,将C视为A的噪声部分;
- 分别计算B、C的方差;
- 计算上述两项之比,得到SNR的值。
- 对SNR的值对数化,得到以dB为单位的SNR值。
Here is the matlab code demo:
A=imread('xx.jpg');
B=imread('original.jpg');
C=imsubtract(A,B);
avg1=mean2(C);%求图像均值
[m,n]=size(C);
s1=0;for x=1:m
for y=1:n
s1=s1+(C(x,y)-avg1)^2;%求得所有像素与均值的平方和。
end
end
C1=s1/(m*n);%利用方差公式求得
avg2=mean2(B);%求图像均值
[m,n]=size(B);
s2=0;for x=1:m
for y=1:n
s2=s2+(B(x,y)-avg2)^2;%求得所有像素与均值的平方和。
end
end
B1=s2/(m*n);%利用方差公式求得
D1=B1/C1;
D1=10*log10(D1);
2.2 峰值信噪比 (Peak Signal to noise ration,PSNR)
PSNR(Peak Signal-to-Noise Ratio),峰值信噪比,是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语。由于许多信号都有非常宽的动态范围,所以峰值信噪比常用对数分贝单位来表示。
需要注意的是峰值信噪比的计算必须是两张图像,一张真值一张包含噪声的待评价图像。
PSNR是基于MSE(均方误差)定义,对给定一个大小为m*n的原始图像O和具有噪声的图像K,其MSE可定义为:
M
S
E
=
1
m
n
∑
i
=
0
m
−
1
∑
j
=
0
n
−
1
[
O
(
i
,
j
)
−
K
(
i
,
j
)
]
2
MSE = \frac{1}{mn} \sum_{i=0}^{m-1}\sum_{j=0}^{n-1} [O(i,j)-K(i,j)]^{2}
MSE=mn1i=0∑m−1j=0∑n−1[O(i,j)−K(i,j)]2
PSNR 可以用下式计算:
P
S
N
R
=
10
∙
log
10
(
M
A
X
o
2
M
S
E
)
=
20
∙
log
10
(
M
A
X
o
M
S
E
)
PSNR = 10 \bullet \log_{10}{(\frac{MAX_{o} ^{2} }{MSE} )} =20\bullet \log_{10}{(\frac{MAX_{o}}{\sqrt{MSE} })}
PSNR=10∙log10(MSEMAXo2)=20∙log10(MSEMAXo)
其中MAXo是图像像素的最大值, 注意:这里有一点歧义,这个像素 最大值到底是原始图像的最大值呢?还是重建图像的最大值? 在这里如果只针对8位数字图像,那么一般会认为这个最大值直接为255,在计算成像中就会纠结这个问题,而对于计算成像呢,我个人认为应该先归一化
上面是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算:
方法一:计算RGB图像三个通道每个通道的MSE值再求平均值,进而求PSNR
方法二:直接使用matlab的内置函数psnr()(注意该函数将所有图像当成灰度图像处理)。
方法三:将图像转为YCbCr格式,只计算Y分量即亮度分量的PSNR。
PSNR高于40dB说明图像质量极好(即非常接近原始图像);
在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受);
在20—30dB说明图像质量差;
低于20dB图像不可接受。
彩色PSNR计算
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.3 结构相似性 (Structural similarity index,SSIM)
结构相似性指数(Structural Similarity Index measure,SSIM)用作度量两个给定图像之间的相似性。 因此结构相似性也必须是针对两个图像的。
计算公式如下:
S
S
I
M
(
x
,
y
)
=
[
l
(
x
,
y
)
]
α
[
c
(
x
,
y
)
]
β
[
s
(
x
,
y
)
]
γ
SSIM(x,y)=[l(x,y)]^{\alpha } [c(x,y)]^{\beta } [s(x,y)]^{\gamma }
SSIM(x,y)=[l(x,y)]α[c(x,y)]β[s(x,y)]γ
α
\alpha
α>0,
β
\beta
β>0 and
γ
>
0
\gamma>0
γ>0.
上式是SSIM的数学定义,其中:
l
(
x
,
y
)
=
2
μ
x
μ
y
+
c
1
μ
x
2
+
μ
y
2
+
c
1
l(x,y) = \frac{2\mu_{x}\mu_{y}+ c_{1} }{\mu_{x}^{2}+\mu_{y}^{2}+c_{1} }
l(x,y)=μx2+μy2+c12μxμy+c1
c
(
x
,
y
)
=
2
σ
x
y
+
c
2
σ
x
2
+
σ
y
2
+
c
2
c(x,y) = \frac{2\sigma _{xy}+c_{2}}{\sigma_{x}^{2}+\sigma_{y}^{2}+c_{2}}
c(x,y)=σx2+σy2+c22σxy+c2
s
(
x
,
y
)
=
σ
x
y
+
c
3
σ
x
σ
y
+
c
3
s(x,y)=\frac{\sigma_{xy}+c_{3}}{\sigma_{x}\sigma_{y}+c_{3}}
s(x,y)=σxσy+c3σxy+c3
其中
l
(
x
,
y
)
l(x,y)
l(x,y)是亮度比较,
c
(
x
,
y
)
c(x,y)
c(x,y) 是对比度比较,
s
(
x
,
y
)
s(x,y)
s(x,y)是结构比较,
μ
x
\mu_{x}
μx,
μ
y
\mu_{y}
μy分别是
x
x
x,
y
y
y的平均值,
σ
x
\sigma_{x}
σx,
σ
y
\sigma_{y}
σy分别代表
x
x
x,
y
y
y的标准差,
σ
x
y
\sigma_{xy}
σxy代表
x
x
x和
y
y
y的协方差。而
c
1
c_{1}
c1,
c
2
c_{2}
c2,
c
3
c_{3}
c3 分别为常数,避免分母为0带来的系统错误。
在实际工程计算中,我们一般设定
α
=
β
=
γ
=
1
\alpha=\beta=\gamma=1
α=β=γ=1,另外根据
c
3
=
c
2
2
c_{3}=\frac{c_{2}}{2}
c3=2c2可以将
S
S
I
M
SSIM
SSIM简化为:
S
S
I
M
(
x
,
y
)
=
(
2
μ
x
μ
y
+
c
1
)
(
2
σ
x
y
+
c
2
)
(
μ
x
2
+
μ
y
2
+
c
1
)
(
σ
x
2
+
σ
y
2
+
c
2
)
SSIM(x,y)=\frac{(2\mu_{x}\mu_{y}+c_{1})(2\sigma_{xy}+c_{2})}{(\mu_{x}^{2}+\mu_{y}^{2}+c_{1})(\sigma_{x}^{2}+\sigma_{y}^{2}+c_{2})}
SSIM(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxy+c2)
其中
c
1
=
(
k
1
L
)
2
c_{1} =(k_{1}L)^{2}
c1=(k1L)2,
c
2
=
(
k
2
L
)
2
c_{2}=(k_{2}L)^{2}
c2=(k2L)2,其中
L
L
L为图像像素值的动态范围,典型值计算为
2
b
i
t
s
p
e
r
p
i
x
e
l
−
1
2^{bits per pixel}-1
2bitsperpixel−1,比如为8位,则
L
L
L为
2
8
−
1
=
255
2^{8}-1=255
28−1=255,
k
1
k_{1}
k1,
k
2
k_{2}
k2默认为
k
1
=
0.01
k_{1}=0.01
k1=0.01,
k
2
=
0.03
k_{2}=0.03
k2=0.03.
参考Wikipedia:SSIM
附图像均值及标准差的计算公式
均值:
μ
=
1
w
×
h
∑
i
=
1
w
∑
j
=
1
h
(
p
i
,
j
)
\mu=\frac{1}{w\times h}\sum_{i=1}^{w}\sum_{j=1}^{h}{(p_{i,j})}
μ=w×h1i=1∑wj=1∑h(pi,j)
标准差:
σ
=
1
w
×
h
∑
i
=
1
w
∑
j
=
1
h
(
p
i
,
j
−
μ
)
2
\sigma=\sqrt {\frac{1}{w\times h}\sum_{i=1}^{w}\sum_{j=1}^{h}{(p_{i,j}-\mu)^{2}}}
σ=w×h1i=1∑wj=1∑h(pi,j−μ)2
方差:
标准差定义为方差的算术平方根,因此方差就是标准差的平方。
协方差:
c
o
v
(
X
,
Y
)
=
∑
i
=
1
w
∑
j
=
1
h
(
X
i
,
j
−
μ
x
)
(
Y
i
,
j
−
μ
y
)
w
×
h
−
1
cov(X,Y) = \frac{\sum_{i=1}^{w}\sum_{j=1}^{h}{(X_{i,j}-\mu_{x})(Y_{i,j}-\mu_{y})}}{w\times h-1}
cov(X,Y)=w×h−1∑i=1w∑j=1h(Xi,j−μx)(Yi,j−μy)
注意:协方差与协方差矩阵的区别
3. 无参考图像的图像信噪比计算
对于没有参考图像的图像信噪比的计算我认为需要回归到SNR的最初的定义中去:
S
N
R
=
P
s
i
g
n
a
l
P
n
o
i
s
e
SNR = \frac{P_{signal}}{P_{noise}}
SNR=PnoisePsignal
其中
P
s
i
g
n
a
l
P_{signal}
Psignal为信号功率,
P
n
o
i
s
e
P_{noise}
Pnoise为噪声功率 (功率为幅值的平方)。那么要在仅有一幅图像情况计算其信噪比(即无真值作为参考)就需要在这幅图像中分离出信号和噪声,即前景和背景,那么一般前景为信号,背景为噪声;
传统意义上,也就是大部分会用整副图像(或者所选区域)的平均值来代表信号幅值,用标准差来代表噪声幅值,然后均值与标准差的比值即为信噪比。
这里提供一下个人思考:
对于前景较为丰富的图像可以采用上述的信噪比计算方法,能具有一定的performance的评价作用,但是对于前景较为简单的图像,我认为可以通过设置threshold去提取signal和noise,然后分别将信号的均值与噪声的标准差作比即为信噪比,而且对于设置threshold来计算信噪比,也可以用于前景比较丰富的图像。
4. 总结展望
对于计算成像我们往往得不到真值图像,只能得到一张自己重建的图像,那么要评价自己的成像实验系统的performance和重建算法的有效性,就需要对重建图像的质量进行一定的评价。那么对于传统的图像质量评价,他们会有真值图像作为参考,那么真值图像与重建图像做差即为重建噪声,进而计算信噪比就非常容易。
那么现在还出现了其他的基于人工智能的图像评价方法有很多,大家可以在网上搜一搜。
5. 重点参考
https://en.wikipedia.org/wiki/Signal-to-noise_ratio
https://blog.csdn.net/aoulun/article/details/79007902
https://blog.csdn.net/leviopku/article/details/84635897
版权归原作者 WinrenJoe 所有, 如有侵权,请联系我们删除。