DCT 처리후 출력이 안나옵니다. 무엇이 문제일까요
루나
질문 제목 : DCT 처리후 출력이 안나옵니다. 무엇이 문제일까요
해당 코드를 출력했을떄 나오는 이미지
/
본래대로 나와야 하는이미지
질문 내용 :
위에 사진대에서 원하는데로 나오지 않는데 무엇이 문제인지 잘 모르겠습니다
코사인 곱은 제가 행렬로 미리 형성해서 구했는데
무엇이 문제인지 전혀 감이 안잡힙니다
#include stdio.h
#include stdlib.h
#include math.h
// DEFINE SIZE of a Image
#define VER 512
#define HOR 512
#define F_SIZE VER*HOR
// DEFINE SIZE of constant
#define PI 3.141592654
#define N 8
//함수 선언
void CosMat(void);
void div8x8(unsigned char *Image,double *block8x8);
void sum8x8(unsigned char *reImage,double *blockDCT);
void DCT(double *out,double *blockDCT,double *temp);
void IDCT(double *out,double *blockDCT,double *temp);
unsigned char *alloc_pic(int a);
//Quantazation Matrix
int QuantMatrix[64]={16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68,109,103, 77,
24, 35, 55, 64, 81,104,113, 92,
49, 64, 78, 87,103,121,120,101,
72, 92, 95, 98,112,100,103, 99};
//Cosine Coefficient Matrix
double CosCoeff[64];
double CosCoeff_T[64];
void main()
{
FILE *fin=fopen(Lena_512.RAW,rb);
FILE *fout1=fopen(DCT8by8.raw,wb);
FILE *fout2=fopen(IDCT8by8.raw,wb);
unsigned char * input = alloc_pic(F_SIZE);
unsigned char * output1 = alloc_pic(F_SIZE);
unsigned char * output2 = alloc_pic(F_SIZE);
double *block= (double *)malloc(sizeof(double)*8*8);
double *blockDCT= (double *)malloc(sizeof(double)*8*8);
double *temp= (double *)malloc(sizeof(double)*8*8);
fread(input,sizeof(char),F_SIZE,fin);
int x,y;
CosMat();
// DCT 과정
for(y=0;yVER;y+=8)
for(x=0;xHOR;x+=8)
{
div8x8(&input[y*HOR+x],&block[0]); // 원본 이미지를 8x8크기로 자름.
DCT(&block[0],&blockDCT[0],&temp[0]); // DCT 수행
sum8x8(&output1[y*HOR+x],&temp[0]); // 8x8로 자른 이미지 합침
}
fwrite(output1,sizeof(unsigned char),F_SIZE,fout1);
fwrite(output2,sizeof(unsigned char),F_SIZE,fout2);
fclose(fin);
fclose(fout1);
fclose(fout2);
free(input);
free(output1);
free(output2);
free(block);
}
void CosMat() // 8x8코사인 매트릭스
{
int x,y;
for(y=0;y8;y++)
{
for(x=0;x8;x++)
{
if(y==0) // Y=0일때의 값 (1/root(N)
{CosCoeff[y*8+x]=1/sqrt(N*1.0);}
else // Y!=0 일떄의 값 (root(2)/root(N)
{CosCoeff[y*8+x]=(sqrt(2.0)/sqrt(N*1.0))*cos( (2*x+1)*y*PI/(2*N) );}
printf(%lf ,CosCoeff[y*8+x]);
}
printf(\n);
}
//cos_T
printf(\n);printf(\n);printf(\n);printf(\n);
for (y = 0 ; y 8 ; y++){
for (x = 0 ; x 8 ; x++){
CosCoeff_T[8*x+y] = CosCoeff[8*y+x];
}
}
for (y = 0 ; y 8 ; y++){
for (x = 0 ; x 8 ; x++){
printf(%lf ,CosCoeff_T[y*8+x]);
}
printf(\n);
}
}
void div8x8(unsigned char *Image,double *block8x8) //8x8로 나누는 함수
{
int x,y;
for(y=0;y8;y++)// 행
{
for(x=0;x8;x++) // 렬
{
block8x8[y*8+x]=Image[y*HOR+x]; // 원본이미지 = 8x8행렬
//printf(%lf\t,block8x8[y*8+x]);
}
//printf(\n);
}
//printf(\n);
}
void sum8x8(unsigned char *reImage,double *blockDCT) // 8x8 행렬합침
{
int i,j;
for(i=0;i8;i++)
{
for(j=0;j8;j++)
{
reImage[i*HOR+j]=blockDCT[i*8+j];
}
}
}
void DCT(double *block,double *blockDCT,double *temp1) // mp1) // block 8x8이미지, blockDCT 수행 이미지
{
int x,y,k;
double temp[64];
for(y=0;y8;y++) // 결과저장 행렬 y
{
for(x=0;x8;x++) // 결과저장 행렬 x및 연산과정 x
{
temp[x+8*y]=0.0;
for(k=0;k8;k++) // 연산과정에서 k를 사용하여 열을 증가 및 x를 이용하여 행증가
{
temp[x+8*y]+=CosCoeff[k+8*x]*block[x+8*k];
}
}
}
for(y=0;y8;y++)// 결과저장 행렬 y
{
for(x=0;x8;x++)// 결과저장 행렬 x및 연산과정 x
{
blockDCT[x+8*y]=0.0;
for(k=0;k8;k++)// 연산과정에서 k를 사용하여 열을 증가 및 x를 이용하여 행증가
{
blockDCT[x+8*y]+=temp[k+8*x]*CosCoeff_T[x+8*k];
}
if(blockDCT[x+8*y]255)
{temp1[x+y*8]=255;}
else if(blockDCT[x+8*y]0)
{temp1[x+y*8]=0;}
else {temp1[x+y*8]=blockDCT[x+8*y];}
}
}
}
void IDCT(double *block,double *blockDCT,double *temp1) // block 8x8이미지, blockDCT 수행 이미지
{
int x,y,k;
double temp=0;
for(y=0;y8;y++) // 결과저장 행렬 y
{
for(x=0;x8;x++) // 결과저장 행렬 x및 연산과정 x
{
for(k=0;k8;k++) // 연산과정에서 k를 사용하여 열을 증가 및 x를 이용하여 행증가
{
temp+=blockDCT[x+8*k]*CosCoeff_T[k+8*x];
}
blockDCT[x+y*8]=temp;
temp=0;
}
}
temp=0;
for(y=0;y8;y++)// 결과저장 행렬 y
{
for(x=0;x8;x++)// 결과저장 행렬 x및 연산과정 x
{
for(k=0;k8;k++)// 연산과정에서 k를 사용하여 열을 증가 및 x를 이용하여 행증가
{
temp+=CosCoeff[x+8*k]*blockDCT[k+8*x];
}
if(temp255)
{blockDCT[x+y*8]=255;}
else if(temp0)
{blockDCT[x+y*8]=0;}
else{blockDCT[x+y*8]=temp;}
temp=0;
}
}
}
unsigned char * alloc_pic(int a)
{
unsigned char *pic;
if((pic = (unsigned char *)calloc(a, sizeof(unsigned char)))==NULL)
{
printf(\n malloc_picture : Picture structure \n);
exit(1);
}
return pic;
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2693788 | 이런 함수는 없나요? (3) | 앤드류 | 2025-05-05 |
2693758 | txt파일 불러와서 행렬로 저장 | 큰애 | 2025-05-05 |
2693727 | scanf 오류 문제!! (2) | 큰나래 | 2025-05-04 |
2693704 | 구조체 주소록 문제인데 도와주세요 (2) | 도1도캣 | 2025-05-04 |
2693676 | 열혈강의 c언어 질문입니다 | 하양이 | 2025-05-04 |
2693647 | 12.620000 을요 12.620 으로 어떻게 표현해요? (2) | 파도 | 2025-05-04 |
2693619 | 타이틀 코드.. | 단순드립 | 2025-05-03 |
2693591 | 컴파일 에러에서 질문드립니다 (3) | 게자리 | 2025-05-03 |
2693463 | 동적할당 이용시 fwrite사용을 어떻게 해야하나요..? (10) | 일본어못해요 | 2025-05-02 |
2693387 | 배열문제입니다 수정오류캡쳐했습니다 (6) | 연하얀 | 2025-05-01 |
2693356 | text 입출력 내림차순 질문입니다 ㅠ | 빛글 | 2025-05-01 |
2693328 | C언어를이용해서 .txt파일 외에 다른 확장자 파일 삭제가 가능한지.. (2) | 대나무 | 2025-05-01 |
2693299 | 파일입출력 바이너리파일 | 독특한 | 2025-04-30 |
2693273 | 오류 (1) | 귀1여운렩 | 2025-04-30 |
2693080 | visual studio 2008 express edition 등록키 말인데요 | 얀별 | 2025-04-28 |
2693053 | 배열, 구조체 관련 프로그래밍 질문드립니다. | 싸리 | 2025-04-28 |
2693025 | 프로그램을 짜봤는데요 ㅠㅠ | 상처입은마음 | 2025-04-28 |
2693001 | 워닝문제, 세그멘트결함문제 (1) | 월식 | 2025-04-28 |
2692979 | 라인한줄 이랑.. 소스 설명좀 부탁드려요.. | 이루리 | 2025-04-27 |
2692947 | 이 문제좀 풀어 주세요..ㅜㅜ (1) | 소리 | 2025-04-27 |