히스토그램을 이용한 영상 처리

1. 소개
히스토그램이란 영상의 밝기값에 대한 분포를 보여주는 그래프로 영상분석을 위한 중요한 도구이다. 입력되는 영상의 히스토그램을 분석함으로써 영상의 밝기 구성, 명암의 대비등에 대한 정보를 알 수 있으며 이러한 분석정보를 이용하여 영상개선 및 화질 향샹을 위한 출발점으로 사용할 수 있다.

2. 히스토그램의 용도

  • 화질 향상
    히스토그램의 조작을 통해 사람이 훨씬 알아보기 좋은 선명한 화질의 영상을 만드는 것이 가능하다. 사람의 눈은 영상의 밝기보다 대비에 훨씬 민감하다는 특징을 이용하여 히스토그램을 펼친 조작을 행하여 선명한 사진으로 만들 수 있다.
  • 물체 인식
    공장자동화용 영상 처리는 자동화용 카메라를 이용하여 획득한 영상 정보를 해석하여 생산공정에 놓여 있는 물건의 결함을 검사하거나 형상을 인식하기 위해 많이 사용되고 있다. 자동화용 영상 처리는 검사를 위한 조명을 제어하기가 용이하므로 영상 이치화를 통한 물체분리를 많이 사용한다. 이때 히스토그램의 형태를 분석하여 영상 이치화를 수행한다.
    사용자 삽입 이미지위의 그림은 동전의 크기를 인식하여 동전을 분류하기 위한 영상처리의 예를 보여주고 있다. 이때 선결할 과제는 영상 내에서 동전을 뒤의 배경부분과 분리하는 일이 된다. 이때 영상을 이치화시키는것이 필요하게 된다. 원본 입력영상은 밝기값이 0~255 사이의 값이므로 임의의 상수 기준값을 하나 잡아서 이 값보다 밝기값이 작은것은 0으로, 큰 것은 255로 바꾸어주는 처리를 하는 것이 필요하다. 위의 그림 (b)는 기준값을 80으로 하였을때의 이치화된 영상을 나타내고 있다. 이때, 상수 기준값을 임계치라고 한다. 그림 (c)는 이치화된 영상을 이용하여 동전을 배경에서 분리하여 인식한 예를 보여주고 있다. 각각의 영역이 서로 다른 밝기값으로 나타나므로 임의의 한 동전 영역만 분리가 가능하다.높이와 너비 픽셀의 크기를 가지는 영상에 대한 영상 이치화 계산은 아래의 코드를 이용한다. 임계치 상수 T를 이용하여 원 영상 InImg를 이치화 영상 OutImg로 바꾸어 준다.

    for (i = 0; i < height; ++i)
    {
        for (j = 0; j < width; ++j) OutImg[i][j] = InImg[i][j] > T ? 255 : 0;
    }

    임계치의 값을 어떻게 선정하는가는 물체 분리의 어려움을 결정한다. 아래 그림의 경우 잘못된 임계치의 선정으로 동전이 배경에 묻혀버리는 경우를 보여주고 있다. 이때 영상 히스토그램이 사용된다. 동전의 히스토그램을 살펴보면 다음과 같은 형상이 나타난다. 일반적으로 영상에서 물체 내부의 밝기값은 유사한 크기의 밝기 분포를 가지고 있다. 마찬가지로 배경의 밝기값도 크기는 다르지만 또 다른 유사한 밝기값을 가지므로 밝기의 빈도를 나타내는 히스토그램에서 두 개의 산과 하나의 계곡으로 나타난다. 이러한 산과 계곡의 값을 분석한다면 정확한 배경 분리가 가느하게 된다.
    사용자 삽입 이미지

3. 히스토그램 평활화
명암 값의 분포가 한쪽으로 치우치거나 균일하지 못한 영상은 히스토그램 평할화라고 불리는 처리에 의해 명암 값의 분포의 균일화로 영상이 향상될 수 있다. 히스토그램 평활화의 궁금적인 목적은 일정한 분포를 가진 히스토그램을 생성하는 것이다. 따라서 평활화를 수행한 히스토그램은 보다 균일한 분포를 가질 것이다. 다시 말해 한곳에 집중되어 있는 명암 값을 펼쳐서 명암 값이 균일한 분포를 갖도록 하는 것이다. 비유를 들자면 접혀있는 부채를 펼치는 것과 같다고 볼 수 있을 것이다.

단지 부채를 펼치는 것으로 더하거나 뺌 없이 있는 것을 그대로 펼치면 되는 것이다. 그로 얻어지는 결과는 어두운 영상은 밝아지고 너무 밝은 영상은 조금 어두워져 적당한 명도 값을 유지하게 된다. 그러므로 히스토그램 평활화는 영상이 어두운 영역에서 세밀한 부분을 가질 경우 효과적으로 수행된다. 즉, 변환 후의 명도 값 분포를 수정함으로써 영상 전체적인 콘트라시트 밸런스가 좋게 개선된다.

 

히스토그램 펼활화를 구현하려면 다음과 같이 3단계를 거친다.

  1. 히스토그램을 이용한 명도 값의 빈도 수를 계산한다.
  2. 구한 빈도 수를 이용하여 축적 히스토그램 값을 구하고 정규화시킨다.
  3. 정규화된 축적 히스토그램을 그레이 스케일 사상 함수로 이용하여 그레이 레벨 값을 매핑한다.

다시 말하면 히스토그램 평활화는 정규화된 축적 히스토그램을 그레이 스케일 매핑 함수로 이용하여 구현하는 것이다.

한 가지씩 짚고 넘어 가도록 하자! 첫 번째 “히스토그램을 계산한다”는 말은 한 이미지 안에 존재하는 명도 값을 카운트하는 것이다. 예를 들면 명도 값이 256 그레이 레벨 영상에서 명도 값 0이 몇개인지, 명도 값 100이 몇 개인지, 이와같이 각 명도값의 빈도수를 조사하는 것이다.

 

두 번째로 축적 히스토그램이라는 말은 첫 번째에서 구한 명암 값의 빈도수를 계속 더해나가 축적하는 방법이다. 예를들면 명도 값 1에서의 축적 히스토그램은 명도값 0의 빈도수와 명도값 1의 빈도수를 더한 값이 된다. 마찬가지로 명도 값 255에서의 축적 히스토그램은 명도 값 0, 1, 2, … 255까지의 빈도수를 모두 더한값이 된다. 이렇게 구해진 축적 히스토그램은 다음 식에 의해 정규화된다.

Ki = Gmax / Ni * H(i)

여기서 Ni는 영상에서의 픽셀의 총 개수이고, Gmax는 명도의 최대 값이고(여기서는 256 그레이 레벨 이미지를 사용하였으므로 256이다) H(i)는 위에서 구한 축적 히스토그램이다. 물론 Ki는 정규화된 값 즉, 변환된 영상의 값인 겻이다.

아래 그림은 히스토그램 평활화의 3단계를 도식화한 것이다.
사용자 삽입 이미지
4. 명암대비 히스토그램 스트레칭
특정밝기 영역에 영상픽셀의 밝기값이 집중되어 있으면 영상의 가시도가 좋지 않다. 예를들면 전체적으로 어두워 보이거나 밝아보이는 영상 또는 특정 부분의 밝기 영역에 히스토그램이 집중되는 영상등이다. 이러한 형상은 영상의 명암 대비를 통해 알 수 있으며 높은 명암 대비를 가진 영상은 어둡거나 밝은 영역을 골고루 포함하고 있으나 그렇지 않은 영상은 특정 영역에만 밝기가 몰려 있게 되는 것이다.
사용자 삽입 이미지위의 영상들은 낮은 명암 대비와 높은 명암 대비를 가진 두 영상의 밝기 히스토그램을 비교하여보여준다. 그림 (a)는 처리할 원시 영상이고 그림 (b)와 (c)는 히스토그램을 펼쳐서 처리한 영상들을 보여준다. 어즈쪽 영상이 알아보기 좋은가. 당연히 원 영상보다는 명암대비가 좋고 밝기가 골고루 분포되어 있는 영상 쪽일 것이다. 명암대비 스트레칭은 낮은 명암대비 영상의 명암값 분포의 히스토그램을 펼쳐서 보다 넓은 영역으로 명암값 분포를 갖게 하기 위한 방법이다. 그림 (a)의 원 영상과 비교하면 (b), (c) 두 영상 모두 히스토그램이 펼쳐져 있음을 알 수 있다.

  • 히스토그램 스트레칭 공식

    새로운 픽셀값 = (이전 픽셀 - 최소 픽셀) / (최대 픽셀 - 최소 픽셀) * 255
  • 스트레칭과 평활화의 비교
    스트레칭은 히스토그램 평활화와 비교할 때 단순히 영상 내 픽셀의 최소/최대값의 비율을 이용하여 고정된 비율로 영상을 낮은 밝기와 높은 밝기로 당겨준 것에 불과하다. 히스토그램이 펼쳐진 효과는 평활화 처리에서 훨씬 큼을 알 수 있다.

5. 개선된 명암대비 히스토그램 스트레칭
단순한 히스토그램 스트레칭은 특정밝기 영역에만 픽셀명암이 집중된 경우는 효과가 있지만 아래 식에서 알 수 있는 것처럼 만일 원본 입력영상내에서 Low가 0이고 High가 255인 픽셀이 존재한다면 스트레칭의 효과가 떨어지게 된다. 이러한 경우에 사용할 수 있는 방법이 엔드인 탐색법(ends-in search)이다.
사용자 삽입 이미지엔드인 탐색법은 두 개의 입력값을 사용자가 지정해 주어야 하는데, 전체 픽셀의 수에 대해 0의 밝기값과 255의 밝기값으로 두 픽셀의 퍼센트(%)를 지정해야 한다. 퍼센트를 지정하게 되면 위의 식의 Low값과 High 값이 결정되게 되므로 스트레칭 연산이 가능하게 된다. 즉, 영상 내 픽셀 중에서 값을 0과 255의 값으로 만들어 버릴 픽셀의 비율을 미리 정해 주자는 것이다.
사용자 삽입 이미지위의 그림은 개선된 스트레칭과 일반적 스트레칭의 비교를 보여준다.

스트레칭에서 0과 255의 값으로 두 픽셀의 비율을 각각 20%로 주었다. 처리 후, 영상내에 존재하는 픽셀의 40%는 0이거나 255의 값을 가져야 한다. 그림 (c)에서 처리 결과 영상에 대한 히스토그램을 보면 0과 255의 값에 높은 빈도의 히스토그램이 나타남을 알 수 있다. 상하한 비율을 각각 20%로 했을때 COIN 영상의 경우 39 이하의 밝기값을 가지는 픽셀들은 모두 0으로 변환되고, 77 이상의 밝기값의 화소들은 모두 255로 변환된다. 39와 77의 중간 밝기값의 화소들은 일반 스트레칭처럼 처리된다.6. 로그를 이용한 히스토그램 계산
히스토그램을 기준으로 평활화와 스트레칭과 비슷한 연산으로 로그 함수를 이용한 명암도를 일괄적으로 개선할 수 있다. 로그 함수의 계수에 따라 밝기 값 변화 정도가 급격한 그래피를 나타낸다.

아래 그림은 로그 함수를 나타낸 것으로 밝기값의 변화 그래프로 생각할 수 있다. 옆의 식은 로그 함수를 이용하기 위한 수식이다.
사용자 삽입 이미지아래 그림은 명암 값이 빈약한 영상을 로그 함수를 이용하여 개선한 영상을 나타낸다. 전체적으로 어두운 명암도를 가진 영상은 로그함수를 통하여 전체적으로 밝기값을 향상시킬 수 있다.
사용자 삽입 이미지
7. 히스토그램 지정
히스토그램 지정이란 원본 영상을 처리한 결과 영상의 히스토그램 모양이 우리가 원하는대로 나오도록 임의로 지정하는 것이다. 히스토그램 지정은 두 단계를 거쳐 수행된다.
(1) 입력 영상의 정규화합 히스토그램을 계산한다.
(2) 입력 영상의 정규화합 히스토그램과 지정한 히스토그램의 정규화합 히스토그램을 이용하여
입력영상의 값을 변환한다.
사용자 삽입 이미지
위의 그림 (a)는 처리할 입력 영상으로 목성을 찍은 사진이다. 아래부분에 입력영상에 대한 히스토그램이 나타나 있다. 목성 배경의 밝기는 0이므로 0인 픽셀의 밝기값은 배제하고 나머지 밝기값에 대한 히스토그램만을 보여주고 있다. 영상 구성 픽셀값은 밝기가 높은 부분에 집중되어 있어 가시화가 떨어질을 알 수 있다. 그림 (b) 영상은 또 다른 상황에서 찍은 사진으로 가시화가 좋은 상태에서 획득한 목성 영상의 하나를 보여준다. 이 영상의 히스토그램을 보면 중간 밝기 부분에 구성 픽셀의 값이 집중되어 있음을 알 수 있다. 즉, 가시화가 좋은 상태의 목성 히스토그램 분포는 이처럼 나타남을 예산한다고 하자. 이때, 원 입력 영상의 히스토그램을 그림 (b) 영상의 히스토그램처럼 만들면 가시도가 개선되지 않을까 하는 생각을 할 수 있다.

이러한 영상처리가 히스토그램 지정이다. 즉, 변형 영상의 히스토그램 모양을 직접 미리 지정하는 것이다. 그림 (b)처럼 결과 영상의 히스토그램을 지정한 후, 처리를 행하면 원 입력 영상은 그림 (c) 처럼 개선된 영상으로 바뀌게 되고 히스토그램은 지정한 그림 (b)에 유사한 히스토그램을 주게 된다.

7.1. 히스토그램 지정연산의 원리
사용자 삽입 이미지그림 (a)는 입력된 영상의 히스토그램이고, 그림 (b)는 우리가 원하는 모양으로 지정한 히스토그램이라 하자. 이때 그림 (c)와 그림 (d)는 각각 그림 (a)와 그림 (b)에 대응되는 정규화합 히스토그램이다. 이 두 정규화합 히스토그램을 이용하여 영상변환을 수행한다. 그림 (c)의 명암값 0에서 히스토그램 값은 4이고, 이 값은 그림 (d)의 밝기 1에 대한 히스토그램 값 5에 가장 가깝다. 따라서, 입력 영상에서 0의 밝기값은 출력 영상에서 1로 변환된다. 그림 (c)에서 명암값 2에 대응하는 히스토그램값은 20이고 이 값에 가장 가까운 그림 (d)에서의 값은 명암값 5에서 21에 대응된다. 따라서, 입력 영상의 2의 밝기값은 출력영상에서 5로 변환된다. 이러한 방식으로 입력 영상의 픽셀들을 모두 변환하면 히스토그램 지정 연산이 완료된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다