음성신호 압축안할시 왜 1시간에 230Mbit인가? 64Kbit * 3600
#includevoid 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);
}
'MFC' 카테고리의 다른 글
중간 시험 예상 문제 (0) | 2013.06.05 |
---|---|
데이터 메모리 영역, 허프만 트리..를 만들어야 하지만 리스트 만들기 (0) | 2013.05.30 |
이미지의 기하학적 변환 (1) | 2013.05.09 |
메디안 필터, 가우시안 필터, 에지검출 (0) | 2013.05.02 |
로우패스필터로 경계선을 흐리게 만들어보자. (0) | 2013.04.18 |