9.Image Histogram만들기 & GaussianBlur를 적용시킨 Histogram
히스토그램(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까지 데이터 값을 한눈에 알아볼수있어서 히스토그램은 편리한거 같습니다.