Classification of enhancement techniques
point operations: contrast manipulation, histogram modification
spatial operations: noise smoothing, median filtering, edge sharpening
transform operations: linear filtering, homomorphic filtering(생략)
cf) JPEG, MPEG
u: 입력 밝기
v: 출력 밝기
ex)
u = inImg[i][j]
if (u < a) v = x * u + y;
else if ...
else ...
최대 최소 동일 (하나의 값)
Clipping -> 잘라내다
이진화
v = L - u
L: 밝기 값의 최대
영상 향상을 위한 계산 결과가 굉장히 큰 실수일 수도 있음
실제로 원하는 값은 0~255의 범위에 속함 -> Range Compression 사용
- 일반적인 단일 변환 이미지의 동적 범위는 매우 커서 몇 개의 픽셀만 볼 수 있음
- 동적 범위는 로그 변환을 통해 압축할 수 있음
영상에서는 씬(scene)이 바뀔 때 사용됨
-> Frame Difference
Frame: 동영상에서 한 장의 사진
즉, 변환된 pdf, pv(v)는 균일한 pdf를 갖는다.
히스토그램 균등화에서 목표는 출력 영상에 대해 균일한 히스토그램을 얻는 것입니다.
영상 픽셀 값 u0이 연속 확률 밀도 함수 pu(u)를 갖는 랜덤 변수라고 가정합니다.
그러면 랜덤 변수가 (0,1) 위에 균일하게 분포됩니다. (1)에서, v의 도함수는 다음과 같음
변환에 의한 pv(v)와 pu(u)의 관계 적용
즉, 변환된 pdf, pv(v)는 균일한 pdf를 가짐
ex1)
hisogram이란? 각 화소의 밝기 값별 개수를 막대그래프로 표현한 것
인간 시간에서는 흑색과 백색 사이의 구분 계조는 20단계 이하이므로 좁은 범위에 밝기 값이 분포하면 밝기 값 차이를 구분하기 어려움
영상의 히스토그램은 밝기 값의 분포를 잘 표현하고 있음
좁은 범위에 분포된 화소 값 분포를 전체 밝기 값 영역에 고르게 분포되도록 변환하는 것을 히스토그램 평활화라고 함
즉 영상의 (x,y)위치에서의 밝기 값 u를 변환함수(f(.))를 이용해 새로운 밝기 값 v로 점대점(point-to-point) 변환하는 것임
직선 변환함수(클리핑) 예
누적분포(CDF: Cumulative Distribution Function)는 분포 곡선을 누적한 그래프이며, 분포의 최소값에서 최대값까지 누적하면 최대 값에서의 누적분포 값은 전체 분포 개수가 됨
예를 들어 크기가 100x100인 영상일 경우, 화소의 밝기 값 범위(0~255)에서 누적분포를 계산하면 밝기 값 255(최대값)에서는 전체 화소 수 10,000이 됨
나쁜 화질 영상의 히스토그램 및 누적 분포 그래프
동일한 영상에 대해 광량이 불균일하게 획득되었다면 비슷한 형태의 누적분포를 보이며, 이 누적분포를 변환함수로 이용한다면 일관성있는 변환 결과를 획득할 수 있음
누적 분포 그래프를 이용한 변환
int pmin = 255, pmax = 0;
BYTE* inImg = malloc(H * W);
//find min & max
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++) {
if (inImg[i * W + j] < pmin) pmin = inImg[i * W + j];
if (inImg[i * W + j] > pmax) pmax = inImg[i * W + j];
}
//Normalization
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
inImg[i * W + j] = (int)(255. * (inImg[i * W + j] - pmin) / (pmax - pmin) + 0.5);
//calculate histogram
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
hist[inImg[i * W + j]]++;
////calculate pdf (확률밀도함수)
//for (int i = 0; i < 256; i++)
// pdf[i] = (float)hist[i] / (H * W);
//calculate CDF
//cdf[0] = pdf[0];
for (int i = 1; i < 256; i++)
//cdf[i] = cdf[i - 1

] + pdf[i];
hist[i] += hist[i-1];
//make transfer function
for (int i = 0; i < 256; i++)
//vstar[i] = (int)(255. * cdf[i] + 0.5);
vstar[i] = (int)(255.*hist[i]/(H*W) + 0.5);
//Equalization
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
inImg[i * W + j]=vstar[inImg[i * W + j]];