Computer Vision

명암대비 히스토그램 스트레칭(contrast stretching)

익플루 2014. 6. 11. 19:38
반응형

히스토그램 스트레칭도
히스토그램 평활화와 마찬가지로 특정 밝기 영역에 영상픽셀의 밝기값이
집중되어 있는 것을 퍼트려 가시도를 좋게하는 방법이다.

 

 

 

다음과 같은 영상이 있다.(왼쪽그림)

               LONDON256.RAWresult_streching_b.raw

 

이 영상의 히스토그램은 오른쪽 그림과 같다.

우리는 명암대비 히스토그램 스트레칭을 구현하여 이 영상의 가시도를 높여볼 것이다.

 

 

 

#include <math.h>
#include <windows.h>
#include <stdio.h>
using namespace std;


int main()
{
 
 int height= 256;
 int width=256;
 int i,j,vmax,vmin;
 int m_HistoArr[256];
 unsigned char OrgImg[256][256];
 

 FILE *infile= fopen("LONDON256.raw","rb");
 if(infile==NULL){printf("error!");return 0;}
 fread(OrgImg, sizeof(char),256*256,infile);
 fclose(infile);
  

 int lowvalue=255, highvalue=0;

 // 밝기값이 가장 작은값 선정
 for(i=0; i<height; i++)
 {
  for(j=0; j<width; j++) if(OrgImg[i][j]<lowvalue) lowvalue = OrgImg[i][j];
 }

 // 밝기값이 가장 큰값 선정
 for(i=0; i<height; i++)
 {
  for(j=0; j<width; j++) if(OrgImg[i][j]>highvalue) highvalue = OrgImg[i][j];
 }

 // Histogram스트레칭 계산
 float mult = 255.0f/(float)(highvalue-lowvalue);
 for(i=0; i<height; i++)
 {
  for(j=0; j<width; j++)
   OrgImg[i][j] = (unsigned char)((OrgImg[i][j]-lowvalue)*mult);
 }


 FILE *outfile = fopen("result.raw","wb");
 fwrite(OrgImg,sizeof(char),256*256,outfile);
 fclose(outfile);
 

 return 0;
}

 

 

 

 

기본적인 생각은 이렇다.

영상에서 픽셀값중 밝기값이 가장 작은 값(lowvalue)을 찾고
또한 가장 높은 값(highvalue)을 찾고 그 값의 차를 구한다.

그리고 그 값으로 255를 나눈다 (255는 그레이영상에서 가장밝은색 흰색)

mult = 255.0f/(float)(highvalue-lowvalue);

그리고 원래 본 영상에서 모든 픽셀에서 lowvalue 만큼 빼고 mult를 곱한다.

mult의 scale만큼 히스토그램의 분포도 사이사이를 떨어뜨려 놓기 위함이다.

밑의 이미지는 히스토그램 스트레칭을 한 결과이다.(왼쪽)

               result_streching.rawresult_streching_a.raw

 

우리가 구했던 mult 만큼의 간격이 벌어진 히스토그램을 볼수 있다(오른쪽 그림)

 

흐릿한 느낌이었던 전 이미지에비해 명암대비가 높아졌다.

 

 

 

tip. 스트레칭과 평활화의 비교

스트레칭은 히스토그램 평활화와 비교할 때 단순히 영상 내 픽셀 밝기의 최소, 최대값의 비율을 이용해 고정된 비율로 영상을 낮은 밝기와 높은 밝기로 당겨준 것에 불과하다. 히스토그램이 펼쳐진 효과는 평활화 처리에서 훨씬 크다.

 

 

 

 

 

 

 

 

 

반응형