DCT변환

from MFC 2013. 5. 23. 09:02

음성신호 압축안할시 왜 1시간에 230Mbit인가? 64Kbit * 3600

#include
void main() //Run Length Code를 만드는 프로그램 예제
{
	char src[256] = {0,};
	printf("입력하라 : ");
	scanf("%s", src);
	printf("출력결과 : %s\n", src);

	//첫번째 문자를 이전 문자값(A)로 어떤 저장변수에 초기화, 카운터는 1로 초기화
	char saveValue;
	int cnt;
	saveValue = src[0];
	cnt =1;
	//두번째 문자부터 마지막 문자까지 탐색
	for(int i=1; src[i]>0; i++){
		//주욱 비교하면서 현재문자와 이전문자가 같으면 카운터 증가
		if(src[i] == saveValue){
			cnt++;
		}		
		else{
			//다르면 카운터랑 이전문자를 찍어주고,
			printf("%d%c", cnt,saveValue);
			//다음 다른 문자부터 다시 카운터랑 이제부터의 문자를 저장변수에 초기화
			saveValue = src[i];
			cnt=1;
		}
	}
	printf("%d%c\n",cnt,saveValue);		
}

 

DCT변환 처리

void CtestDoc::onFdct()
{
 // TODO: 여기에 명령 처리기 코드를 추가합니다.
 const double PI = 3.14159265;
 const int N = 128;
 const double scale = 128/(double)256;

 unsigned char *ZoomImage;
 ZoomImage = new unsigned char[N*N];

 for(int y_new=0; y_new<N; y_new++){
  for(int x_new=0; x_new<N; x_new++){
   double x = x_new/scale;
   double y = y_new/scale;
   int x_org=(int)(x+0.5);
   int y_org=(int)(y+0.5);
   ZoomImage[y_new * N + x_new] = m_InputImage[y_org][x_org];
  }
 }

 int u_max, v_max;
 double Sum, Cu, Cv, DCT_max=0;

 for(int u=0; u<N; u++){
  if(u==0) Cu = sqrt(1./2.); else Cu=1;
  for(int v=0; v<N; v++){
   Sum=0;
   if(v==0) Cv=sqrt(1./2.); else Cv=1;
   for(int y=0; y<N; y++){
    for(int x=0; x<N; x++){
     double cosValue1 = cos(v * PI * (2*y+1)/(2*N));
     double cosValue2 = cos(u * PI * (2*x+1)/(2*N));
     Sum+=(double)ZoomImage[y*N+x]*cosValue1*cosValue2;
    }
   }
   m_Dct[u][v] = 2./N*Cu*Cv*Sum;

   if(abs((int)m_Dct[u][v]) > DCT_max){
    DCT_max = abs((int)m_Dct[u][v]);
    u_max=u;
    v_max=v;
   }
  }
 }
 CString strTemp;
 strTemp.Format(_T("(u,v)=(%d,%d)일때 DCT_max값=%5.3f"),u_max,v_max,DCT_max);
 AfxMessageBox(strTemp);

 const int threshold = DCT_max * 0.05;

 for(int y=0; y<128; y++){
  for(int x=0; x<128; x++){
   if(abs((int)m_Dct[y][x]) > threshold) m_OutputImage[y][x] = 255;
   else
    m_OutputImage[y][x] = abs((int)m_Dct[y][x])*255/threshold;
  }
 }
 
 memset(m_InputImage,0,sizeof(unsigned char)* (256*256));

 for(int y=0; y<N; y++){
  for(int x=0; x<N; x++){
   m_InputImage[y][x]=ZoomImage[y*N+x];
  }
 }
 delete[] ZoomImage;
 UpdateAllViews(NULL);
}

 

 

IDCT

void CtestDoc::OnIDct()
{
 const double PI = 3.14159265;
 const double N=128;
 double Sum, Cu, Cv, temp;
 
 for(int y=0; y<N; y++){
  for(int x=0; x<N; x++){
   Sum=0;
   for(int u=0; u<N; u++){
    for(int v=0; v<N; v++){
     if(v==0) Cv=sqrt(1./2.); else Cv=1;
     if(u==0) Cu=sqrt(1./2.); else Cu=1;
     double cosValue1 = cos(v * PI * (2*y+1)/(2*N));
     double cosValue2 = cos(u * PI * (2*x+1)/(2*N));
     Sum+=Cu*Cv*m_Dct[u][v]*cosValue1*cosValue2;    
    }
   }
   temp = Sum * 2./N;
   m_OutputImage[y][x] = (unsigned char)temp;
  }
 }
 UpdateAllViews(NULL);
}

 

오픈CV로

void CtestDoc::OnDct32778()
{
 IplImage* src8 = cvLoadImage("lena.bmp", CV_LOAD_IMAGE_GRAYSCALE);
 IplImage* src32 = cvCreateImage(cvGetSize(src8), IPL_DEPTH_32F, 1);
 IplImage* dct32 = cvCreateImage(cvGetSize(src8), IPL_DEPTH_32F, 1);
 IplImage* inversed32 = cvCreateImage(cvGetSize(src8), IPL_DEPTH_32F, 1);
 cvCvtScale(src8, src32, 1, 0);
 cvDCT(src32, dct32, CV_DXT_FORWARD);
 cvDCT(dct32, inversed32, CV_DXT_INVERSE);

 IplImage* dct8 = cvCreateImage(cvGetSize(src8), IPL_DEPTH_8U, 1);
 IplImage* inversed8 = cvCreateImage(cvGetSize(src8), IPL_DEPTH_8U, 1);
 cvCvtScale(dct32, dct8, 0.5);
 cvCvtScale(inversed32, inversed8);
 cvShowImage("원본",src8);
 cvShowImage("FDCT",dct8);
 cvShowImage("복원",inversed8);
 cvWaitKey(0);
}

 


,