Computer Vision

히스토그램(histogram building)

익플루 2014. 6. 6. 14:00
반응형

컴퓨터 비전에서
사진 이미지의 픽셀값 분포도를 보기 위한
가장 기초적인 방법
histogram을 살펴보자

 

 

 

 

 

이런 그림이 있다.(gray image)

AVE256.RAW

 

 

기본적인 생각은 이렇다.

화면에서 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;
}

 

result.raw

 

결과는 이렇습니다.

화면이 전체적으로 어두우므로 0에 가까운 픽셀값에 가까운 곳에 count가 많이 되었네요

 


반응형