뭉쳐있는 영역은 비슷한 픽셀을 가진다! -> 차이만 전달해서 용량을 줄여보자!
제일 왼쪽 값에서 차이를 구하고, 그걸 5구간으로 나눠서 용량을 줄인다!
코드에서 q가 0 ~ q-1까지를 하나로 본다는 뜻 입니다.
중간 값(128)이 있다는 가정 하에 차이(-28)를 전송
정보 손실 없는 압축 == 무손실 압축
여기는 무손실 압축 ( q가 없다)
비슷한 값이므로 확률적으로 예측한다.
데이터를 깎는다 ==Quantization = 양자화
데이터를 깎아서 적은 양의 데이터를 주고 받게 한다.
이 작업이 있으면 손실 압축 (q)
양자화가 커지면 데이터 손실도 늘어난다.
Prediction Error까지는 무손실 압축
Quantization은 손실 압축 - 정수 단위로 바뀐다.
손실이 일어난다.
왜 두번째는 0이 아닌가?
받은 것 기준으로 오차를 내보낸다.
보내는 쪽은 보내는 것과 받는 것 모두 진행
-> 받는 영상이 존재한다. -> 받는 것 기준으로 진행
인코더 - 압축 + 압축 해제
디코더 - 압축 해제
저 압축 숫자(q)를 바꾸면 (5에서 10으로) 손실이 더 커지지만 영상 크기도 그만큼 작아진다.
또한 같은 값이 나올 확률이 점점 커진다.
-29고 q = 30일때 0이 된다.
왼쪽에서 진행하는 것과 위에서 진행하는 것의 차이가 크다.
현재 것을 비슷하게 만드는 것이 핵심이다.
어디서 가져올지 다 테스트를 해보겠다!
-> 디코더에서는 알 수 있는 방법이 없다. 디코더에서는 어디서 정보를 받아 왔는지 알 방법이 없다.
RENC == RDEC
이게 꼭 맞아야 된다.
보낸 비트의 수도 평가 요소이다.
PSNR - 복원 영상의 화질
위 두개가 평가 지표이다.
void DPCMEncoder(double* org, int* prsy, int q, BITMAPFILEHEADER bmpFile, BITMAPINFOHEADER bmpInfo) {
int width = bmpInfo.biWidth, height = bmpInfo.biHeight, size = bmpInfo.biSizeImage;
double* pe, *rs;
pe = (double*)calloc(width * height, sizeof(double));
rs = (double*)calloc(width * height, sizeof(double));
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
if (i == 0) {
pe[j * width + i] = org[j * width + i] - 128;
prsy[j * width + i] = (int)(pe[j * width + i] / q);
rs[j * width + i] = 128 + prsy[j * width + i] * q;
}
else {
pe[j * width + i] = org[j * width + i] - rs[j * width + i - 1];
prsy[j * width + i] = (int)(pe[j * width + i] / q);
rs[j * width + i] = rs[j * width + i - 1] + prsy[j * width + i] * q;
}
}
}
makeOutFile(bmpFile, bmpInfo, "DPCMEncoder.bmp", rs);
free(rs);
free(pe);
}
void DPCMDecoder(double* out, int* prsy, int q, BITMAPFILEHEADER bmpFile, BITMAPINFOHEADER bmpInfo) {
int width = bmpInfo.biWidth, height = bmpInfo.biHeight, size = bmpInfo.biSizeImage;
double * rs;
rs = (double*)calloc(width * height, sizeof(double));
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
if (i == 0) {
rs[j * width + i] = 128 + prsy[j * width + i] * q;
}
else {
rs[j * width + i] = rs[j * width + i -1] + prsy[j * width + i] * q;
}
}
}
makeOutFile(bmpFile, bmpInfo, "DPCMDecoder.bmp", rs);
free(rs);
}
원본과의 차이!
인코더와 디코더의 차이는 0
'언어 > C' 카테고리의 다른 글
C언어 영상처리 과제 - compression, Quantization (2) | 2024.06.05 |
---|---|
C언어 영상처리 - 노이즈 제거 및 업셈플링 (0) | 2024.05.21 |
C언어 영상처리 - data 파일에 넣은 사진 psnr 자동 계산하기 (0) | 2024.05.16 |
C언어 영상처리 - 노이즈 제거, 업스케일링 기록용 (1) | 2024.05.16 |
C 언어 영상처리 - Sobel Filter, 윤곽선 검출, Edge Detection (0) | 2024.05.07 |