컴퓨터 비전에서
사진 이미지의 픽셀값 분포도를 보기 위한
가장 기초적인 방법
histogram을 살펴보자
이런 그림이 있다.(gray image)
기본적인 생각은 이렇다.
화면에서 gray영상이면 0 ~ 255 값을 가진다.
영상에서 행과 열을 돌면서 각 픽셀값에 해당하는 변수에 count를 해주면 된다.
그리고 그것을 그래프처럼 표현해서
영상이 어떤 픽셀 분포도를 가지고 있는지를 보는 것이다.
간단하지만 많이 쓰이는 방법이다~
참고합시다!!
#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("AVE256.raw","rb");
if(infile==NULL){printf("error!");return 0;}
fread(OrgImg, sizeof(char),256*256,infile);
fclose(infile);
for(i=0; i<256; i++) m_HistoArr[i]=0;
for(i=0; i<height; i++)
{
for(j=0; j<width; j++)
{
int gv = (int)OrgImg[i][j];
m_HistoArr[gv]++;
}
}
// 히스토그램 크기 정규화
vmin = 1000000; vmax =0;
for(i=0; i<256; i++)
{
if(m_HistoArr[i]<=vmin) vmin = m_HistoArr[i];
if(m_HistoArr[i]>=vmax) vmax = m_HistoArr[i];
}
//if(vmax==vmin) return;
float vd = (float)(vmax-vmin);
for(i=0; i<256; i++)
{
m_HistoArr[i] = (int)( ((float)m_HistoArr[i]-vmin)*255.0/ vd );
}
// 히스토그램의 출력
for(i=0; i<height; i++)
for(j=0; j<width; j++) OrgImg[i][j] = 255;
for(j=0; j<width; j++)
{
for(i=0; i<m_HistoArr[j]; i++) OrgImg[255-i][j] = 0;
}
FILE *outfile = fopen("result.raw","wb");
fwrite(OrgImg,sizeof(char),256*256,outfile);
fclose(outfile);
return 0;
}
결과는 이렇습니다.
화면이 전체적으로 어두우므로 0에 가까운 픽셀값에 가까운 곳에 count가 많이 되었네요
'Computer Vision' 카테고리의 다른 글
명암대비 히스토그램 스트레칭(contrast stretching) (0) | 2014.06.11 |
---|---|
히스토그램 평활화(Histogram Equalization) (3) | 2014.06.09 |
보간(Interpolation)이란 (0) | 2014.04.09 |
openCV를 사용한 그림자 합성 shadow add shadow sum (0) | 2014.03.13 |
openCV를 사용한 그림자 threshold 그림자 뽑아내기 (0) | 2014.03.13 |