Course Assignment영상 처리Spring - 2013Image RestorationClass:영상 신호 처리Stu ID.:Name:Dept. of Electronic Engineering1. Operator ResultLena_OriginalLena+AWGN_30Lena +3x3 Arithmetic Mean Filter이미지캡처PSNR14.9 dB27.12dBMit_OriginalMit+SPN_10Mit +3x3 Median Mean Filter이미지캡처PSNR14.7 dB27.66 dB2. 고찰: Noise의 특성에 따라 사용하는 필터의 특성 또한 변화하여야 제대로 된 결과를 얻을 수 있음을 알 수 있었다. 비선형적인 Salt & Pepper Noise의 경우 Order statistic Filter를 사용하면 임펄스 형태의 잡음은 사라지고 Moving Average Filter를 사용하면 임펄스 값에 의해 전체 마스트 내의 값이 뭉게지는 현상이 있음을 할 수 있었다.또한 가우시안 형태의 잡음을 사용할 경우 잡음의 크기가 크지 않기 때문에 Order statistic Filter를 사용하면 원 영상의 값이 제거 될 수 있음으로 선형 필터를 사용하는 것이 바람직하다.3. 코드#include #include #include //#define WIDTH 512#define HEIGHT 512typedef unsigned char BYTE/************************************************************************* **************************************************************************///void FileRead(char* filename, BYTE **img_in, int height, int width);void FileWrite(char* filename, BYTE **img_out, int height, int width);//vo height, int width, int size);BYTE** MemAlloc_2D(int height, int width);void MemFree(BYTE** img_in, int height);float GetPSNR(BYTE** img_Ori, BYTE** img_Enhd, int height, int width);//void ArithmeticMeanFilter3X3(BYTE** img_in, BYTE** img_out, int height, int width);void MedianMeanFilter3X3(BYTE** img_in, BYTE** img_out, int height, int width);int main(){int i,j;float PSNR;BYTE** img_in,**img_out,**img_padding, **img_ori;//img_in = MemAlloc_2D(HEIGHT,WIDTH);img_padding = MemAlloc_2D(HEIGHT+2,WIDTH+2);img_out = MemAlloc_2D(HEIGHT,WIDTH);img_ori = MemAlloc_2D(HEIGHT,WIDTH);FileRead("Lena_AWGN_30.raw",img_in,HEIGHT,WIDTH);FileRead("Lena(512x512).raw",img_ori,HEIGHT,WIDTH);//for(i = 0 ; i < HEIGHT ; i++)for(j = 0 ; j < WIDTH ; j++)img_padding[i+1][j+1] = img_in[i][j];Padding(img_padding,HEIGHT,WIDTH,3);ArithmeticMeanFilter3X3(img_padding,img_out,HEIGHT,WIDTH);FileWrite("[Output]Lena_AWGN_30.raw",img_out,HEIGHT,WIDTH);PSNR = GetPSNR(img_ori,img_out,HEIGHT,WIDTH);printf("Arithmetic Mean Filt("Mit_SnP_10.raw",img_in,HEIGHT,WIDTH);FileRead("Mit(512x512).raw",img_ori,HEIGHT,WIDTH);//for(i = 0 ; i < HEIGHT ; i++)for(j = 0 ; j < WIDTH ; j++)img_padding[i+1][j+1] = img_in[i][j];Padding(img_padding,HEIGHT,WIDTH,3);MedianMeanFilter3X3(img_padding,img_out,HEIGHT,WIDTH);FileWrite("[Output]Mit_SnP_10.raw",img_out,HEIGHT,WIDTH);PSNR = GetPSNR(img_ori,img_out,HEIGHT,WIDTH);printf("Median Mean Filter PSNR : %fn",PSNR);MemFree(img_in,HEIGHT);MemFree(img_out,HEIGHT);return 0;}//void FileWrite(char* Filename,BYTE** img_ori,int height, int width){int i;FILE *fp_out;fopen_s(&fp_out,Filename,"wb");if(fp_out ==NULL)printf(");for(i = 0 ; i < height ; i++){fwrite(img_ori[i],sizeof(BYTE),width,fp_out);}fclose(fp_out);}//void FileRead(char* Filename, BYTE** img_ori, int height, int width){int i;FILE *fp_in;fopen_s(&fp_in,Filename,"rb");if(fp_in ==NULL)printf(");for(i = 0 ; i < height ; i ++){fread(img_ori[i],sizeof(BYTE),width,fp_in);}fclose(fp_in);}// 2BYTE** MemAlloc_2D(int height, int width){*)malloc(sizeof(BYTE*) * height);for(i = 0 ; i < height ; i++){img[i] = (BYTE *)malloc(sizeof(BYTE) * width);}return img;}// 2void MemFree(BYTE** img_in, int height){int i;for(i = 0 ; i < height ; i++)free(img_in[i]);free(img_in);}// 3x3 Arithmetic Mean Filtervoid ArithmeticMeanFilter3X3(BYTE** img_in, BYTE** img_out, int height, int width){int i,j,m,n;double temp;double AriMean_Mask[3][3] ={{1,1,1},{1,1,1},{1,1,1},};//for(i = 0 ; i < height ; i++){for(j = 0 ; j < width ; j ++){temp = 0;for( m = 0 ; m < 3 ; m++){for(n = 0 ; n < 3 ; n++)temp += img_in[i+m][j+n]*AriMean_Mask[m][n];}temp /= 9;img_out[i][j] = (BYTE)floor(temp+0.5);}}}// 3x3 Median Mean Filtervoid MedianMeanFilter3X3(BYTE** img_in, BYTE** img_out, int height, int width){int i,j,m,n,h;int temp[9];int temp1;for(i = 0 ; i < height ; i++){for(j = 0 ; j < width ; j ++){//temp[]h = 0;for( m = 0 ; m < 3 ; m++){for(n = 0 ; n < 3 ; n++)temp[h++] = img_in[i+m][j+n];}//temp[]for(m = 0 ; m < 8 ; m++){for( n = m + 1 ; n < 9 ; n ++){if(tp[m];temp[m] = temp[n];temp[n] = temp1;}}}//temp[4](img_out[i][j] = temp[4];}}}//void Padding(BYTE** img_in, int height, int width, int size){int i,j;int m = size/2;//paddingfor(i = m ; i < HEIGHT + m; i++){for(j = 0 ; j < m ; j++){img_in[i][j] = img_in[i][m];img_in[i][WIDTH + m + j] = img_in[i][WIDTH + m - 1];}}for(j = m ; j < WIDTH + m ; j++){for(i = 0 ; i < m ; i++){img_in[i][j] = img_in[m][j];img_in[HEIGHT + m + i][j] = img_in[HEIGHT + m - 1][j];}}for(i = 0 ; i < m ; i++){for(j = 0 ; j < m; j++){img_in[i][j] = img_in[m][m];img_in[i][WIDTH + m + j] = img_in[m][WIDTH + m - 1];img_in[HEIGHT + m + i][j] = img_in[HEIGHT + m - 1][m];img_in[HEIGHT + m + i][WIDTH + m + j] = img_in[HEIGHT + m - 1][WIDTH + m - 1];}}}//PSNRfloat GetPSNR(BYTE** img_Ori, BYTE** img_Enhd, int height, int width){int i,j;float PSNR, Error = 0;for(i = 0 ; i < height ; i++){for(j = 0 ; j < width ; j++){Error += ((img_Ori[i][j] - img_Enhd[i][j])*(img_Ori[i][j] - img_Enhd[i][j])/(float)(height*width));}}PSNR = 10*log1R;}
전자공학과 음성 및 오디오 신호처리Design Project #1목표 :1. 오디오 신호의 기본 주파수 검출 과정 구현2. 오디오 신호의 down-sampling 동작 구현문제 :1.1. Goldwave를 이용하여 audio sample "input16k.raw"의 소리와 파형을 확인한다.* 신호 format : 16kHz sampling, 16-bit mono, signed integer1.2. "input16k.raw"의 총 8개의 note에 대하여, 각 note에 해당하는 신호의 스펙트럼을 구하고, 주파수를 분석하여 각 note의 이름을 찾는다.2.1. Goldwave를 이용하여 입력 신호 "input32k.raw"의 소리를 확인한다.* 신호 Format : 32kHz sampling, 16-bit mono, signed integer2.2. 4배 down-sampling을 LPF를 포함하는 경우와 LPF를 포함하지 않는 경우에 대하여 각각 구현하여 출력 신호를 비교한다.레포트 내용? C program Source Code with 주석? 각 문제의 결과와 comments전자공학과 음성 및 오디오 신호처리Design Project #1문제 :1.1. Goldwave를 이용하여 audio sample "input16k.raw"의 소리와 파형을 확인한다.* 신호 format : 16kHz sampling, 16-bit mono, signed integer1.2. "input16k.raw"의 총 8개의 note에 대하여, 각 note에 해당하는 신호의 스펙트럼을 구하고, 주파수를 분석하여 각 note의 이름을 찾는다.노트Hz계스펙트럼노트Hz계스펙트럼1번347파5번469라#2번418솔#6번346파3번348파7번308레#4번349파8번352파2.1. Goldwave를 이용하여 입력 신호 "input32k.raw"의 소리를 확인한다.* 신호 Format : 32kHz sampling, 16-bit mono, signed integer> 원음 그대로 들리는 것을 확인.2.2. 4배 down-sampling을 LPF를 포함하는 경우와 LPF를 포함하지 않는 경우에 대하여 각각 구현하여 출력 신호를 비교한다.○ 4배 down-sampling , LPF 포함하지 않은 경우Anti-aliasing LPF를 포함하지 않고 4배 down sampling하였을 경우에는 고주파 부분(4kHz)의 aliasing으로 인하여 약간의 ‘지지직’하는 잡음이 들리게 되었다. 음원의 반주 부분은 저주파 영역이 많아 상대적으로 aliasing이 발생하지 않아서 잡음이 느껴지지가 않았지만, 음성이 나오는 부분에서는 고주파 영역이 다수 포함되어 있어 aliasing이 발생하여 잡음이 많이 들렸다.○ 4배 down-sampling , LPF (~2KHz,dynamic) 포함해준 경우위 그림은 2Khz Anit-Aliasing LPF를 포함해준 경우, 오른쪽 스펙트럼을 보면 LPF를 포함해주지 않은 것에 비하여 주파수 영역이 제한되어 재생된다. 따라서 32k음원과는 들리는 분위기가 약간 답답하고, 막혀있는 느낌으로 들려온다. 하지만, 음성이 들리는 부분에서의 ‘지지직’하는 잡은은 거의 사라진 것을 볼 수 있는데 , 이것은 aliasing이 발생하는 부분을 미리 잘라내어 미연에 방지했기 때문이다.※ 코드 구현#include #include #define PI 3.141592// 함수 선언void Initializer(float *output, float * Re, float * Im);void N_DFT(float * input,float * output, float * Re, float * Im);void FileRead(int start_point, int end_point, float *temp);void FileWrite(char* filename, float *output);void Find_pitch(float *output);int number = 1;int main(void){//변수 정의float temp[16000], Re[16000], Im[16000], output[16000];//note1Initializer(temp,Re,Im);FileRead(3000,10000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_1.txt", output);//note2Initializer(temp,Re,Im);FileRead(10000,16000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_2.txt", output);//note3Initializer(temp,Re,Im);FileRead(16000,20000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_3.txt", output);//note4Initializer(temp,Re,Im);FileRead(22000,24000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_4.txt", output);//note5Initializer(temp,Re,Im);FileRead(24000,28000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_5.txt", output);//note6Initializer(temp,Re,Im);FileRead(28000,32000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_6.txt", output);//note7Initializer(temp,Re,Im);FileRead(32000,36500,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_7.txt", output);//note8Initializer(temp,Re,Im);FileRead(36500,41000,temp);N_DFT(temp,output,Re,Im);Find_pitch(output);FileWrite("output_note_8.txt", output);return 0;}// N point DFTvoid N_DFT(float * input,float * output, float * Re, float * Im){int k,n;//정수축 Kfor(k=0;k