图像的 SNR 和 PSNR 的计算

PSNR 的公式很容易搜到。

http://www.360doc.com/content/12/0605/21/4129998_216244993.shtml
http://blog.sina.com.cn/s/blog_455c7a600101ytgo.html

 

峰值信噪比经常用作图像压缩等领域中信号重建质量的测量方法,它常简单地通过均方差(MSE进行定义。两个m×n单色图像IK,如果一个为另外一个的噪声近似,那么它们的的均方差定义为:

峰值信噪比定义为:

 

代码实现(参考:http://stackoverflow.com/questions/29428308/snr-of-an-image-in-c-using-opencv)

复制代码
double getPSNR(const Mat& I1, const Mat& I2)
{
    Mat s1;
    absdiff(I1, I2, s1);       // |I1 - I2|
    s1.convertTo(s1, CV_32F);  // cannot make a square on 8 bits
    s1 = s1.mul(s1);           // |I1 - I2|^2

    Scalar s = sum(s1);         // sum elements per channel
<span style="color: #0000ff;">double</span> sse = s.val[<span style="color: #800080;">0</span>] + s.val[<span style="color: #800080;">1</span>] + s.val[<span style="color: #800080;">2</span>]; <span style="color: #008000;">//</span><span style="color: #008000;"> sum channels</span>

<span style="color: #0000ff;">if</span>( sse &lt;= 1e-<span style="color: #800080;">10</span>) <span style="color: #008000;">//</span><span style="color: #008000;"> for small values return zero</span>
    <span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
    </span><span style="color: #0000ff;">double</span>  mse =sse /(<span style="color: #0000ff;">double</span>)(I1.channels() *<span style="color: #000000;"> I1.total());
    </span><span style="color: #0000ff;">double</span> psnr = <span style="color: #800080;">10.0</span>*log10((<span style="color: #800080;">255</span>*<span style="color: #800080;">255</span>)/<span style="color: #000000;">mse);
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> psnr;
}

}

复制代码

 

SNR 不太好搜。

http://cg2010studio.com/2014/12/10/opencv-snr-%E8%88%87-psnr/

http://blog.csdn.net/lien0906/article/details/30059747

SNR (Signal to Noise Ratio):訊號雜訊比,簡稱訊雜比。

PSNR (Peak Signal to Noise Ratio):也是訊雜比,只是訊號部分的值通通改用該訊號度量的最大值。以訊號度量範圍為 0 到 255 當作例子來計算 PSNR 時,訊號部分均當成是其能夠度量的最大值,也就是 255,而不是原來的訊號。

代码实现(参考:http://cg2010studio.com/2014/12/10/opencv-snr-%E8%88%87-psnr/)

复制代码
/**
    Theme: SNR (Signal to Noise Ratio) & PSNR (Peak Signal to Noise Ratio)
    compiler: Dev C++ 4.9.9.2
    Library: OpenCV 2.0
    Date: 103/12/10
    Author: HappyMan
    Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
#include<iostream>

using namespace std;

int main(){
IplImage
src1= cvLoadImage("moon_o.BMP");
IplImage
src2= cvLoadImage("moon_m.BMP");

</span><span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> sigma = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> squre = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">double</span> MSE = <span style="color: #800080;">0.0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">double</span> SNR = <span style="color: #800080;">0.0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">double</span> PSNR = <span style="color: #800080;">0.0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">int</span> frameSize = src1-&gt;height*src1-&gt;width*<span style="color: #800080;">3</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">int</span> blue1=<span style="color: #800080;">0</span>, blue2=<span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">int</span> green1=<span style="color: #800080;">0</span>, green2=<span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">int</span> red1=<span style="color: #800080;">0</span>, red2=<span style="color: #800080;">0</span><span style="color: #000000;">;

</span><span style="color: #008000;">//</span><span style="color: #008000;"> width x height -&gt; [height][width]</span>
<span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=<span style="color: #800080;">0</span>;i&lt;src1-&gt;height;i++<span style="color: #000000;">){
    </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=<span style="color: #800080;">0</span>;j&lt;src1-&gt;widthStep;j=j+<span style="color: #800080;">3</span><span style="color: #000000;">){
        blue1</span>=(<span style="color: #0000ff;">int</span>)(uchar)src1-&gt;imageData[i*src1-&gt;widthStep+j];<span style="color: #008000;">//</span><span style="color: #008000;">Blue</span>
        green1=(<span style="color: #0000ff;">int</span>)(uchar)src1-&gt;imageData[i*src1-&gt;widthStep+j+<span style="color: #800080;">1</span>];<span style="color: #008000;">//</span><span style="color: #008000;">Green</span>
        red1=(<span style="color: #0000ff;">int</span>)(uchar)src1-&gt;imageData[i*src1-&gt;widthStep+j+<span style="color: #800080;">2</span>];<span style="color: #008000;">//</span><span style="color: #008000;">Red</span>
        blue2=(<span style="color: #0000ff;">int</span>)(uchar)src2-&gt;imageData[i*src2-&gt;widthStep+j];<span style="color: #008000;">//</span><span style="color: #008000;">Blue</span>
        green2=(<span style="color: #0000ff;">int</span>)(uchar)src2-&gt;imageData[i*src2-&gt;widthStep+j+<span style="color: #800080;">1</span>];<span style="color: #008000;">//</span><span style="color: #008000;">Green</span>
        red2=(<span style="color: #0000ff;">int</span>)(uchar)src2-&gt;imageData[i*src2-&gt;widthStep+j+<span style="color: #800080;">2</span>];<span style="color: #008000;">//</span><span style="color: #008000;">Red</span>
        sigma+=(blue1-blue2)*(blue1-blue2)+<span style="color: #000000;">
        (green1</span>-green2)*(green1-green2)+<span style="color: #000000;">
        (red1</span>-red2)*(red1-<span style="color: #000000;">red2);
        squre </span>+= blue1*blue1 + green1*green1 + red1*<span style="color: #000000;">red1;
    }
}
MSE</span>=sigma/(<span style="color: #0000ff;">double</span><span style="color: #000000;">)frameSize;
PSNR</span>=<span style="color: #800080;">10</span>*log10(<span style="color: #800080;">255</span>*<span style="color: #800080;">255</span>/<span style="color: #000000;">MSE);
SNR </span>= <span style="color: #800080;">10</span>*log10(squre/<span style="color: #000000;">sigma);

cout</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">sigma: </span><span style="color: #800000;">"</span>&lt;&lt;sigma&lt;&lt;<span style="color: #000000;">endl;;
cout</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">MSE: </span><span style="color: #800000;">"</span>&lt;&lt;MSE&lt;&lt;<span style="color: #000000;">endl;;
cout</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">PSNR: </span><span style="color: #800000;">"</span>&lt;&lt;PSNR&lt;&lt;<span style="color: #000000;">endl;;
cout</span>&lt;&lt;<span style="color: #800000;">"</span><span style="color: #800000;">SNR: </span><span style="color: #800000;">"</span>&lt;&lt;SNR&lt;&lt;<span style="color: #000000;">endl;;

system(</span><span style="color: #800000;">"</span><span style="color: #800000;">pause</span><span style="color: #800000;">"</span><span style="color: #000000;">);
cvWaitKey(</span><span style="color: #800080;">0</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> EXIT_SUCCESS;

}

复制代码

 

posted @ 2019-09-08 14:43  FlyingPanguins  阅读(1430)  评论(0)    收藏  举报