[TIL]230327 - 영상처리 4주차: 영상향상(1)

Jimin·2023년 3월 28일
0

영상향상

  • 이미지 향상의 목적은 처리된 이미지가 특정 애플리케이션에 대한 원래 이미지보다 더 적합하도록 이미지를 처리하는 것
  • cf) 이미지 복원 시 이상적인 이미지가 저하되었으며, 처리된 이미지를 최대한 원본 이미지와 닮게 하는 것이 목적임

  • Classification of enhancement techniques

    1. point operations: contrast manipulation, histogram modification

    2. spatial operations: noise smoothing, median filtering, edge sharpening

      • 공간적 연산: 주변 값과 비교, 주변의 평균값/중간값으로 대체
    3. transform operations: linear filtering, homomorphic filtering(생략)

      • 변환 연산: 주파수 공간(정형파)으로 바꿔서 처리
  • cf) JPEG, MPEG

    • Joint Photographer's
    • Expert
    • Group

Point operations

Contrast Stretching

  • 저대비 영상은 종종 조도가 나쁘거나 균일하지 않거나 영상 센서의 비선형성 또는 작은 동적 범위로 인해 발생함
  • 대비 스트레칭의 아이디어는 처리 중인 영상에서 회색 레벨의 동적 범위를 늘리는 것
  • 변형 함수의 기울기가 스트레치 영역의 단일보다 크게 선택됨
    • 확장된 지역에서 통일성보다 더 큰 것으로 선택된다

u: 입력 밝기
v: 출력 밝기

ex)
u = inImg[i][j]
if (u < a) v = x * u + y;
else if ...
else ...

Clipping

최대 최소 동일 (하나의 값)
Clipping -> 잘라내다

  • Contrast Stretching의 특별한 경우로 a = y = 0인 경우를 Clipping이라고 함
  • 이것은 입력 신호가 [a, b] 범위에 있는 것으로 알려진 경우 노이즈 감소에 유용함
  • 부호 없는 문자와 같이 제한된 수의 비트로 표시되는 이미지에 대해 클리핑을 수행해야 함

Thresholding function (문턱치, 임계값)

이진화

  • a = b = t 및 출력이 이진수가 되는 클리핑의 특수한 경우

Image Negative (이미지 반전)

v = L - u
L: 밝기 값의 최대


Range Compression

영상 향상을 위한 계산 결과가 굉장히 큰 실수일 수도 있음
실제로 원하는 값은 0~255의 범위에 속함 -> Range Compression 사용

  • 일반적인 단일 변환 이미지의 동적 범위는 매우 커서 몇 개의 픽셀만 볼 수 있음
  • 동적 범위는 로그 변환을 통해 압축할 수 있음

  • cf) 처리 영상을 display
    0~1 -> 0~255
    수백만 -> Nomalization 혹은 Range Compression 사용

Image subtraction

  • 많은 이미지 응용에서 두 이미지를 비교하는 것이 바람직함
  • 간단하지만 강력한 방법은 두 이미지를 정렬하고 빼는 것임

  • 여기서 (i,j)는 각 픽셀 위치를 의미하며, u1과 u2는 비교되는 두 개의 이미지임

영상에서는 씬(scene)이 바뀔 때 사용됨
-> Frame Difference
Frame: 동영상에서 한 장의 사진

Histogram Modification

  • 디지털 영상의 히스토그램은 영상에서 각 그레이 레벨의 상대적인 발생 빈도를 나타냅
  • 히스토그램은 각 회색 수준의 발생 확률에 대한 추정치를 제공함

히스토그램 균등화

  • 즉, 변환된 pdf, pv(v)는 균일한 pdf를 갖는다.

  • 히스토그램 균등화에서 목표는 출력 영상에 대해 균일한 히스토그램을 얻는 것입니다.

  • 영상 픽셀 값 u0이 연속 확률 밀도 함수 pu(u)를 갖는 랜덤 변수라고 가정합니다.

  • 그러면 랜덤 변수가 (0,1) 위에 균일하게 분포됩니다. (1)에서, v의 도함수는 다음과 같음


  • 변환에 의한 pv(v)와 pu(u)의 관계 적용

  • 즉, 변환된 pdf, pv(v)는 균일한 pdf를 가짐

  • ex1)


영상향상의 필요성

  • 여러 요인에 의한 광량조절 실패로 너무 어둡거나 밝은 저대조(low contrast)사진이 획득될 수 있음
  • 이 경우 영상의 화소(pixel) 밝기 값의 분포를 전체 밝기 범위에 고르게 분포시키는 히스토그램 평활화(HE, Histogram Equalization)처리를 수행하여 영상을 향상시킬 수 있음
  • 이 처리는 1960년대 말 미국 NASA의 JPL에서 최초로 시작한 영상처리 시초였음

hisogram이란? 각 화소의 밝기 값별 개수를 막대그래프로 표현한 것

  • 히스토그램 예
    • 나쁜 화질의 경우(좁은 범위의 밝기 값만 존재함)

  • 인간 시간에서는 흑색과 백색 사이의 구분 계조는 20단계 이하이므로 좁은 범위에 밝기 값이 분포하면 밝기 값 차이를 구분하기 어려움

    • 좋은 화질인 경우 (전체 범위에 고르게 분포함)

히스토그램 평활화

  • 영상의 히스토그램은 밝기 값의 분포를 잘 표현하고 있음

  • 좁은 범위에 분포된 화소 값 분포를 전체 밝기 값 영역에 고르게 분포되도록 변환하는 것을 히스토그램 평활화라고 함

  • 즉 영상의 (x,y)위치에서의 밝기 값 u를 변환함수(f(.))를 이용해 새로운 밝기 값 v로 점대점(point-to-point) 변환하는 것임

  • 직선 변환함수(클리핑) 예

    • 입력 영상의 한 화소의 밝기 값(u)을 새로운 값(v)로 변환하기 위한 가장 간단한 방법은 기울기가 1보다 큰 직선을 사용하는 것임
    • 여기서 a와 b는 입력 영상에 따라 다르게 나타나며 일반적으로 획득된 영상에서는 흑점과 백점이 빈번히 발생되기 때문에 화소 잡음에 민감하고 일관성이 결여되게 됨
    • 보통 a는 입력 영상의 최소 밝기 값, b는 최대 밝기 값

히스토그램의 누적 분포

  • 누적분포(CDF: Cumulative Distribution Function)는 분포 곡선을 누적한 그래프이며, 분포의 최소값에서 최대값까지 누적하면 최대 값에서의 누적분포 값은 전체 분포 개수가 됨

  • 예를 들어 크기가 100x100인 영상일 경우, 화소의 밝기 값 범위(0~255)에서 누적분포를 계산하면 밝기 값 255(최대값)에서는 전체 화소 수 10,000이 됨

  • 나쁜 화질 영상의 히스토그램 및 누적 분포 그래프

  • 동일한 영상에 대해 광량이 불균일하게 획득되었다면 비슷한 형태의 누적분포를 보이며, 이 누적분포를 변환함수로 이용한다면 일관성있는 변환 결과를 획득할 수 있음

  • 누적 분포 그래프를 이용한 변환

    • 입력 화소의 값이 CDF를 이용한 변환함수에 의해 새로운 값으로 변환된 후, 값이 점단위로 변경되면 0~255 범위에 고르게 분포된 결과를 얻을 수 있음

Nomalizaion 실습

	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);

Histogram Equalization

	//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![](https://velog.velcdn.com/images/ssonzm/post/94a7d1dd-606d-459d-821b-b58f58264814/image.png)
![](https://velog.velcdn.com/images/ssonzm/post/6db7ddec-c084-4d40-bb59-976f9e4d62d7/image.png)
] + 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]];

0개의 댓글