Just a Computer Graphics Studio & My Life

[OpenCV] SNR 與 PSNR

接到網友桑尼的委託,我重操舊業,在Dev C++上安裝OpenCV 2.0,之前寫的PSNR (Peak Signal to Noise Ratio)程式碼馬上可以編譯執行,真的是讓我感到欣慰,因為當時舉手之勞記錄研究細節,至今還能派上用場!

moon_o

原始圖

桑尼所說的工具ImageJPhotoshop有計算SNR 與 PSNR的工具,可惜前者下載回來不會用,後者找不到功能,只好我自己來寫!好在因為先前的研究記錄,讓我省下許多時間。

計算影像處理後的 SNR 與 PSNR:

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

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

SNR PSNR SNR 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");

    long long int sigma = 0;
    long long int squre = 0;
    double MSE = 0.0;
    double SNR = 0.0;
    double PSNR = 0.0;
    int frameSize = src1->height*src1->width*3;
    int blue1=0, blue2=0;
    int green1=0, green2=0;
    int red1=0, red2=0;

    // width x height -> [height][width]
    for(int i=0;i<src1->height;i++){
        for(int j=0;j<src1->widthStep;j=j+3){
            blue1=(int)(uchar)src1->imageData[i*src1->widthStep+j];//Blue
            green1=(int)(uchar)src1->imageData[i*src1->widthStep+j+1];//Green
            red1=(int)(uchar)src1->imageData[i*src1->widthStep+j+2];//Red
            blue2=(int)(uchar)src2->imageData[i*src2->widthStep+j];//Blue
            green2=(int)(uchar)src2->imageData[i*src2->widthStep+j+1];//Green
            red2=(int)(uchar)src2->imageData[i*src2->widthStep+j+2];//Red
            sigma+=(blue1-blue2)*(blue1-blue2)+
            (green1-green2)*(green1-green2)+
            (red1-red2)*(red1-red2);
            squre += blue1*blue1 + green1*green1 + red1*red1;
        }
    }
    MSE=sigma/(double)frameSize;
    PSNR=10*log10(255*255/MSE);
    SNR = 10*log10(squre/sigma);

    cout<<"sigma: "<<sigma<<endl;;
    cout<<"MSE: "<<MSE<<endl;;
    cout<<"PSNR: "<<PSNR<<endl;;
    cout<<"SNR: "<<SNR<<endl;;

    system("pause");
    cvWaitKey(0);
    return EXIT_SUCCESS;
}

與原始圖比較而得SNR與PSNR:

moon-blur0.2

待修圖

sigma: 33315106
MSE: 47.0664
PSNR: 31.4037
SNR: 21.038

moon-m

透過Photoshop修正的圖

sigma: 48069077
MSE: 67.9103
PSNR: 29.8114
SNR: 19.4448

這是第一次人家請我幫忙,主動要給我報酬的網友,雖然沒有報酬我也會幫忙,只是我只會給點提示,畢竟我時間有限,要去做更重要的事情!於是我更想幫助他~

以後若有網友請求協助,若能給點回饋,我願意撥出時間幫忙喔。現在的我報酬要求不高,然而會慢慢地朝目標時薪1000元做越有意義價值的事情,就該得到越多的報酬回饋!想想我兩年的功力,濃縮成2小時的精華,你會覺得沒有賺到嗎?

話說,桑尼在南部是個夜間部大二的學生,早上去公司工作晚間去學校上課,有個八個月大的女兒。雖然我不知道他幾歲,但是學習真的不分年齡呢!

Advertisements

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: