히스토그램 스트레칭도
히스토그램 평활화와 마찬가지로 특정 밝기 영역에 영상픽셀의 밝기값이
집중되어 있는 것을 퍼트려 가시도를 좋게하는 방법이다.
다음과 같은 영상이 있다.(왼쪽그림)
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. 스트레칭과 평활화의 비교
스트레칭은 히스토그램 평활화와 비교할 때 단순히 영상 내 픽셀 밝기의 최소, 최대값의 비율을 이용해 고정된 비율로 영상을 낮은 밝기와 높은 밝기로 당겨준 것에 불과하다. 히스토그램이 펼쳐진 효과는 평활화 처리에서 훨씬 크다.
'Computer Vision' 카테고리의 다른 글
박스 스무딩(Box smoothing) (0) | 2014.06.25 |
---|---|
가우시안 스무딩(gaussian smoothing) (1) | 2014.06.12 |
히스토그램 평활화(Histogram Equalization) (3) | 2014.06.09 |
히스토그램(histogram building) (12) | 2014.06.06 |
보간(Interpolation)이란 (0) | 2014.04.09 |