When will you grow up?

9.Image Histogram만들기 & GaussianBlur를 적용시킨 Histogram 본문

02. Study/Computer Vision(openframworks&opencv)

9.Image Histogram만들기 & GaussianBlur를 적용시킨 Histogram

미카이 2016. 9. 23. 16:47

히스토그램(Histogram)?

->데이터의 특징을 한 눈에 관찰하기 쉽도록 빈도수에 따라 표현한 그래프 이다.


void calcHist(const Mat * image,


int nimages,            //소스이미지 갯수

const int * channels, //사용될 채널 리스트

InputArray mask,     //마스크 이미지-옵션

OutputArray hist,    //출력

int dims,               //몇차원?

const int* histSize,  //히스토그램 사이즈 array

const float** ranges,//차원의 경계 array

bool uniform = true,//균일 여부를 결정하는 flag

bool accumulate = false//축적 여부를 결정하는 flag

};

원형은 위와 같다. 하지만 이 caclHist함수를 이용하지않고 

그려볼 예정입니다.


for (int i = 0; i < InImage.rows; i++)

{

for (int k = 0; k < InImage.cols; k++)

{

Vec3b pixel2 = InImage.at<Vec3b>(i, k);

for (int b = 0; b < 3; b++)

{

for (int y = 0; y < 256; y++)

{

if ((unsigned int)pixel2[0] == y)

{

histoB[y]++;

}

if ((unsigned int)pixel2[1] == y)

{

histoG[y]++;

}

if ((unsigned int)pixel2[2] == y)

{

histoR[y]++;

}

}

}

}

}


for문을 돌아 현재 이미지 사이즈 만큼 돌며 각 픽셀값의 값을 추출해 내며 RGB배열에 각각 담슴니다.



for (int i = 0; i < 256; i++)

{

line(R_src, cvPoint(i, 400+i), cvPoint(i, histoR[i]), CV_RGB(255, 0, 0));

}

imshow("R", R_src);


for (int i = 0; i < 256; i++)

{

line(G_src, cvPoint(i, 400 + i), cvPoint(i, histoG[i]), CV_RGB(0, 255, 0));

}

imshow("G", G_src);

for (int i = 0; i < 256; i++)

{

line(B_src, cvPoint(i, 400 + i), cvPoint(i, histoB[i]), CV_RGB(0, 0, 255));

}

imshow("B", B_src);


그리고 출력 부분에서 opencv line함수를 이용하여 각각 초기위치부터 돌면서 그래프를 표현 합니다.

이때 400으로 값은이유는 왼쪽상단이 (0,0) 인데 이것을 아래방향으로 맞춰주기 위해서 반대로 돌림니다.

이미지 크기는 400 * 400 입니다.



위사진은 원본이미지 데이터를 RGB 색상으로 각각 뽑아냈을경우





GaussianBlur를 적용시킨후 Histogram으로 뽑아냈을경우



이 GaussianBlur는 이 앞장에 블로그 포스팅이 잘되어있는 글을 담아와 사용했습니다.


0~255까지 데이터 값을 한눈에 알아볼수있어서 히스토그램은 편리한거 같습니다.

Comments